From: Karel Zak Date: Mon, 18 May 2020 11:34:55 +0000 (+0200) Subject: lib/strutils: fix parse_size() for large numbers X-Git-Tag: v2.36-rc1~94 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=191836bec292547393e8dd5e8d5148e8dbfa210b;p=thirdparty%2Futil-linux.git lib/strutils: fix parse_size() for large numbers For example ./test_strutils --size '1.0000000000000000000000000000018000000000000000010M' ./test_strutils --size '1.18446744073709551615M' ends with infinite loop due to frac_div variable overflow. Addresses: https://github.com/karelzak/util-linux/issues/1023 Signed-off-by: Karel Zak --- diff --git a/lib/strutils.c b/lib/strutils.c index 609ef08600..ce8799dd1d 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -173,13 +173,23 @@ check_suffix: /* maximal divisor for last digit (e.g. for 0.05 is * frac_div=100, for 0.054 is frac_div=1000, etc.) + * + * Reduce frac if too large. */ - while (frac_div < frac) - frac_div *= 10; + while (frac_div < frac) { + if (frac_div <= UINTMAX_MAX/10) + frac_div *= 10; + else + frac /= 10; + } /* 'frac' is without zeros (5 means 0.5 as well as 0.05) */ - for (i = 0; i < frac_zeros; i++) - frac_div *= 10; + for (i = 0; i < frac_zeros; i++) { + if (frac_div <= UINTMAX_MAX/10) + frac_div *= 10; + else + frac /= 10; + } /* * Go backwardly from last digit and add to result what the