Patch 7.4b.002
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.
Files:      src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok


*** ../vim-7.4b.001/src/regexp_nfa.c    2013-07-21 18:54:02.000000000 +0200
--- src/regexp_nfa.c    2013-08-01 15:27:19.000000000 +0200
***************
*** 3910,3924 ****
        case NFA_ZCLOSE8:
        case NFA_ZCLOSE9:
  #endif
        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_MOPEN1:
        case NFA_MOPEN2:
        case NFA_MOPEN3:
--- 3910,3936 ----
        case NFA_ZCLOSE8:
        case NFA_ZCLOSE9:
  #endif
+       case NFA_MOPEN:
        case NFA_ZEND:
        case NFA_SPLIT:
        case NFA_SKIP_CHAR:
            /* These nodes are not added themselves but their "out" and/or
             * "out1" may be added below.  */
            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 */
! 
        case NFA_MOPEN1:
        case NFA_MOPEN2:
        case NFA_MOPEN3:
***************
*** 3940,3965 ****
        case NFA_ZOPEN8:
        case NFA_ZOPEN9:
  #endif
        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 */
  
        default:
            if (state->lastlist[nfa_ll_index] == l->id)
--- 3952,3962 ----
        case NFA_ZOPEN8:
        case NFA_ZOPEN9:
  #endif
+       case NFA_NOPEN:
        case NFA_ZSTART:
!           /* 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,6037 ****
  #endif
                break;
  
            default:    /* regular character */
              {
                int c = t->state->c;
  
!               /* TODO: put this in #ifdef later */
                if (c < 0)
                    EMSGN("INTERNAL: Negative state char: %ld", c);
                result = (c == curc);
  
                if (!result && ireg_ic)
--- 6022,6062 ----
  #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;
  
! #ifdef DEBUG
                if (c < 0)
                    EMSGN("INTERNAL: Negative state char: %ld", c);
+ #endif
                result = (c == curc);
  
                if (!result && ireg_ic)
*** ../vim-7.4b.001/src/testdir/test64.in       2013-07-21 18:53:22.000000000 
+0200
--- src/testdir/test64.in       2013-08-01 15:16:02.000000000 +0200
***************
*** 340,345 ****
--- 340,346 ----
  :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'])
  :"
*** ../vim-7.4b.001/src/testdir/test64.ok       2013-07-21 18:55:44.000000000 
+0200
--- src/testdir/test64.ok       2013-08-01 15:28:34.000000000 +0200
***************
*** 776,781 ****
--- 776,784 ----
  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
*** ../vim-7.4b.001/src/version.c       2013-08-01 13:20:23.000000000 +0200
--- src/version.c       2013-08-01 15:33:20.000000000 +0200
***************
*** 729,730 ****
--- 729,732 ----
  {   /* Add new patch number below this line */
+ /**/
+     2,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
34. You laugh at people with a 10 Mbit connection.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui