From 0506c64086e2535335a58b9368d2b940abbf8c11 Mon Sep 17 00:00:00 2001 From: Gustavo Niemeyer Date: Fri, 3 Sep 2004 18:11:59 +0000 Subject: [PATCH] Fixing bug #817234, which made SRE get into an infinite loop on empty final matches with finditer(). New test cases included for this bug and for #581080. --- Lib/test/test_re.py | 16 ++++++++++++++++ Modules/_sre.c | 8 +++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 8f66ae918c7..9e5fe0d5473 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -567,6 +567,22 @@ class ReTests(unittest.TestCase): self.assertEqual(re.compile(pattern).split("a.b.c"), ['a','b','c']) + def test_bug_581080(self): + iter = re.finditer(r"\s", "a b") + self.assertEqual(iter.next().span(), (1,2)) + self.assertRaises(StopIteration, iter.next) + + scanner = re.compile(r"\s").scanner("a b") + self.assertEqual(scanner.search().span(), (1, 2)) + self.assertEqual(scanner.search(), None) + + def test_bug_817234(self): + iter = re.finditer(r".*", "asdf") + self.assertEqual(iter.next().span(), (0, 4)) + self.assertEqual(iter.next().span(), (4, 4)) + self.assertRaises(StopIteration, iter.next) + + def run_re_tests(): from test.re_tests import benchmarks, tests, SUCCEED, FAIL, SYNTAX_ERROR if verbose: diff --git a/Modules/_sre.c b/Modules/_sre.c index 4be33d04ca8..161422441e9 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -539,7 +539,7 @@ SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, int maxcount) break; case SRE_OP_ANY_ALL: - /* repeated dot wildcare. skip to the end of the target + /* repeated dot wildcard. skip to the end of the target string, and backtrack from there */ TRACE(("|%p|%p|COUNT ANY_ALL\n", pattern, ptr)); ptr = end; @@ -3244,8 +3244,7 @@ scanner_match(ScannerObject* self, PyObject* args) match = pattern_new_match((PatternObject*) self->pattern, state, status); - if ((status == 0 || state->ptr == state->start) && - state->ptr < state->end) + if (status == 0 || state->ptr == state->start) state->start = (void*) ((char*) state->ptr + state->charsize); else state->start = state->ptr; @@ -3276,8 +3275,7 @@ scanner_search(ScannerObject* self, PyObject* args) match = pattern_new_match((PatternObject*) self->pattern, state, status); - if ((status == 0 || state->ptr == state->start) && - state->ptr < state->end) + if (status == 0 || state->ptr == state->start) state->start = (void*) ((char*) state->ptr + state->charsize); else state->start = state->ptr;