Kaydet (Commit) 8efef5ce authored tarafından Mark Dickinson's avatar Mark Dickinson

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.
üst efa45f35
...@@ -1019,3 +1019,10 @@ ...@@ -1019,3 +1019,10 @@
+43723334984997307E-26 +43723334984997307E-26
+10182419849537963E-24 +10182419849537963E-24
-93501703572661982E-26 -93501703572661982E-26
# A value that caused a crash in debug builds for Python >= 2.7, 3.1
# See http://bugs.python.org/issue7632
2183167012312112312312.23538020374420446192e-370
# Another value designed to test a corner case of Python's strtod code.
0.99999999999999999999999999999999999999999e+23
...@@ -12,6 +12,10 @@ What's New in Python 2.7 alpha 3? ...@@ -12,6 +12,10 @@ What's New in Python 2.7 alpha 3?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #7632: Fix a crash in dtoa.c that occurred in debug builds
when parsing certain long numeric strings corresponding to subnormal
values.
- Issue #7319: Silence DeprecationWarning by default. - Issue #7319: Silence DeprecationWarning by default.
- Issue #2335: Backport set literals syntax from Python 3.x. - Issue #2335: Backport set literals syntax from Python 3.x.
......
...@@ -1142,7 +1142,7 @@ bigcomp(U *rv, const char *s0, BCinfo *bc) ...@@ -1142,7 +1142,7 @@ bigcomp(U *rv, const char *s0, BCinfo *bc)
dsign = bc->dsign; dsign = bc->dsign;
nd = bc->nd; nd = bc->nd;
nd0 = bc->nd0; nd0 = bc->nd0;
p5 = nd + bc->e0 - 1; p5 = nd + bc->e0;
speccase = 0; speccase = 0;
if (rv->d == 0.) { /* special case: value near underflow-to-zero */ if (rv->d == 0.) { /* special case: value near underflow-to-zero */
/* threshold was rounded to zero */ /* threshold was rounded to zero */
...@@ -1227,17 +1227,21 @@ bigcomp(U *rv, const char *s0, BCinfo *bc) ...@@ -1227,17 +1227,21 @@ bigcomp(U *rv, const char *s0, BCinfo *bc)
} }
} }
/* Now b/d = exactly half-way between the two floating-point values */ /* Now 10*b/d = exactly half-way between the two floating-point values
/* on either side of the input string. Compute first digit of b/d. */ on either side of the input string. If b >= d, round down. */
if (cmp(b, d) >= 0) {
if (!(dig = quorem(b,d))) { dd = -1;
b = multadd(b, 10, 0); /* very unlikely */ goto ret;
if (b == NULL) { }
Bfree(d);
return -1; /* Compute first digit of 10*b/d. */
} b = multadd(b, 10, 0);
dig = quorem(b,d); if (b == NULL) {
Bfree(d);
return -1;
} }
dig = quorem(b, d);
assert(dig < 10);
/* Compare b/d with s0 */ /* Compare b/d with s0 */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment