mirror of
https://github.com/python/cpython.git
synced 2025-12-04 16:43:27 +00:00
-- 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...
This commit is contained in:
parent
07e99cb774
commit
fa25a7d51f
2 changed files with 14 additions and 3 deletions
|
|
@ -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 @@
|
||||||
* 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 @@
|
||||||
|
|
||||||
#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)
|
||||||
|
|
||||||
/* see if the tail matches */
|
/* see if the tail matches */
|
||||||
state->repeat = rp->prev;
|
state->repeat = rp->prev;
|
||||||
|
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);
|
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;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue