Fix strtod rounding of half the least subnormal (bug 16151).

This commit is contained in:
Joseph Myers 2013-11-13 12:59:54 +00:00
parent 7a2ad8cf39
commit 9310c284ae
5 changed files with 308 additions and 2 deletions

View File

@ -1,3 +1,12 @@
2013-11-13 Joseph Myers <joseph@codesourcery.com>
[BZ #16151]
* stdlib/strtod_l.c (round_and_return): Do not consider
retval[RETURN_LIBM_SIZE - 1] when determining more_bits for an
exponent one less than half the least subnormal exponent.
* stdlib/test-strtod-round-data: Add more tests.
* stdlib/tst-strtod-round.c (tests): Regenerated.
2013-11-13 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
[BZ #14143]

3
NEWS
View File

@ -17,7 +17,8 @@ Version 2.19
15825, 15844, 15847, 15849, 15855, 15856, 15857, 15859, 15867, 15886,
15887, 15890, 15892, 15893, 15895, 15897, 15905, 15909, 15917, 15919,
15921, 15923, 15939, 15948, 15963, 15966, 15985, 15988, 16032, 16034,
16036, 16037, 16041, 16071, 16072, 16074, 16078, 16112, 16150, 16153.
16036, 16037, 16041, 16071, 16072, 16074, 16078, 16112, 16150, 16151,
16153.
* CVE-2012-4412 The strcoll implementation caches indices and rules for
large collation sequences to optimize multiple passes. This cache

View File

@ -228,7 +228,7 @@ round_and_return (mp_limb_t *retval, intmax_t exponent, int negative,
round_limb = retval[RETURN_LIMB_SIZE - 1];
round_bit = (MANT_DIG - 1) % BITS_PER_MP_LIMB;
for (i = 0; i < RETURN_LIMB_SIZE; ++i)
for (i = 0; i < RETURN_LIMB_SIZE - 1; ++i)
more_bits |= retval[i] != 0;
MPN_ZERO (retval, RETURN_LIMB_SIZE);
}

View File

@ -109,3 +109,11 @@
-0x0.7p-1074
-0x0.7p-16445
-0x0.7p-16494
0x1p-150
0x1p-1075
0x1p-16446
0x1p-16495
-0x1p-150
-0x1p-1075
-0x1p-16446
-0x1p-16495

View File

@ -7535,6 +7535,294 @@ static const struct test tests[] = {
-0x0p+0L,
-0x0p+0L,
-0x0p+0L),
TEST ("0x1p-150",
false,
0x0p+0f,
0x0p+0f,
0x0p+0f,
0x8p-152f,
true,
0x4p-152,
0x4p-152,
0x4p-152,
0x4p-152,
true,
0x4p-152L,
0x4p-152L,
0x4p-152L,
0x4p-152L,
true,
0x4p-152L,
0x4p-152L,
0x4p-152L,
0x4p-152L,
true,
0x4p-152L,
0x4p-152L,
0x4p-152L,
0x4p-152L,
true,
0x4p-152L,
0x4p-152L,
0x4p-152L,
0x4p-152L,
true,
0x4p-152L,
0x4p-152L,
0x4p-152L,
0x4p-152L),
TEST ("0x1p-1075",
false,
0x0p+0f,
0x0p+0f,
0x0p+0f,
0x8p-152f,
false,
0x0p+0,
0x0p+0,
0x0p+0,
0x4p-1076,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x4p-1076L,
true,
0x2p-1076L,
0x2p-1076L,
0x2p-1076L,
0x2p-1076L,
true,
0x2p-1076L,
0x2p-1076L,
0x2p-1076L,
0x2p-1076L,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x4p-1076L,
true,
0x2p-1076L,
0x2p-1076L,
0x2p-1076L,
0x2p-1076L),
TEST ("0x1p-16446",
false,
0x0p+0f,
0x0p+0f,
0x0p+0f,
0x8p-152f,
false,
0x0p+0,
0x0p+0,
0x0p+0,
0x4p-1076,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x4p-1076L,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x8p-16448L,
true,
0x4p-16448L,
0x4p-16448L,
0x4p-16448L,
0x4p-16448L,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x4p-1076L,
true,
0x4p-16448L,
0x4p-16448L,
0x4p-16448L,
0x4p-16448L),
TEST ("0x1p-16495",
false,
0x0p+0f,
0x0p+0f,
0x0p+0f,
0x8p-152f,
false,
0x0p+0,
0x0p+0,
0x0p+0,
0x4p-1076,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x4p-1076L,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x8p-16448L,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x4p-16448L,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x4p-1076L,
false,
0x0p+0L,
0x0p+0L,
0x0p+0L,
0x4p-16496L),
TEST ("-0x1p-150",
false,
-0x8p-152f,
-0x0p+0f,
-0x0p+0f,
-0x0p+0f,
true,
-0x4p-152,
-0x4p-152,
-0x4p-152,
-0x4p-152,
true,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
true,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
true,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
true,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
true,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L,
-0x4p-152L),
TEST ("-0x1p-1075",
false,
-0x8p-152f,
-0x0p+0f,
-0x0p+0f,
-0x0p+0f,
false,
-0x4p-1076,
-0x0p+0,
-0x0p+0,
-0x0p+0,
false,
-0x4p-1076L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
true,
-0x2p-1076L,
-0x2p-1076L,
-0x2p-1076L,
-0x2p-1076L,
true,
-0x2p-1076L,
-0x2p-1076L,
-0x2p-1076L,
-0x2p-1076L,
false,
-0x4p-1076L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
true,
-0x2p-1076L,
-0x2p-1076L,
-0x2p-1076L,
-0x2p-1076L),
TEST ("-0x1p-16446",
false,
-0x8p-152f,
-0x0p+0f,
-0x0p+0f,
-0x0p+0f,
false,
-0x4p-1076,
-0x0p+0,
-0x0p+0,
-0x0p+0,
false,
-0x4p-1076L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
false,
-0x8p-16448L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
true,
-0x4p-16448L,
-0x4p-16448L,
-0x4p-16448L,
-0x4p-16448L,
false,
-0x4p-1076L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
true,
-0x4p-16448L,
-0x4p-16448L,
-0x4p-16448L,
-0x4p-16448L),
TEST ("-0x1p-16495",
false,
-0x8p-152f,
-0x0p+0f,
-0x0p+0f,
-0x0p+0f,
false,
-0x4p-1076,
-0x0p+0,
-0x0p+0,
-0x0p+0,
false,
-0x4p-1076L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
false,
-0x8p-16448L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
false,
-0x4p-16448L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
false,
-0x4p-1076L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L,
false,
-0x4p-16496L,
-0x0p+0L,
-0x0p+0L,
-0x0p+0L),
};
static int