diff options
| author | Mark Dickinson <dickinsm@gmail.com> | 2010-01-11 17:15:13 (GMT) | 
|---|---|---|
| committer | Mark Dickinson <dickinsm@gmail.com> | 2010-01-11 17:15:13 (GMT) | 
| commit | 0ca7452794bef03b66f56cc996a73cac066d0ec1 (patch) | |
| tree | bb669f4a72cf3332bb36f00a8e9c8254a0065bb4 /Python/dtoa.c | |
| parent | e822ab01664261c7b0e88c705c4b063bdd82b005 (diff) | |
| download | cpython-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.
Diffstat (limited to 'Python/dtoa.c')
| -rw-r--r-- | Python/dtoa.c | 14 | 
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)  | 
