summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYves Orton <demerphq@gmail.com>2017-05-03 08:35:43 +0200
committerYves Orton <demerphq@gmail.com>2017-05-03 08:36:14 +0200
commit9ecaf4dba7ccf61301f3a0ca342810f57060fbd6 (patch)
tree713325c3de8b8d4f021d9e05ac862576ec1dfc17
parent78b60e17093d684bb07f20fc953075801b1ce207 (diff)
downloadperl-9ecaf4dba7ccf61301f3a0ca342810f57060fbd6.tar.gz
Bulk revert regex recursion fixes - REVERT THIS PATCH AFTER 5.24.2
Revert "Add tests for regex recursion" This reverts commit 78b60e17093d684bb07f20fc953075801b1ce207. Revert "fix #128109 - do not move RExC_open_parens[0] in reginsert" This reverts commit 4539ae3741e1a4de9a54e5bc52524b40abc2d58a. Revert "fix #128085 - SIGSEGV in S_regmatch with S_study_chunk: Assertion "!frame" failed." This reverts commit 5edefd5d2abb0a8696bd2159e1f17b5975257818.
-rw-r--r--regcomp.c25
-rw-r--r--t/re/re_tests2
2 files changed, 11 insertions, 16 deletions
diff --git a/regcomp.c b/regcomp.c
index cbaad1e33a..be6cb96a70 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -222,7 +222,6 @@ struct RExC_state_t {
#endif
bool seen_unfolded_sharp_s;
bool strict;
- bool study_started;
};
#define RExC_flags (pRExC_state->flags)
@@ -289,7 +288,6 @@ struct RExC_state_t {
#define RExC_frame_last (pRExC_state->frame_last)
#define RExC_frame_count (pRExC_state->frame_count)
#define RExC_strict (pRExC_state->strict)
-#define RExC_study_started (pRExC_state->study_started)
/* Heuristic check on the complexity of the pattern: if TOO_NAUGHTY, we set
* a flag to disable back-off on the fixed/floating substrings - if it's
@@ -4104,7 +4102,6 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
GET_RE_DEBUG_FLAGS_DECL;
PERL_ARGS_ASSERT_STUDY_CHUNK;
- RExC_study_started= 1;
if ( depth == 0 ) {
@@ -5902,10 +5899,15 @@ Perl_re_printf( aTHX_ "LHS=%"UVuf" RHS=%"UVuf"\n",
/* Else: zero-length, ignore. */
scan = regnext(scan);
}
-
- finish:
+ /* If we are exiting a recursion we can unset its recursed bit
+ * and allow ourselves to enter it again - no danger of an
+ * infinite loop there.
+ if (stopparen > -1 && recursed) {
+ DEBUG_STUDYDATA("unset:", data,depth);
+ PAREN_UNSET( recursed, stopparen);
+ }
+ */
if (frame) {
- /* we need to unwind recursion. */
depth = depth - 1;
DEBUG_STUDYDATA("frame-end:",data,depth);
@@ -5922,6 +5924,7 @@ Perl_re_printf( aTHX_ "LHS=%"UVuf" RHS=%"UVuf"\n",
goto fake_study_recurse;
}
+ finish:
assert(!frame);
DEBUG_STUDYDATA("pre-fin:",data,depth);
@@ -6880,7 +6883,6 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
RExC_contains_locale = 0;
RExC_contains_i = 0;
RExC_strict = cBOOL(pm_flags & RXf_PMf_STRICT);
- RExC_study_started = 0;
pRExC_state->runtime_code_qr = NULL;
RExC_frame_head= NULL;
RExC_frame_last= NULL;
@@ -18239,9 +18241,7 @@ S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth)
RExC_size += size;
return;
}
- assert(!RExC_study_started); /* I believe we should never use reginsert once we have started
- studying. If this is wrong then we need to adjust RExC_recurse
- below like we do with RExC_open_parens/RExC_close_parens. */
+
src = RExC_emit;
RExC_emit += size;
dst = RExC_emit;
@@ -18252,10 +18252,7 @@ S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth)
* iow it is 1 more than the number of parens seen in
* the pattern so far. */
for ( paren=0 ; paren < RExC_npar ; paren++ ) {
- /* note, RExC_open_parens[0] is the start of the
- * regex, it can't move. RExC_close_parens[0] is the end
- * of the regex, it *can* move. */
- if ( paren && RExC_open_parens[paren] >= opnd ) {
+ if ( RExC_open_parens[paren] >= opnd ) {
/*DEBUG_PARSE_FMT("open"," - %d",size);*/
RExC_open_parens[paren] += size;
} else {
diff --git a/t/re/re_tests b/t/re/re_tests
index 7e8522da98..34ac94a213 100644
--- a/t/re/re_tests
+++ b/t/re/re_tests
@@ -1966,8 +1966,6 @@ ab(?#Comment){2}c abbc y $& abbc
.{1}?? - c - Nested quantifiers
.{1}?+ - c - Nested quantifiers
(?:.||)(?|)000000000@ 000000000@ y $& 000000000@ # [perl #126405]
-aa$|a(?R)a|a aaa y $& aaa # [perl 128420] recursive matches
-(?:\1|a)([bcd])\1(?:(?R)|e)\1 abbaccaddedcb y $& abbaccaddedcb # [perl 128420] recursive match with backreferences
# Keep these lines at the end of the file
# vim: softtabstop=0 noexpandtab