Fix missing underflow from cexp (bug 14478).

This commit is contained in:
Joseph Myers 2013-04-03 16:51:46 +00:00
parent 5b535ac419
commit 05e166c887
6 changed files with 52 additions and 4 deletions

View File

@ -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]

8
NEWS
View File

@ -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).

View 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);
}

View 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
{

View 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
{

View 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
{