diff options
author | Yves Orton <demerphq@gmail.com> | 2017-05-03 08:35:43 +0200 |
---|---|---|
committer | Yves Orton <demerphq@gmail.com> | 2017-05-03 08:36:14 +0200 |
commit | 9ecaf4dba7ccf61301f3a0ca342810f57060fbd6 (patch) | |
tree | 713325c3de8b8d4f021d9e05ac862576ec1dfc17 | |
parent | 78b60e17093d684bb07f20fc953075801b1ce207 (diff) | |
download | perl-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.c | 25 | ||||
-rw-r--r-- | t/re/re_tests | 2 |
2 files changed, 11 insertions, 16 deletions
@@ -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 |