From 0ca7452794bef03b66f56cc996a73cac066d0ec1 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Mon, 11 Jan 2010 17:15:13 +0000 Subject: [PATCH] Change a variable type to avoid signed overflow; replace repeated '19999' constant by a define. --- Python/dtoa.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Python/dtoa.c b/Python/dtoa.c index da6b7e04045..12e6f806380 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)