From: Adhemerval Zanella Date: Fri, 25 Apr 2025 20:54:29 +0000 (-0300) Subject: math: Fix UB on sinpif (BZ 32925) X-Git-Tag: glibc-2.42~274 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=84977600dace5a7cfcb0918e6757939fd4969839;p=thirdparty%2Fglibc.git math: Fix UB on sinpif (BZ 32925) The left shift overflows for 'int', use uint32_t instead. It syncs with CORE-MATH commit bbfabd99. Checked on aarch64-linux-gnu, x86_64-linux-gnu, and i686-linux-gnu. Reviewed-by: Carlos O'Donell --- diff --git a/sysdeps/ieee754/flt-32/s_sinpif.c b/sysdeps/ieee754/flt-32/s_sinpif.c index 99a8bbbcf3..c0d15e777b 100644 --- a/sysdeps/ieee754/flt-32/s_sinpif.c +++ b/sysdeps/ieee754/flt-32/s_sinpif.c @@ -3,7 +3,7 @@ Copyright (c) 2022-2025 Alexei Sibidanov. The original version of this file was copied from the CORE-MATH -project (src/binary32/sinpi/sinpif.c, revision f786e13). +project (src/binary32/sinpi/sinpif.c, revision bbfabd99. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -51,7 +51,7 @@ __sinpif (float x) { if (__glibc_unlikely (s < -6)) return copysignf (0.0f, x); - int32_t iq = m << (-s - 1); + int32_t iq = (uint32_t)m << (-s - 1); iq &= 127; if (iq == 0 || iq == 64) return copysignf (0.0f, x); @@ -63,10 +63,10 @@ __sinpif (float x) return z * (0x1.921fb54442d18p+1 + z2 * (-0x1.4abbce625be53p+2)); } int32_t si = 25 - s; - if (__glibc_unlikely (si >= 0 && (m << si) == 0)) + if (__glibc_unlikely (si >= 0 && ((uint32_t)m << si) == 0)) return copysignf (0.0f, x); - int32_t k = m << (31 - s); + int32_t k = (uint32_t)m << (31 - s); double z = k, z2 = z * z; double fs = SN[0] + z2 * (SN[1] + z2 * SN[2]); double fc = CN[0] + z2 * (CN[1] + z2 * CN[2]);