Hi Jeremie,

Yes, you are right. I modify the code which assumes if sysctl successes,
the sysload.fscale should not be 0. So this patch only handles sysctl
function failed case:

Index: machine.c
===================================================================
RCS file: /cvs/src/usr.bin/top/machine.c,v
retrieving revision 1.90
diff -u -p -r1.90 machine.c
--- machine.c   14 May 2018 12:31:21 -0000      1.90
+++ machine.c   25 May 2018 01:12:20 -0000
@@ -282,8 +282,11 @@ get_system_info(struct system_info *si)
        }

        size = sizeof(sysload);
-       if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0)
+       if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0) {
                warn("sysctl failed");
+               bzero(&sysload, sizeof(sysload));
+               sysload.fscale = 1;
+       }
        infoloadp = si->load_avg;
        for (i = 0; i < 3; i++)
                *infoloadp++ = ((double) sysload.ldavg[i]) / sysload.fscale;



Thanks!

On 5/24/2018 7:54 PM, Jeremie Courreges-Anglas wrote:
> On Tue, May 22 2018, Nan Xiao <n...@chinadtrace.org> wrote:
>> Hi tech@,
>>
>> Below is the patch of resetting sysload if sysctl call failed in
>> usr.bin/top/machine.c, otherwise the memory of sysload is undetermined.
>> (The same process as uvmexp and bcstats).
>>
>> Index: machine.c
>> ===================================================================
>> RCS file: /cvs/src/usr.bin/top/machine.c,v
>> retrieving revision 1.90
>> diff -u -p -r1.90 machine.c
>> --- machine.c        14 May 2018 12:31:21 -0000      1.90
>> +++ machine.c        22 May 2018 09:49:39 -0000
>> @@ -282,8 +282,10 @@ get_system_info(struct system_info *si)
>>      }
>>
>>      size = sizeof(sysload);
>> -    if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0)
>> +    if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0) {
>>              warn("sysctl failed");
>> +            bzero(&sysload, sizeof(sysload));
>> +    }
>>      infoloadp = si->load_avg;
>>      for (i = 0; i < 3; i++)
>>              *infoloadp++ = ((double) sysload.ldavg[i]) / sysload.fscale;
> 
> This line of code should not run if sysload.fscale == 0.
> 

-- 
Best Regards
Nan Xiao

Reply via email to