From 3e694268750d51acc6a68b0ee7ded25a52902c20 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Sun, 19 May 2013 18:40:25 +0000 Subject: [PATCH] Fix nearbyint scheduling of arithmetic past fesetenv (bug 15490). --- ChangeLog | 12 ++++++++++++ NEWS | 2 +- sysdeps/ieee754/dbl-64/s_nearbyint.c | 2 ++ sysdeps/ieee754/flt-32/s_nearbyintf.c | 2 ++ sysdeps/ieee754/ldbl-128/s_nearbyintl.c | 2 ++ sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c | 5 +++++ sysdeps/ieee754/ldbl-96/s_nearbyintl.c | 2 ++ 7 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 5967380a095..a2323faff48 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2013-05-19 Joseph Myers + [BZ #15490] + * sysdeps/ieee754/dbl-64/s_nearbyint.c (__nearbyint): Use + math_force_eval before restoring floating-point envrionment. + * sysdeps/ieee754/flt-32/s_nearbyintf.c (__nearbyintf): Likewise. + * sysdeps/ieee754/ldbl-128/s_nearbyintl.c (__nearbyintl): + Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c: Include + . + (__nearbyintl): Use math_force_eval before restoring + floating-point environment. + * sysdeps/ieee754/ldbl-96/s_nearbyintl.c (__nearbyintl): Likewise. + * math/gen-libm-test.pl (special_functions): Remove. (parse_args): Don't handle TEST_extra. Handle functions with no return value. diff --git a/NEWS b/NEWS index a2bac226865..230b304b9aa 100644 --- a/NEWS +++ b/NEWS @@ -18,7 +18,7 @@ Version 2.18 15305, 15307, 15309, 15327, 15330, 15335, 15336, 15337, 15342, 15346, 15359, 15361, 15366, 15380, 15394, 15395, 15405, 15406, 15409, 15416, 15418, 15419, 15423, 15424, 15426, 15429, 15442, 15448, 15480, 15485, - 15488. + 15488, 15490. * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla #15078). diff --git a/sysdeps/ieee754/dbl-64/s_nearbyint.c b/sysdeps/ieee754/dbl-64/s_nearbyint.c index eb40c298bb0..5017f471d24 100644 --- a/sysdeps/ieee754/dbl-64/s_nearbyint.c +++ b/sysdeps/ieee754/dbl-64/s_nearbyint.c @@ -47,6 +47,7 @@ double __nearbyint(double x) libc_feholdexcept (&env); w = TWO52[sx]+x; t = w-TWO52[sx]; + math_force_eval (t); libc_fesetenv (&env); GET_HIGH_WORD(i0,t); SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31)); @@ -59,6 +60,7 @@ double __nearbyint(double x) libc_feholdexcept (&env); w = TWO52[sx]+x; t = w-TWO52[sx]; + math_force_eval (t); libc_fesetenv (&env); return t; } diff --git a/sysdeps/ieee754/flt-32/s_nearbyintf.c b/sysdeps/ieee754/flt-32/s_nearbyintf.c index 48debadde3c..5aebefafcfb 100644 --- a/sysdeps/ieee754/flt-32/s_nearbyintf.c +++ b/sysdeps/ieee754/flt-32/s_nearbyintf.c @@ -39,6 +39,7 @@ __nearbyintf(float x) libc_feholdexceptf (&env); w = TWO23[sx]+x; t = w-TWO23[sx]; + math_force_eval (t); libc_fesetenvf (&env); GET_FLOAT_WORD(i0,t); SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31)); @@ -51,6 +52,7 @@ __nearbyintf(float x) libc_feholdexceptf (&env); w = TWO23[sx]+x; t = w-TWO23[sx]; + math_force_eval (t); libc_fesetenvf (&env); return t; } diff --git a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c index d2afc10a5a0..2017c04207d 100644 --- a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c +++ b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c @@ -47,6 +47,7 @@ long double __nearbyintl(long double x) feholdexcept (&env); w = TWO112[sx]+x; t = w-TWO112[sx]; + math_force_eval (t); fesetenv (&env); GET_LDOUBLE_MSW64(i0,t); SET_LDOUBLE_MSW64(t,(i0&0x7fffffffffffffffLL)|(sx<<63)); @@ -59,6 +60,7 @@ long double __nearbyintl(long double x) feholdexcept (&env); w = TWO112[sx]+x; t = w-TWO112[sx]; + math_force_eval (t); fesetenv (&env); return t; } diff --git a/sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c b/sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c index b654bf586fd..bfcd11044df 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c @@ -21,6 +21,7 @@ when it's coded in C. */ #include +#include #include #include #include @@ -53,6 +54,8 @@ __nearbyintl (long double x) } u.dd[0] = high; u.dd[1] = 0.0; + math_force_eval (u.dd[0]); + math_force_eval (u.dd[1]); fesetenv (&env); } else if (fabs (u.dd[1]) < TWO52 && u.dd[1] != 0.0) @@ -109,6 +112,8 @@ __nearbyintl (long double x) } u.dd[0] = high + low; u.dd[1] = high - u.dd[0] + low; + math_force_eval (u.dd[0]); + math_force_eval (u.dd[1]); fesetenv (&env); } diff --git a/sysdeps/ieee754/ldbl-96/s_nearbyintl.c b/sysdeps/ieee754/ldbl-96/s_nearbyintl.c index ed9836c879f..c1d77f0c02f 100644 --- a/sysdeps/ieee754/ldbl-96/s_nearbyintl.c +++ b/sysdeps/ieee754/ldbl-96/s_nearbyintl.c @@ -54,6 +54,7 @@ long double __nearbyintl(long double x) feholdexcept (&env); w = TWO63[sx]+x; t = w-TWO63[sx]; + math_force_eval (t); fesetenv (&env); GET_LDOUBLE_EXP(i0,t); SET_LDOUBLE_EXP(t,(i0&0x7fff)|(sx<<15)); @@ -80,6 +81,7 @@ long double __nearbyintl(long double x) feholdexcept (&env); w = TWO63[sx]+x; t = w-TWO63[sx]; + math_force_eval (t); fesetenv (&env); return t; } -- 2.47.2