Commit fa25a7d5 authored by Fredrik Lundh's avatar Fredrik Lundh

-- don't use recursion for unbounded non-greedy repeat

(bugs #115903, #115696)

This is based on a patch by Darrel Gallion.  I'm not 100%
sure about this fix, but I haven't managed to come up with
any test case it cannot handle...
parent 07e99cb7
...@@ -248,7 +248,7 @@ test(r"""sre.match(r'(x)*', 50000*'x').span()""", ...@@ -248,7 +248,7 @@ test(r"""sre.match(r'(x)*', 50000*'x').span()""",
test(r"""sre.match(r'(x)*y', 50000*'x'+'y').span()""", test(r"""sre.match(r'(x)*y', 50000*'x'+'y').span()""",
(0, 50001), RuntimeError) (0, 50001), RuntimeError)
test(r"""sre.match(r'(x)*?y', 50000*'x'+'y').span()""", test(r"""sre.match(r'(x)*?y', 50000*'x'+'y').span()""",
(0, 50001), RuntimeError) (0, 50001)) # this works in 2.1
from re_tests import * from re_tests import *
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
* 2000-10-24 fl really fixed assert_not; reset groups in findall * 2000-10-24 fl really fixed assert_not; reset groups in findall
* 2000-12-21 fl fixed memory leak in groupdict * 2000-12-21 fl fixed memory leak in groupdict
* 2001-01-02 fl properly reset pointer after failed assertion in MIN_UNTIL * 2001-01-02 fl properly reset pointer after failed assertion in MIN_UNTIL
* 2001-01-15 fl don't use recursion for unbounded MIN_UTIL
* *
* Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved.
* *
...@@ -38,7 +39,7 @@ ...@@ -38,7 +39,7 @@
#ifndef SRE_RECURSIVE #ifndef SRE_RECURSIVE
char copyright[] = " SRE 0.9.9 Copyright (c) 1997-2000 by Secret Labs AB "; char copyright[] = " SRE 0.9.9 Copyright (c) 1997-2001 by Secret Labs AB ";
#include "Python.h" #include "Python.h"
...@@ -1012,11 +1013,21 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level) ...@@ -1012,11 +1013,21 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
/* see if the tail matches */ /* see if the tail matches */
state->repeat = rp->prev; state->repeat = rp->prev;
i = SRE_MATCH(state, pattern, level + 1); if (rp->pattern[2] == 65535) {
/* unbounded repeat */
for (;;) {
i = SRE_MATCH(state, pattern, level + 1);
if (i || ptr >= end)
break;
state->ptr = ++ptr;
}
} else
i = SRE_MATCH(state, pattern, level + 1);
if (i) { if (i) {
/* free(rp); */ /* free(rp); */
return i; return i;
} }
state->ptr = ptr; state->ptr = ptr;
state->repeat = rp; state->repeat = rp;
......
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