From: Bernd Edlinger Date: Tue, 19 Dec 2017 18:41:01 +0000 (+0000) Subject: Avoid signed shift overflow in pow (bug 21309). X-Git-Tag: glibc-2.27~240 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=648615e13f8d7b638cb911926b8bb70804217f15;p=thirdparty%2Fglibc.git 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. --- diff --git a/ChangeLog b/ChangeLog index 4f836e3f675..d194a735928 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-12-19 Bernd Edlinger + + [BZ #21309] + * sysdeps/ieee754/dbl-64/e_pow.c (checkint): Make m and n + unsigned. + 2017-12-19 Joseph Myers Revert: diff --git a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c index 9f6439ee42a..8c7fb74549e 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)