The branch main has been updated by mr:

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

commit dcc2fb3707919c5184480d8cbde98d16f24a3945
Author:     Michael Reifenberger <[email protected]>
AuthorDate: 2021-04-21 18:09:21 +0000
Commit:     Michael Reifenberger <[email protected]>
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 [email protected]
    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
         */
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to