]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/strutils: fix parse_size() for large numbers
authorKarel Zak <kzak@redhat.com>
Mon, 18 May 2020 11:34:55 +0000 (13:34 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 18 May 2020 11:34:55 +0000 (13:34 +0200)
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 <kzak@redhat.com>
lib/strutils.c

index 609ef08600fd8b6c4e687655432d491b5bc6f681..ce8799dd1d059b5c94ce85e0cee03d06ca74bf49 100644 (file)
@@ -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