]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
humanize_number(3): fix math edge case in rounding large numbers
authorrobak <robak@FreeBSD.org>
Thu, 28 Dec 2017 22:57:34 +0000 (22:57 +0000)
committerrobak <robak@FreeBSD.org>
Thu, 28 Dec 2017 22:57:34 +0000 (22:57 +0000)
commita9b02c6e961e94f18e27a02e8d8427dadf966fac
treebf614065f9505a3ad46a171966b713ef72135836
parentd50d0b2935fc55f07efb07e76522a7a6bcce741d
humanize_number(3): fix math edge case in rounding large numbers

Fix for remainder overflow, when in rare cases adding remainder to divider
exceeded 1 and turned the total to 1000 in final formatting, taking up
the space for the unit character.

The fix continues the division of the original number if the above case
happens -- added the appropriate check to the for loop performing
the division. This lowers the value shown, to make it fit into the buffer
space provided (1.0M for 4+1 character buffer, as used by ls).

Add test case for the reported bug and extend test program to support
providing buffer length (ls -lh uses 5, tests hard-coded 4).

PR: 224498
Submitted by: Pawel Biernacki <pawel.biernacki@gmail.com>
Reported by: Masachika Ishizuka <ish@amail.plala.or.jp>
Reviewed by: cem, kib
Approved by: cem, kib
MFC after: 1 week
Sponsored by: Mysterious Code Ltd.
Differential Revision: D13578
lib/libutil/humanize_number.3
lib/libutil/humanize_number.c
lib/libutil/tests/humanize_number_test.c