Commit 143328ba authored by Fredrik Lundh's avatar Fredrik Lundh

-- tightened up parsing of octal numbers

-- improved the SRE test harness: don't use asserts, test a few more
   things (including more boundary conditions)
parent 412f2460
...@@ -15,7 +15,7 @@ from sre_constants import * ...@@ -15,7 +15,7 @@ from sre_constants import *
MAXREPEAT = 65535 MAXREPEAT = 65535
SPECIAL_CHARS = ".\\[{()*+?^$|" SPECIAL_CHARS = ".\\[{()*+?^$|"
REPEAT_CHARS = "*+?{" REPEAT_CHARS = "*+?{"
DIGITS = tuple("0123456789") DIGITS = tuple("0123456789")
...@@ -259,13 +259,12 @@ def _escape(source, escape, state): ...@@ -259,13 +259,12 @@ def _escape(source, escape, state):
# hexadecimal escape # hexadecimal escape
while source.next in HEXDIGITS and len(escape) < 4: while source.next in HEXDIGITS and len(escape) < 4:
escape = escape + source.get() escape = escape + source.get()
escape = escape[2:] if len(escape) != 4:
if len(escape) != 2: raise ValueError
raise error, "bogus escape: %s" % repr("\\" + escape) return LITERAL, int(escape[2:], 16) & 0xff
return LITERAL, int(escape, 16) & 0xff
elif escape[1:2] == "0": elif escape[1:2] == "0":
# octal escape # octal escape
while source.next in OCTDIGITS and len(escape) < 5: while source.next in OCTDIGITS and len(escape) < 4:
escape = escape + source.get() escape = escape + source.get()
return LITERAL, int(escape[1:], 8) & 0xff return LITERAL, int(escape[1:], 8) & 0xff
elif escape[1:2] in DIGITS: elif escape[1:2] in DIGITS:
...@@ -273,7 +272,8 @@ def _escape(source, escape, state): ...@@ -273,7 +272,8 @@ def _escape(source, escape, state):
here = source.tell() here = source.tell()
if source.next in DIGITS: if source.next in DIGITS:
escape = escape + source.get() escape = escape + source.get()
if escape[2] in OCTDIGITS and source.next in OCTDIGITS: if (escape[1] in OCTDIGITS and escape[2] in OCTDIGITS and
source.next in OCTDIGITS):
# got three octal digits; this is an octal escape # got three octal digits; this is an octal escape
escape = escape + source.get() escape = escape + source.get()
return LITERAL, int(escape[1:], 8) & 0xff return LITERAL, int(escape[1:], 8) & 0xff
...@@ -281,7 +281,7 @@ def _escape(source, escape, state): ...@@ -281,7 +281,7 @@ def _escape(source, escape, state):
group = _group(escape, state.groups) group = _group(escape, state.groups)
if group: if group:
return GROUPREF, group return GROUPREF, group
raise error, "bogus escape: %s" % repr(escape) raise ValueError
if len(escape) == 2: if len(escape) == 2:
return LITERAL, ord(escape[1]) return LITERAL, ord(escape[1])
except ValueError: except ValueError:
......
test_sre test_sre
maximum recursion limit exceeded
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment