diff options
author | Joseph Myers <joseph@codesourcery.com> | 2013-10-12 12:18:55 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2013-10-12 12:18:55 +0000 |
commit | 8399acaf7c5cb2252117ad1d65e468f688b84fc0 (patch) | |
tree | 492adfe232efb5737972eb3c65f8f547b0a3072a | |
parent | 99fd9f47effcd18489528e895c08b58ed24d6505 (diff) | |
download | glibc-8399acaf7c5cb2252117ad1d65e468f688b84fc0.tar glibc-8399acaf7c5cb2252117ad1d65e468f688b84fc0.tar.gz glibc-8399acaf7c5cb2252117ad1d65e468f688b84fc0.tar.bz2 glibc-8399acaf7c5cb2252117ad1d65e468f688b84fc0.zip |
soft-fp: fix _FP_DIV_MEAT_* returning results with wrong exponent (bug 16032).
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | soft-fp/op-2.h | 6 | ||||
-rw-r--r-- | soft-fp/op-4.h | 2 |
4 files changed, 16 insertions, 5 deletions
@@ -1,5 +1,16 @@ 2013-10-12 Joseph Myers <joseph@codesourcery.com> + [BZ #16032] + * soft-fp/op-2.h (_FP_DIV_MEAT_2_udiv): Shift numerator right + without decrementing exponent if mantissa >= that for the + denominator, not >. + (_FP_DIV_MEAT_2_gmp): Test numerator mantissa >= that for the + denominator, not >. Decrement exponent in < case instead of + incrementing in >= case. + * soft-fp/op-4.h (_FP_DIV_MEAT_4_udiv): Shift numerator right + without decrementing exponent if mantissa >= that for the + denominator, not >. + * soft-fp/op-common.h (_FP_TO_INT): Reverse test of sign for computing saturated result for unsigned overflow. @@ -14,7 +14,7 @@ Version 2.19 15723, 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, 16034. + 15966, 15988, 16032, 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/op-2.h b/soft-fp/op-2.h index 20088227e1..2892d3b04c 100644 --- a/soft-fp/op-2.h +++ b/soft-fp/op-2.h @@ -469,7 +469,7 @@ #define _FP_DIV_MEAT_2_udiv(fs, R, X, Y) \ do { \ _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0; \ - if (_FP_FRAC_GT_2(X, Y)) \ + if (_FP_FRAC_GE_2(X, Y)) \ { \ _n_f2 = X##_f1 >> 1; \ _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1; \ @@ -539,9 +539,8 @@ _FP_W_TYPE _x[4], _y[2], _z[4]; \ _y[0] = Y##_f0; _y[1] = Y##_f1; \ _x[0] = _x[3] = 0; \ - if (_FP_FRAC_GT_2(X, Y)) \ + if (_FP_FRAC_GE_2(X, Y)) \ { \ - R##_e++; \ _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE) | \ X##_f1 >> (_FP_W_TYPE_SIZE - \ (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE))); \ @@ -549,6 +548,7 @@ } \ else \ { \ + R##_e--; \ _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE) | \ X##_f1 >> (_FP_W_TYPE_SIZE - \ (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE))); \ diff --git a/soft-fp/op-4.h b/soft-fp/op-4.h index 7fccbd52be..9086ba71c4 100644 --- a/soft-fp/op-4.h +++ b/soft-fp/op-4.h @@ -381,7 +381,7 @@ int _i; \ _FP_FRAC_DECL_4(_n); _FP_FRAC_DECL_4(_m); \ _FP_FRAC_SET_4(_n, _FP_ZEROFRAC_4); \ - if (_FP_FRAC_GT_4(X, Y)) \ + if (_FP_FRAC_GE_4(X, Y)) \ { \ _n_f[3] = X##_f[0] << (_FP_W_TYPE_SIZE - 1); \ _FP_FRAC_SRL_4(X, 1); \ |