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

Reply via email to