diff options
Diffstat (limited to 'Python')
-rw-r--r-- | Python/mystrtoul.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c index f0070575db..a02992f617 100644 --- a/Python/mystrtoul.c +++ b/Python/mystrtoul.c @@ -112,27 +112,40 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* check for leading 0 or 0x for auto-base or base 16 */ switch (base) { - case 0: /* look for leading 0, 0x or 0X */ - if (*str == '0') { - ++str; - if (*str == 'x' || *str == 'X') { - ++str; - base = 16; + case 0: /* look for leading 0, 0x or 0X */ + if (*str == '0') { + ++str; + if (*str == 'x' || *str == 'X') { + /* there must be at least one digit after 0x */ + if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) { + if (ptr) + *ptr = str; + return 0; } - else - base = 8; + ++str; + base = 16; } else - base = 10; - break; + base = 8; + } + else + base = 10; + break; - case 16: /* skip leading 0x or 0X */ - if (*str == '0') { + case 16: /* skip leading 0x or 0X */ + if (*str == '0') { + ++str; + if (*str == 'x' || *str == 'X') { + /* there must be at least one digit after 0x */ + if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) { + if (ptr) + *ptr = str; + return 0; + } ++str; - if (*str == 'x' || *str == 'X') - ++str; } - break; + } + break; } /* catch silly bases */ |