aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/ieee754
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2017-12-19 18:41:01 +0000
committerJoseph Myers <joseph@codesourcery.com>2017-12-19 18:41:01 +0000
commit648615e13f8d7b638cb911926b8bb70804217f15 (patch)
treef2c1e2e3d031d0f4e72b982950ee5a6b9223e5a9 /sysdeps/ieee754
parentf1e005022ebd246e1541386cd2f3286f008d2d98 (diff)
downloadglibc-648615e13f8d7b638cb911926b8bb70804217f15.zip
glibc-648615e13f8d7b638cb911926b8bb70804217f15.tar.gz
glibc-648615e13f8d7b638cb911926b8bb70804217f15.tar.bz2
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.c3
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 9f6439e..8c7fb74 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)