Addresses: https://github.com/karelzak/util-linux/issues/998
Signed-off-by: Karel Zak <kzak@redhat.com>
/* round */
if (frac) {
/* get 3 digits after decimal point */
- frac = (frac * 1000) / (1ULL << exp);
+ if (frac >= UINT64_MAX / 1000)
+ frac = ((frac / 1024) * 1000) / (1ULL << (exp - 10)) ;
+ else
+ frac = (frac * 1000) / (1ULL << (exp)) ;
if (options & SIZE_DECIMAL_2DIGITS) {
/* round 4/5 and keep 2 digits after decimal point */
0 : 0 : 0B : 0 B : 0 B
1 : 1 : 1B : 1 B : 1 B
123 : 123 : 123B : 123 B : 123 B
- 18446744073709551615 : 18446744073709551615 : 15E : 15 EiB : 15.01 EiB
+ 18446744073709551615 : 18446744073709551615 : 16E : 16 EiB : 16 EiB
1K : 1024 : 1K : 1 KiB : 1 KiB
1KiB : 1024 : 1K : 1 KiB : 1 KiB
1M : 1048576 : 1M : 1 MiB : 1 MiB