]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
Import fmt_scaled.c rev 1.16 from OpenBSD.
authorDarren Tucker <dtucker@zip.com.au>
Wed, 29 Mar 2017 05:34:44 +0000 (16:34 +1100)
committerDarren Tucker <dtucker@zip.com.au>
Wed, 29 Mar 2017 05:34:44 +0000 (16:34 +1100)
Fix overly-conservative overflow checks on mulitplications and add checks
on additions.  This allows scan_scaled to work up to +/-LLONG_MAX (LLONG_MIN
will still be flagged as a range error).  ok millert@

openbsd-compat/fmt_scaled.c

index 8af866016063f90846fc26cadf85fb015b572977..7c5193e26d959d0f5846537a472fa718624c7f56 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: fmt_scaled.c,v 1.15 2017/03/15 05:25:56 dtucker Exp $ */
+/*     $OpenBSD: fmt_scaled.c,v 1.16 2017/03/16 02:40:46 dtucker Exp $ */
 
 /*
  * Copyright (c) 2001, 2002, 2003 Ian F. Darwin.  All rights reserved.
@@ -125,22 +125,30 @@ scan_scaled(char *scaled, long long *result)
                                /* ignore extra fractional digits */
                                continue;
                        fract_digits++;         /* for later scaling */
-                       if (fpart >= LLONG_MAX / 10) {
+                       if (fpart > LLONG_MAX / 10) {
                                errno = ERANGE;
                                return -1;
                        }
                        fpart *= 10;
+                       if (i > LLONG_MAX - fpart) {
+                               errno = ERANGE;
+                               return -1;
+                       }
                        fpart += i;
                } else {                                /* normal digit */
                        if (++ndigits >= MAX_DIGITS) {
                                errno = ERANGE;
                                return -1;
                        }
-                       if (whole >= LLONG_MAX / 10) {
+                       if (whole > LLONG_MAX / 10) {
                                errno = ERANGE;
                                return -1;
                        }
                        whole *= 10;
+                       if (i > LLONG_MAX - whole) {
+                               errno = ERANGE;
+                               return -1;
+                       }
                        whole += i;
                }
        }