]> granicus.if.org Git - vim/commitdiff
updated for version 7.4b.002 v7.4b.002
authorBram Moolenaar <Bram@vim.org>
Thu, 1 Aug 2013 13:45:52 +0000 (15:45 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 1 Aug 2013 13:45:52 +0000 (15:45 +0200)
Problem:    Crash searching for \%(\%(\|\d\|-\|\.\)*\|\*\). (Marcin
            Szamotulski)  Also for \(\)*.
Solution:   Do add a state for opening parenthesis, so that we can check if it
            was added before at the same position.

src/regexp_nfa.c
src/testdir/test64.in
src/testdir/test64.ok
src/version.c

index 0b9917fe6e7f11ca649da639198d3afc9aa2e3e9..76501a8055ac7c21b70e9428622812166494632d 100644 (file)
@@ -3910,15 +3910,27 @@ addstate(l, state, subs_arg, pim, off)
        case NFA_ZCLOSE8:
        case NFA_ZCLOSE9:
 #endif
+       case NFA_MOPEN:
        case NFA_ZEND:
        case NFA_SPLIT:
-       case NFA_NOPEN:
        case NFA_SKIP_CHAR:
            /* These nodes are not added themselves but their "out" and/or
             * "out1" may be added below.  */
            break;
 
-       case NFA_MOPEN:
+       case NFA_BOL:
+       case NFA_BOF:
+           /* "^" won't match past end-of-line, don't bother trying.
+            * Except when at the end of the line, or when we are going to the
+            * next line for a look-behind match. */
+           if (reginput > regline
+                   && *reginput != NUL
+                   && (nfa_endp == NULL
+                       || !REG_MULTI
+                       || reglnum == nfa_endp->se_u.pos.lnum))
+               goto skip_add;
+           /* FALLTHROUGH */
+
        case NFA_MOPEN1:
        case NFA_MOPEN2:
        case NFA_MOPEN3:
@@ -3940,26 +3952,11 @@ addstate(l, state, subs_arg, pim, off)
        case NFA_ZOPEN8:
        case NFA_ZOPEN9:
 #endif
+       case NFA_NOPEN:
        case NFA_ZSTART:
-           /* These nodes do not need to be added, but we need to bail out
-            * when it was tried to be added to this list before. */
-           if (state->lastlist[nfa_ll_index] == l->id)
-               goto skip_add;
-           state->lastlist[nfa_ll_index] = l->id;
-           break;
-
-       case NFA_BOL:
-       case NFA_BOF:
-           /* "^" won't match past end-of-line, don't bother trying.
-            * Except when at the end of the line, or when we are going to the
-            * next line for a look-behind match. */
-           if (reginput > regline
-                   && *reginput != NUL
-                   && (nfa_endp == NULL
-                       || !REG_MULTI
-                       || reglnum == nfa_endp->se_u.pos.lnum))
-               goto skip_add;
-           /* FALLTHROUGH */
+           /* These nodes need to be added so that we can bail out when it
+            * was added to this list before at the same position to avoid an
+            * endless loop for "\(\)*" */
 
        default:
            if (state->lastlist[nfa_ll_index] == l->id)
@@ -6025,13 +6022,41 @@ nfa_regmatch(prog, start, submatch, m)
 #endif
                break;
 
+           case NFA_MOPEN1:
+           case NFA_MOPEN2:
+           case NFA_MOPEN3:
+           case NFA_MOPEN4:
+           case NFA_MOPEN5:
+           case NFA_MOPEN6:
+           case NFA_MOPEN7:
+           case NFA_MOPEN8:
+           case NFA_MOPEN9:
+#ifdef FEAT_SYN_HL
+           case NFA_ZOPEN:
+           case NFA_ZOPEN1:
+           case NFA_ZOPEN2:
+           case NFA_ZOPEN3:
+           case NFA_ZOPEN4:
+           case NFA_ZOPEN5:
+           case NFA_ZOPEN6:
+           case NFA_ZOPEN7:
+           case NFA_ZOPEN8:
+           case NFA_ZOPEN9:
+#endif
+           case NFA_NOPEN:
+           case NFA_ZSTART:
+               /* These states are only added to be able to bail out when
+                * they are added again, nothing is to be done. */
+               break;
+
            default:    /* regular character */
              {
                int c = t->state->c;
 
-               /* TODO: put this in #ifdef later */
+#ifdef DEBUG
                if (c < 0)
                    EMSGN("INTERNAL: Negative state char: %ld", c);
+#endif
                result = (c == curc);
 
                if (!result && ireg_ic)
index 82669b0479bf11c2e1ed1d6da827ce0c79e6694d..e666ab95a864f6a7ef073585bd2a52fee09df895 100644 (file)
@@ -340,6 +340,7 @@ STARTTEST
 :call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo bar '])
 :call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo'])
 :call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:'])
+:call add(tl, [2, '[ ]\@!\p\([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:', 's'])
 :call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe'])
 :call add(tl, [2, '\%(\U\@<=S\k*\|S\l\)R', 'SuR', 'SuR'])
 :"
index d08227f2ce112bea67c17ab89d99afb19dbd168e..c778e9eef7417c1a5cac174fca06323f09ae60f2 100644 (file)
@@ -776,6 +776,9 @@ OK 2 - ^\%(.*bar\)\@!.*\zsfoo
 OK 0 - [ ]\@!\p\%([ ]\@!\p\)*:
 OK 1 - [ ]\@!\p\%([ ]\@!\p\)*:
 OK 2 - [ ]\@!\p\%([ ]\@!\p\)*:
+OK 0 - [ ]\@!\p\([ ]\@!\p\)*:
+OK 1 - [ ]\@!\p\([ ]\@!\p\)*:
+OK 2 - [ ]\@!\p\([ ]\@!\p\)*:
 OK 0 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e
 OK 1 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e
 OK 2 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e
index 8eccd3cf08d8b0aa55cd7dc1e4595a1c9087cc92..f23fd0d78af70b4d04cf26b696d5ae458b2ab2f8 100644 (file)
@@ -727,6 +727,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2,
 /**/
     1,
 /**/