Revert the check for NaN in %f format
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Sun, 31 May 2020 05:51:23 +0000 (07:51 +0200)
committerBernd Edlinger <bernd.edlinger@hotmail.de>
Mon, 1 Jun 2020 16:20:28 +0000 (18:20 +0200)
Unfortunately -Ofast seems to break that check.

Fixes #11994

Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/12003)

crypto/bio/b_print.c
test/bioprinttest.c

index 6b995f82334be0db7474dce562004a07eacb1647..a5dfff503ce02ab3170bfe6f31c9d2bcb795aba5 100644 (file)
@@ -638,10 +638,8 @@ fmtfp(char **sbuffer,
     /*
      * By subtracting 65535 (2^16-1) we cancel the low order 15 bits
      * of ULONG_MAX to avoid using imprecise floating point values.
-     * The second condition is necessary to catch NaN values.
      */
-    if (ufvalue >= (double)(ULONG_MAX - 65535) + 65536.0
-            || !(ufvalue == ufvalue) /* NaN */) {
+    if (ufvalue >= (double)(ULONG_MAX - 65535) + 65536.0) {
         /* Number too big */
         return 0;
     }
index 3dd5b3efa2665b27ef08793b92ac96bfd15e23b7..e6e32a64fcb373ec8108995a90537709cac3309e 100644 (file)
@@ -241,48 +241,15 @@ static int test_fp(int i)
     return r;
 }
 
-extern double zero_value;
-double zero_value = 0.0;
-
 static int test_big(void)
 {
     char buf[80];
-    double d, z, inf, nan;
 
     /* Test excessively big number. Should fail */
     if (!TEST_int_eq(BIO_snprintf(buf, sizeof(buf),
                                   "%f\n", 2 * (double)ULONG_MAX), -1))
         return 0;
 
-    d = 1.0;
-    z = zero_value;
-    inf = d / z;
-    nan = z / z;
-
-    /*
-     * Test +/-inf, nan. Should fail.
-     * Test +/-1.0, +/-0.0. Should work.
-     */
-    if (!TEST_int_eq(BIO_snprintf(buf, sizeof(buf),
-                                  "%f", inf), -1)
-            || !TEST_int_eq(BIO_snprintf(buf, sizeof(buf),
-                                         "%f", -inf), -1)
-            || !TEST_int_eq(BIO_snprintf(buf, sizeof(buf),
-                                         "%f", nan), -1)
-            || !TEST_int_eq(BIO_snprintf(buf, sizeof(buf),
-                                         "%f", d), 8)
-            || !TEST_str_eq(buf, "1.000000")
-            || !TEST_int_eq(BIO_snprintf(buf, sizeof(buf),
-                                         "%f", z), 8)
-            || !TEST_str_eq(buf, "0.000000")
-            || !TEST_int_eq(BIO_snprintf(buf, sizeof(buf),
-                                         "%f", -d), 9)
-            || !TEST_str_eq(buf, "-1.000000")
-            || !TEST_int_eq(BIO_snprintf(buf, sizeof(buf),
-                                         "%f", -z), 8)
-            || !TEST_str_eq(buf, "0.000000"))
-        return 0;
-
     return 1;
 }