diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2010-01-12 22:23:56 +0000 |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2010-01-12 22:23:56 +0000 |
commit | c8a3c8167c48601aef25e1b2532e97b08be97b62 (patch) | |
tree | 45f00e954551d000d87113850bd8190d96a5b19d /Python/dtoa.c | |
parent | 4d4ba43674dee73c368d13204f469df62bff4c7d (diff) | |
download | cpython-c8a3c8167c48601aef25e1b2532e97b08be97b62.tar.gz |
Issue #7632: Fix a problem with _Py_dg_strtod that could lead to
crashes in debug builds, for certain long numeric strings
corresponding to subnormal values.
Diffstat (limited to 'Python/dtoa.c')
-rw-r--r-- | Python/dtoa.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/Python/dtoa.c b/Python/dtoa.c index 12e6f80638..4d64be5f07 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -1142,7 +1142,7 @@ bigcomp(U *rv, const char *s0, BCinfo *bc) dsign = bc->dsign; nd = bc->nd; nd0 = bc->nd0; - p5 = nd + bc->e0 - 1; + p5 = nd + bc->e0; speccase = 0; if (rv->d == 0.) { /* special case: value near underflow-to-zero */ /* threshold was rounded to zero */ @@ -1227,17 +1227,21 @@ bigcomp(U *rv, const char *s0, BCinfo *bc) } } - /* Now b/d = exactly half-way between the two floating-point values */ - /* on either side of the input string. Compute first digit of b/d. */ - - if (!(dig = quorem(b,d))) { - b = multadd(b, 10, 0); /* very unlikely */ - if (b == NULL) { - Bfree(d); - return -1; - } - dig = quorem(b,d); + /* Now 10*b/d = exactly half-way between the two floating-point values + on either side of the input string. If b >= d, round down. */ + if (cmp(b, d) >= 0) { + dd = -1; + goto ret; + } + + /* Compute first digit of 10*b/d. */ + b = multadd(b, 10, 0); + if (b == NULL) { + Bfree(d); + return -1; } + dig = quorem(b, d); + assert(dig < 10); /* Compare b/d with s0 */ |