In perl.git, the branch maint-5.24 has been updated <http://perl5.git.perl.org/perl.git/commitdiff/9ecaf4dba7ccf61301f3a0ca342810f57060fbd6?hp=78b60e17093d684bb07f20fc953075801b1ce207>
- Log ----------------------------------------------------------------- commit 9ecaf4dba7ccf61301f3a0ca342810f57060fbd6 Author: Yves Orton <[email protected]> Date: Wed May 3 08:35:43 2017 +0200 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. ----------------------------------------------------------------------- Summary of changes: regcomp.c | 25 +++++++++++-------------- t/re/re_tests | 2 -- 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 -- Perl5 Master Repository
