math: fix signed int left shift ub in sqrt
authorSzabolcs Nagy <nsz@port70.net>
Sun, 13 Oct 2019 14:54:31 +0000 (14:54 +0000)
committerRich Felker <dalias@aerifal.cx>
Sun, 13 Oct 2019 21:46:58 +0000 (17:46 -0400)
Both sqrt and sqrtf shifted the signed exponent as signed int to adjust
the bit representation of the result. There are signed right shifts too
in the code but those are implementation defined and are expected to
compile to arithmetic shift on supported compilers and targets.

src/math/sqrt.c
src/math/sqrtf.c

index b27756738595dc29a8a7f35e7bffa8da64214826..f1f6d76c780cee4b342e9facd441fa1e8d80384f 100644 (file)
@@ -179,7 +179,6 @@ double sqrt(double x)
        ix1 = q1>>1;
        if (q&1)
                ix1 |= sign;
-       ix0 += m << 20;
-       INSERT_WORDS(z, ix0, ix1);
+       INSERT_WORDS(z, ix0 + ((uint32_t)m << 20), ix1);
        return z;
 }
index 28cb4ad3713e6447843631a8d4e686f0f1dfdbb9..d6ace38aa6b49491926c394651826d8f696ebcda 100644 (file)
@@ -78,7 +78,6 @@ float sqrtf(float x)
                }
        }
        ix = (q>>1) + 0x3f000000;
-       ix += m << 23;
-       SET_FLOAT_WORD(z, ix);
+       SET_FLOAT_WORD(z, ix + ((uint32_t)m << 23));
        return z;
 }