From dcc2fb3707919c5184480d8cbde98d16f24a3945 Mon Sep 17 00:00:00 2001 From: Michael Reifenberger Date: Wed, 21 Apr 2021 20:09:21 +0200 Subject: [PATCH] systat: Avoid incorrect reallocation in pigs.c Stop free() even if kvm_getprocs as we can come back but set nprocs = 0. Check nprocs in showpigs() to ensure not try displaying with kvm_getprocs failed. Current code can have pt with non-null after kvm_getprocs() failure. Replace to realloc for simpler operations. Submitted by: Yoshihiro Ota ota@j.email.ne.jp Reviewed by: mckusick@ Differential Revision: https://reviews.freebsd.org/D29303 --- usr.bin/systat/pigs.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/usr.bin/systat/pigs.c b/usr.bin/systat/pigs.c index d9f3f8d4ad14..0bec6aceaaa1 100644 --- a/usr.bin/systat/pigs.c +++ b/usr.bin/systat/pigs.c @@ -62,7 +62,7 @@ static int nproc; static struct p_times { float pt_pctcpu; struct kinfo_proc *pt_kp; -} *pt; +} *pt = NULL; static int fscale; static double lccpu; @@ -90,7 +90,7 @@ showpigs(void) const char *uname, *pname; char pidname[30]; - if (pt == NULL) + if (nproc == 0) return; qsort(pt, nproc, sizeof (struct p_times), compar); @@ -146,23 +146,20 @@ fetchpigs(void) float ftime; float *pctp; struct kinfo_proc *kpp; - static int lastnproc = 0; + static int maxnproc = 0; if ((kpp = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc)) == NULL) { error("%s", kvm_geterr(kd)); - if (pt) - free(pt); + nproc = 0; return; } - if (nproc > lastnproc) { - free(pt); - if ((pt = - malloc(nproc * sizeof(struct p_times))) == NULL) { + if (nproc > maxnproc) { + if ((pt = realloc(pt, nproc * sizeof(*pt))) == NULL) { error("Out of memory"); die(0); } + maxnproc = nproc; } - lastnproc = nproc; /* * calculate %cpu for each proc */