To: vim_dev@googlegroups.com Subject: Patch 7.4b.002 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///