--- ../python/upstream/Python-2.4.1/Python/mystrtoul.c 2003-11-19 08:24:47.000000000 -0700 +++ Python/mystrtoul.c 2005-10-22 13:39:18.000000000 -0600 @@ -34,12 +34,49 @@ #include #endif +static unsigned long smallmax[] = { + ULONG_MAX / 2, + ULONG_MAX / 3, + ULONG_MAX / 4, + ULONG_MAX / 5, + ULONG_MAX / 6, + ULONG_MAX / 7, + ULONG_MAX / 8, + ULONG_MAX / 9, + ULONG_MAX / 10, + ULONG_MAX / 11, + ULONG_MAX / 12, + ULONG_MAX / 13, + ULONG_MAX / 14, + ULONG_MAX / 15, + ULONG_MAX / 16, + ULONG_MAX / 17, + ULONG_MAX / 18, + ULONG_MAX / 19, + ULONG_MAX / 20, + ULONG_MAX / 21, + ULONG_MAX / 22, + ULONG_MAX / 23, + ULONG_MAX / 24, + ULONG_MAX / 25, + ULONG_MAX / 26, + ULONG_MAX / 27, + ULONG_MAX / 28, + ULONG_MAX / 29, + ULONG_MAX / 30, + ULONG_MAX / 31, + ULONG_MAX / 32, + ULONG_MAX / 33, + ULONG_MAX / 34, + ULONG_MAX / 35, + ULONG_MAX / 36, +}; + unsigned long PyOS_strtoul(register char *str, char **ptr, int base) { register unsigned long result; /* return value of the function */ register int c; /* current input character */ - register unsigned long temp; /* used in overflow testing */ int ovf; /* true if overflow occurred */ result = 0; @@ -98,16 +135,12 @@ if (c >= base) /* non-"digit" character */ break; } - temp = result; - result = result * base + c; - if(base == 10) { - if(((long)(result - c) / base != (long)temp)) /* overflow */ - ovf = 1; - } - else { - if ((result - c) / base != temp) /* overflow */ - ovf = 1; - } + if (result > smallmax[base - 2]) + ovf = 1; /* overflow just from shifting */ + result *= base; + if (result + c < result) + ovf = 1; /* overflow from the digit's value */ + result += c; str++; }