]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix missing underflow from cexp (bug 14478).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 3 Apr 2013 16:51:46 +0000 (16:51 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 3 Apr 2013 16:51:46 +0000 (16:51 +0000)
ChangeLog
NEWS
math/libm-test.inc
math/s_cexp.c
math/s_cexpf.c
math/s_cexpl.c

index deebea49f15013edfcac8a1c3097c009ba206804..8d2602b6395a3fd09af38114a94b5fce9d9e73f4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2013-04-03  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #14478]
+       * math/s_cexp.c (__cexp): Ensure underflow exception occurs for
+       underflowed result.
+       * math/s_cexpf.c (__cexpf): Likewise.
+       * math/s_cexpl.c (__cexpl): Likewise.
+       * math/libm-test.inc (cexp_test): Add more tests.
+
 2013-04-03  Andreas Schwab  <schwab@suse.de>
 
        [BZ #15330]
diff --git a/NEWS b/NEWS
index 513c185b7f29afaf3d91a12246956d10b18a20e7..e28b2874b7f090adb3d524538c7ba00d5e342914 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,10 +10,10 @@ Version 2.18
 * The following bugs are resolved with this release:
 
   10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200,
-  14317, 14327, 14496, 14812, 14920, 14964, 14981, 14982, 14985, 14994,
-  14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078,
-  15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15305, 15307,
-  15327, 15330.
+  14317, 14327, 14478, 14496, 14812, 14920, 14964, 14981, 14982, 14985,
+  14994, 14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062,
+  15078, 15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15305,
+  15307, 15327, 15330.
 
 * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
   #15078).
index c9ed719d18bee85ad0e03d3dc8b2c4fb5532cb29..08c80fad4203f08069a7eb1f149363817580523c 100644 (file)
@@ -4794,6 +4794,9 @@ cexp_test (void)
   TEST_c_c (cexp, 1e6, min_value, plus_infty, plus_infty, OVERFLOW_EXCEPTION);
   TEST_c_c (cexp, 1e6, -min_value, plus_infty, minus_infty, OVERFLOW_EXCEPTION);
 
+  TEST_c_c (cexp, min_value, min_subnorm_value, 1.0, min_subnorm_value, UNDERFLOW_EXCEPTION);
+  TEST_c_c (cexp, min_value, -min_subnorm_value, 1.0, -min_subnorm_value, UNDERFLOW_EXCEPTION);
+
   END (cexp, complex);
 }
 
index 36157ff61bbf757b80a16fe1eb2696fb1da893c4..655e4e8deebca91450f982281cab3b70683e2d88 100644 (file)
@@ -74,6 +74,18 @@ __cexp (__complex__ double x)
              __real__ retval = exp_val * cosix;
              __imag__ retval = exp_val * sinix;
            }
+         if (fabs (__real__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabs (__imag__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 364be8ac3195e5c1e8226f05dfbc6d3fd2699804..fa942d34f79526a3fc5fb29896d468ae3d52ea17 100644 (file)
@@ -74,6 +74,18 @@ __cexpf (__complex__ float x)
              __real__ retval = exp_val * cosix;
              __imag__ retval = exp_val * sinix;
            }
+         if (fabsf (__real__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsf (__imag__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 1bfce78aeb001420dd07e6d635113984dd448756..d827bc3de41a70a544704b2564ecc6b2bacf3838 100644 (file)
@@ -74,6 +74,18 @@ __cexpl (__complex__ long double x)
              __real__ retval = exp_val * cosix;
              __imag__ retval = exp_val * sinix;
            }
+         if (fabsl (__real__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsl (__imag__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {