[procps] free's scale_size broken with 32-bit long

  • From: Adam Sampson <ats@xxxxxxxxx>
  • To: procps@xxxxxxxxxxxxx
  • Date: Tue, 3 Apr 2018 00:36:54 +0100

Hi procps-ers,

In 3.3.13, on an IA32 machine with 8GB swap, the "free with -k/-m/...
argument" tests fail, because scale_size produces incorrect results:

$ grep SwapTotal /proc/meminfo 
SwapTotal:       8388604 kB
$ ./free
              total        used        free      shared  buff/cache   available
...
Swap:       8388604           0     8388604
$ ./free -k
              total        used        free      shared  buff/cache   available
...
Swap:       4194300           0     4194300

In this expression within scale_size, introduced when fixing #45:

     (long int)((size * 1024) / power(base, args.exponent-1))

size is an unsigned long, so on a platform like IA32 with 32-bit longs
the multiplication will overflow when the quantity is 8GB. Changing 1024
to 1024.0 fixes it.

(That line's also indented with spaces rather than tabs like the rest of
the file.)

Thanks,

-- 
Adam Sampson <ats@xxxxxxxxx>                         <http://offog.org/>

Other related posts:

  • » [procps] free's scale_size broken with 32-bit long - Adam Sampson