summaryrefslogtreecommitdiffstats
path: root/Lib/sre_parse.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/sre_parse.py')
-rw-r--r--Lib/sre_parse.py19
1 files changed, 15 insertions, 4 deletions
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 13737ca..045a5eb 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -15,6 +15,7 @@
import sys
from sre_constants import *
+from _sre import MAXREPEAT
SPECIAL_CHARS = ".\\[{()*+?^$|"
REPEAT_CHARS = "*+?{"
@@ -235,7 +236,7 @@ def _class_escape(source, escape):
if code:
return code
code = CATEGORIES.get(escape)
- if code:
+ if code and code[0] == IN:
return code
try:
c = escape[1:2]
@@ -505,10 +506,14 @@ def _parse(source, state):
continue
if lo:
min = int(lo)
+ if min >= MAXREPEAT:
+ raise OverflowError("the repetition number is too large")
if hi:
max = int(hi)
- if max < min:
- raise error("bad repeat interval")
+ if max >= MAXREPEAT:
+ raise OverflowError("the repetition number is too large")
+ if max < min:
+ raise error("bad repeat interval")
else:
raise error("not supported")
# figure out which item to repeat
@@ -548,6 +553,8 @@ def _parse(source, state):
break
name = name + char
group = 1
+ if not name:
+ raise error("missing group name")
if not isname(name):
raise error("bad character in group name")
elif sourcematch("="):
@@ -560,6 +567,8 @@ def _parse(source, state):
if char == ")":
break
name = name + char
+ if not name:
+ raise error("missing group name")
if not isname(name):
raise error("bad character in group name")
gid = state.groupdict.get(name)
@@ -612,6 +621,8 @@ def _parse(source, state):
break
condname = condname + char
group = 2
+ if not condname:
+ raise error("missing group name")
if isname(condname):
condgroup = state.groupdict.get(condname)
if condgroup is None:
@@ -743,7 +754,7 @@ def parse_template(source, pattern):
break
name = name + char
if not name:
- raise error("bad group name")
+ raise error("missing group name")
try:
index = int(name)
if index < 0: