summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2008-09-10 14:27:00 (GMT)
committerGuido van Rossum <guido@python.org>2008-09-10 14:27:00 (GMT)
commite3c4fd9cc04148e16dad3ca06af65008f2e73fe3 (patch)
tree753835c1736690ef88b3d07125267c3db2944ccb
parent24329ba1762688f78ff589d0243683c4afafe096 (diff)
downloadcpython-e3c4fd9cc04148e16dad3ca06af65008f2e73fe3.zip
cpython-e3c4fd9cc04148e16dad3ca06af65008f2e73fe3.tar.gz
cpython-e3c4fd9cc04148e16dad3ca06af65008f2e73fe3.tar.bz2
- Issue #3629: Fix sre "bytecode" validator for an end case.
Reviewed by Amaury.
-rw-r--r--Lib/test/test_re.py4
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/_sre.c7
3 files changed, 10 insertions, 3 deletions
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index 70bd886..feb7160 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -116,6 +116,10 @@ class ReTests(unittest.TestCase):
self.assertRaises(ValueError, re.findall, pattern, 'A', re.I)
self.assertRaises(ValueError, re.compile, pattern, re.I)
+ def test_bug_3629(self):
+ # A regex that triggered a bug in the sre-code validator
+ re.compile("(?P<quote>)(?(quote))")
+
def test_sub_template_numeric_escape(self):
# bug 776311 and friends
self.assertEqual(re.sub('x', r'\0', 'x'), '\0')
diff --git a/Misc/NEWS b/Misc/NEWS
index 08b2020..4696a80 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -68,6 +68,8 @@ C-API
Library
-------
+- Issue #3629: Fix sre "bytecode" validator for an end case.
+
- Issue #3811: The Unicode database was updated to 5.1.
- Issue #3809: Fixed spurious 'test.blah' file left behind by test_logging.
diff --git a/Modules/_sre.c b/Modules/_sre.c
index 9111921..1aea53b 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -2781,17 +2781,18 @@ _compile(PyObject* self_, PyObject* args)
arg = *code++; \
VTRACE(("%lu (arg)\n", (unsigned long)arg)); \
} while (0)
-#define GET_SKIP \
+#define GET_SKIP_ADJ(adj) \
do { \
VTRACE(("%p= ", code)); \
if (code >= end) FAIL; \
skip = *code; \
VTRACE(("%lu (skip to %p)\n", \
(unsigned long)skip, code+skip)); \
- if (code+skip < code || code+skip > end) \
+ if (code+skip-adj < code || code+skip-adj > end)\
FAIL; \
code++; \
} while (0)
+#define GET_SKIP GET_SKIP_ADJ(0)
static int
_validate_charset(SRE_CODE *code, SRE_CODE *end)
@@ -3098,7 +3099,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
GET_ARG;
if (arg >= groups)
FAIL;
- GET_SKIP;
+ GET_SKIP_ADJ(1);
code--; /* The skip is relative to the first arg! */
/* There are two possibilities here: if there is both a 'then'
part and an 'else' part, the generated code looks like: