From: Joseph Myers Date: Thu, 10 Oct 2013 11:38:56 +0000 (+0000) Subject: soft-fp: fix negation NaN handling (bug 16034). X-Git-Tag: glibc-2.19~625 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2ae21ed2d2e2e0e38b84bd046bcf5f009ab417f3;p=thirdparty%2Fglibc.git soft-fp: fix negation NaN handling (bug 16034). --- diff --git a/ChangeLog b/ChangeLog index 00ba832291c..7367bab60ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2013-10-10 Joseph Myers + + [BZ #16034] + * soft-fp/op-common.h (_FP_NEG): Document input as raw. Do not + copy class of input value. + * soft-fp/negdf2.c (__negdf2): Use raw unpacking and packing. Do + not handle exceptions. + * soft-fp/negsf2.c (__negsf2): Likewise. + * soft-fp/negtf2.c (__negtf2): Likewise. + * sysdeps/sparc/sparc32/soft-fp/q_neg.c (_Q_neg): Likewise. + 2013-10-09 Joseph Myers * soft-fp/op-4.h (_FP_FRAC_DISASSEMBLE_4): Remove trailing diff --git a/NEWS b/NEWS index 73fa9fe23d7..5f0a710503b 100644 --- a/NEWS +++ b/NEWS @@ -14,7 +14,7 @@ Version 2.19 15734, 15735, 15736, 15748, 15749, 15754, 15760, 15797, 15844, 15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890, 15892, 15893, 15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 15963, 15966, - 15988. + 15988, 16034. * CVE-2012-4412 The strcoll implementation caches indices and rules for large collation sequences to optimize multiple passes. This cache diff --git a/soft-fp/negdf2.c b/soft-fp/negdf2.c index 3cc6f5f400b..1dedc715dd0 100644 --- a/soft-fp/negdf2.c +++ b/soft-fp/negdf2.c @@ -33,15 +33,12 @@ DFtype __negdf2(DFtype a) { - FP_DECL_EX; FP_DECL_D(A); FP_DECL_D(R); DFtype r; - FP_UNPACK_D(A, a); + FP_UNPACK_RAW_D(A, a); FP_NEG_D(R, A); - FP_PACK_D(r, R); - FP_CLEAR_EXCEPTIONS; - FP_HANDLE_EXCEPTIONS; + FP_PACK_RAW_D(r, R); return r; } diff --git a/soft-fp/negsf2.c b/soft-fp/negsf2.c index d8d59106036..35ece56fc4c 100644 --- a/soft-fp/negsf2.c +++ b/soft-fp/negsf2.c @@ -33,15 +33,12 @@ SFtype __negsf2(SFtype a) { - FP_DECL_EX; FP_DECL_S(A); FP_DECL_S(R); SFtype r; - FP_UNPACK_S(A, a); + FP_UNPACK_RAW_S(A, a); FP_NEG_S(R, A); - FP_PACK_S(r, R); - FP_CLEAR_EXCEPTIONS; - FP_HANDLE_EXCEPTIONS; + FP_PACK_RAW_S(r, R); return r; } diff --git a/soft-fp/negtf2.c b/soft-fp/negtf2.c index 1c08441487b..f51a6216118 100644 --- a/soft-fp/negtf2.c +++ b/soft-fp/negtf2.c @@ -33,15 +33,12 @@ TFtype __negtf2(TFtype a) { - FP_DECL_EX; FP_DECL_Q(A); FP_DECL_Q(R); TFtype r; - FP_UNPACK_Q(A, a); + FP_UNPACK_RAW_Q(A, a); FP_NEG_Q(R, A); - FP_PACK_Q(r, R); - FP_CLEAR_EXCEPTIONS; - FP_HANDLE_EXCEPTIONS; + FP_PACK_RAW_Q(r, R); return r; } diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h index 75ea352bc77..5dfb73c1853 100644 --- a/soft-fp/op-common.h +++ b/soft-fp/op-common.h @@ -771,14 +771,12 @@ do { \ /* - * Main negation routine. FIXME -- when we care about setting exception - * bits reliably, this will not do. We should examine all of the fp classes. + * Main negation routine. The input value is raw. */ #define _FP_NEG(fs, wc, R, X) \ do { \ _FP_FRAC_COPY_##wc(R, X); \ - R##_c = X##_c; \ R##_e = X##_e; \ R##_s = 1 ^ X##_s; \ } while (0) diff --git a/sysdeps/sparc/sparc32/soft-fp/q_neg.c b/sysdeps/sparc/sparc32/soft-fp/q_neg.c index 551c40887bb..5e2449c916f 100644 --- a/sysdeps/sparc/sparc32/soft-fp/q_neg.c +++ b/sysdeps/sparc/sparc32/soft-fp/q_neg.c @@ -24,7 +24,6 @@ long double _Q_neg(const long double a) { - FP_DECL_EX; long double c = a; #if (__BYTE_ORDER == __BIG_ENDIAN) @@ -36,11 +35,9 @@ long double _Q_neg(const long double a) #else FP_DECL_Q(A); FP_DECL_Q(C); - FP_UNPACK_Q(A, a); + FP_UNPACK_RAW_Q(A, a); FP_NEG_Q(C, A); - FP_PACK_Q(c, C); + FP_PACK_RAW_Q(c, C); #endif - FP_CLEAR_EXCEPTIONS; - FP_HANDLE_EXCEPTIONS; return c; }