Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Apr 2021 18:20:07 GMT
From:      Michael Reifenberger <mr@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: dcc2fb370791 - main - systat: Avoid incorrect reallocation in pigs.c
Message-ID:  <202104211820.13LIK7Wi046431@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by mr:

URL: https://cgit.FreeBSD.org/src/commit/?id=dcc2fb3707919c5184480d8cbde98d16f24a3945

commit dcc2fb3707919c5184480d8cbde98d16f24a3945
Author:     Michael Reifenberger <mr@FreeBSD.org>
AuthorDate: 2021-04-21 18:09:21 +0000
Commit:     Michael Reifenberger <mr@FreeBSD.org>
CommitDate: 2021-04-21 18:09:21 +0000

    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
 	 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202104211820.13LIK7Wi046431>