Hi tech@,

Maybe it is need to check sysctl return value in usr.bin/systat/pigs.c.
E.g., in read_pg() function:

        ......
        size = sizeof(ctimes);
        sysctl(cp_time_mib, 2, &ctimes, &size, NULL, 0);

        t = 0;
        for (i = 0; i < CPUSTATES; i++)
                t += ctimes[i] - stime[i];
        ......

If sysctl() failed, the values in ctimes are indeterminate. Apologize if
I am wrong. Thanks!

Index: pigs.c
===================================================================
RCS file: /cvs/src/usr.bin/systat/pigs.c,v
retrieving revision 1.30
diff -u -p -r1.30 pigs.c
--- pigs.c      12 Sep 2015 15:59:36 -0000      1.30
+++ pigs.c      4 May 2018 05:14:13 -0000
@@ -183,7 +183,8 @@ read_pg(void)
         * and for the imaginary "idle" process
         */
        size = sizeof(ctimes);
-       sysctl(cp_time_mib, 2, &ctimes, &size, NULL, 0);
+       if (sysctl(cp_time_mib, 2, &ctimes, &size, NULL, 0) < 0)
+               return 1;

        t = 0;
        for (i = 0; i < CPUSTATES; i++)
@@ -234,13 +235,16 @@ initpigs(void)
        fixpt_t ccpu;

        size = sizeof(stime);
-       sysctl(cp_time_mib, 2, &stime, &size, NULL, 0);
+       if (sysctl(cp_time_mib, 2, &stime, &size, NULL, 0) < 0)
+               return (-1);

        size = sizeof(sysload);
-       sysctl(sysload_mib, 2, &sysload, &size, NULL, 0);
+       if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0)
+               return (-1);

        size = sizeof(ccpu);
-       sysctl(ccpu_mib, 2, &ccpu, &size, NULL, 0);
+       if (sysctl(ccpu_mib, 2, &ccpu, &size, NULL, 0) < 0)
+               return (-1);

        lccpu = log((double) ccpu / sysload.fscale);


-- 
Best Regards
Nan Xiao

Reply via email to