diff options
Diffstat (limited to 'pp.c')
-rw-r--r-- | pp.c | 16 |
1 files changed, 8 insertions, 8 deletions
@@ -1885,7 +1885,7 @@ PP(pp_hex) STRLEN n_a; tmps = POPpx; - XPUSHu(scan_hex(tmps, 99, &argtype)); + XPUSHu(scan_hex(tmps, sizeof(UV) * 2 + 1, &argtype)); RETURN; } @@ -1900,14 +1900,14 @@ PP(pp_oct) tmps = POPpx; while (*tmps && isSPACE(*tmps)) tmps++; - if (*tmps == '0') - tmps++; - if (*tmps == 'x') - value = scan_hex(++tmps, 99, &argtype); - else if (*tmps == 'b') - value = scan_bin(++tmps, 99, &argtype); + /* Do not eat the leading 0[bx] because we need them + * to detect malformed binary and hexadecimal numbers. */ + if ((tmps[0] == '0' && tmps[1] == 'x') || tmps[0] == 'x') + value = scan_hex(tmps, sizeof(UV) * 2 + 1, &argtype); + else if ((tmps[0] == '0' && tmps[1] == 'b') || tmps[0] == 'b') + value = scan_bin(tmps, sizeof(UV) * 8 + 1, &argtype); else - value = scan_oct(tmps, 99, &argtype); + value = scan_oct(tmps, sizeof(UV) * 4 + 1, &argtype); XPUSHu(value); RETURN; } |