Prevent an overflow when trying to print excessively big floats
authorMatt Caswell <matt@openssl.org>
Wed, 25 May 2016 15:20:48 +0000 (16:20 +0100)
committerMatt Caswell <matt@openssl.org>
Fri, 27 May 2016 09:23:18 +0000 (10:23 +0100)
We convert the integer part of the float to a long. We should check it
fits first.

Issue reported by Guido Vranken.

GitHub Issue #1102

Reviewed-by: Richard Levitte <levitte@openssl.org>
crypto/bio/b_print.c

index 36400cd..d52ad7c 100644 (file)
@@ -561,9 +561,9 @@ fmtfp(char **sbuffer,
     int padlen = 0;
     int zpadlen = 0;
     long exp = 0;
-    long intpart;
-    long fracpart;
-    long max10;
+    unsigned long intpart;
+    unsigned long fracpart;
+    unsigned long max10;
     int realstyle;
 
     if (max < 0)
@@ -638,7 +638,11 @@ fmtfp(char **sbuffer,
             fvalue = tmpvalue;
     }
     ufvalue = abs_val(fvalue);
-    intpart = (long)ufvalue;
+    if (ufvalue > ULONG_MAX) {
+        /* Number too big */
+        return 0;
+    }
+    intpart = (unsigned long)ufvalue;
 
     /*
      * sorry, we only support 9 digits past the decimal because of our