diff options
author | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2017-12-19 18:41:01 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2017-12-19 18:41:01 +0000 |
commit | 648615e13f8d7b638cb911926b8bb70804217f15 (patch) | |
tree | f2c1e2e3d031d0f4e72b982950ee5a6b9223e5a9 /sysdeps/ieee754 | |
parent | f1e005022ebd246e1541386cd2f3286f008d2d98 (diff) | |
download | glibc-648615e13f8d7b638cb911926b8bb70804217f15.tar glibc-648615e13f8d7b638cb911926b8bb70804217f15.tar.gz glibc-648615e13f8d7b638cb911926b8bb70804217f15.tar.bz2 glibc-648615e13f8d7b638cb911926b8bb70804217f15.zip |
Avoid signed shift overflow in pow (bug 21309).
As noted in bug 21309, dbl-64/e_pow.c contains signed int shifts that,
although the shift count is in the range [0, 31], shift bits into and
beyond the sign bit and so are undefined in ISO C. Although this is
defined in GNU C, this patch from the bug cleans up the code to avoid
those shifts.
Tested for x86_64.
[BZ #21309]
* sysdeps/ieee754/dbl-64/e_pow.c (checkint): Make m and n
unsigned.
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_pow.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c index 9f6439ee42..8c7fb74549 100644 --- a/sysdeps/ieee754/dbl-64/e_pow.c +++ b/sysdeps/ieee754/dbl-64/e_pow.c @@ -452,7 +452,8 @@ checkint (double x) int4 i[2]; double x; } u; - int k, m, n; + int k; + unsigned int m, n; u.x = x; m = u.i[HIGH_HALF] & 0x7fffffff; /* no sign */ if (m >= 0x7ff00000) |