summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2010-01-11 17:15:13 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2010-01-11 17:15:13 (GMT)
commit0ca7452794bef03b66f56cc996a73cac066d0ec1 (patch)
treebb669f4a72cf3332bb36f00a8e9c8254a0065bb4
parente822ab01664261c7b0e88c705c4b063bdd82b005 (diff)
downloadcpython-0ca7452794bef03b66f56cc996a73cac066d0ec1.zip
cpython-0ca7452794bef03b66f56cc996a73cac066d0ec1.tar.gz
cpython-0ca7452794bef03b66f56cc996a73cac066d0ec1.tar.bz2
Change a variable type to avoid signed overflow; replace repeated '19999' constant by a define.
-rw-r--r--Python/dtoa.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/Python/dtoa.c b/Python/dtoa.c
index da6b7e0..12e6f80 100644
--- a/Python/dtoa.c
+++ b/Python/dtoa.c
@@ -200,6 +200,13 @@ typedef union { double d; ULong L[2]; } U;
#define STRTOD_DIGLIM 40
#endif
+/* maximum permitted exponent value for strtod; exponents larger than
+ MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP. MAX_ABS_EXP
+ should fit into an int. */
+#ifndef MAX_ABS_EXP
+#define MAX_ABS_EXP 19999U
+#endif
+
/* The following definition of Storeinc is appropriate for MIPS processors.
* An alternative that might be better on some machines is
* #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
@@ -1305,9 +1312,8 @@ _Py_dg_strtod(const char *s00, char **se)
int esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
const char *s, *s0, *s1;
double aadj, aadj1;
- Long L;
U aadj2, adj, rv, rv0;
- ULong y, z;
+ ULong y, z, L;
BCinfo bc;
Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
@@ -1406,11 +1412,11 @@ _Py_dg_strtod(const char *s00, char **se)
s1 = s;
while((c = *++s) >= '0' && c <= '9')
L = 10*L + c - '0';
- if (s - s1 > 8 || L > 19999)
+ if (s - s1 > 8 || L > MAX_ABS_EXP)
/* Avoid confusion from exponents
* so large that e might overflow.
*/
- e = 19999; /* safe for 16 bit ints */
+ e = (int)MAX_ABS_EXP; /* safe for 16 bit ints */
else
e = (int)L;
if (esign)