diff options
Diffstat (limited to 'data/vim/patches/8.1.0905')
-rw-r--r-- | data/vim/patches/8.1.0905 | 371 |
1 files changed, 0 insertions, 371 deletions
diff --git a/data/vim/patches/8.1.0905 b/data/vim/patches/8.1.0905 deleted file mode 100644 index ad92ff458..000000000 --- a/data/vim/patches/8.1.0905 +++ /dev/null @@ -1,371 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.0905 -Fcc: outbox -From: Bram Moolenaar <Bram@moolenaar.net> -Mime-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit ------------- - -Patch 8.1.0905 -Problem: Complicated regexp causes a crash. (Kuang-che Wu) -Solution: Limit the recursiveness of addstate(). (closes #3941) -Files: src/regexp_nfa.c, src/testdir/test_regexp_latin.vim - - -*** ../vim-8.1.0904/src/regexp_nfa.c 2019-01-31 15:34:35.864056935 +0100 ---- src/regexp_nfa.c 2019-02-12 23:05:19.968038497 +0100 -*************** -*** 4284,4289 **** ---- 4284,4290 ---- - /* - * Add "state" and possibly what follows to state list ".". - * Returns "subs_arg", possibly copied into temp_subs. -+ * Returns NULL when recursiveness is too deep. - */ - static regsubs_T * - addstate( -*************** -*** 4310,4315 **** ---- 4311,4325 ---- - #ifdef ENABLE_LOG - int did_print = FALSE; - #endif -+ static int depth = 0; -+ -+ // This function is called recursively. When the depth is too much we run -+ // out of stack and crash, limit recursiveness here. -+ if (++depth >= 10000 || subs == NULL) -+ { -+ --depth; -+ return NULL; -+ } - - if (off_arg <= -ADDSTATE_HERE_OFFSET) - { -*************** -*** 4421,4426 **** ---- 4431,4437 ---- - abs(state->id), l->id, state->c, code, - pim == NULL ? "NULL" : "yes", l->has_pim, found); - #endif -+ --depth; - return subs; - } - } -*************** -*** 4595,4601 **** - } - - subs = addstate(l, state->out, subs, pim, off_arg); -! /* "subs" may have changed, need to set "sub" again */ - #ifdef FEAT_SYN_HL - if (state->c >= NFA_ZOPEN && state->c <= NFA_ZOPEN9) - sub = &subs->synt; ---- 4606,4614 ---- - } - - subs = addstate(l, state->out, subs, pim, off_arg); -! if (subs == NULL) -! break; -! // "subs" may have changed, need to set "sub" again - #ifdef FEAT_SYN_HL - if (state->c >= NFA_ZOPEN && state->c <= NFA_ZOPEN9) - sub = &subs->synt; -*************** -*** 4619,4625 **** - ? subs->norm.list.multi[0].end_lnum >= 0 - : subs->norm.list.line[0].end != NULL)) - { -! /* Do not overwrite the position set by \ze. */ - subs = addstate(l, state->out, subs, pim, off_arg); - break; - } ---- 4632,4638 ---- - ? subs->norm.list.multi[0].end_lnum >= 0 - : subs->norm.list.line[0].end != NULL)) - { -! // Do not overwrite the position set by \ze. - subs = addstate(l, state->out, subs, pim, off_arg); - break; - } -*************** -*** 4695,4700 **** ---- 4708,4715 ---- - } - - subs = addstate(l, state->out, subs, pim, off_arg); -+ if (subs == NULL) -+ break; - /* "subs" may have changed, need to set "sub" again */ - #ifdef FEAT_SYN_HL - if (state->c >= NFA_ZCLOSE && state->c <= NFA_ZCLOSE9) -*************** -*** 4710,4715 **** ---- 4725,4731 ---- - sub->in_use = save_in_use; - break; - } -+ --depth; - return subs; - } - -*************** -*** 4719,4725 **** - * This makes sure the order of states to be tried does not change, which - * matters for alternatives. - */ -! static void - addstate_here( - nfa_list_T *l, /* runtime state list */ - nfa_state_T *state, /* state to update */ ---- 4735,4741 ---- - * This makes sure the order of states to be tried does not change, which - * matters for alternatives. - */ -! static regsubs_T * - addstate_here( - nfa_list_T *l, /* runtime state list */ - nfa_state_T *state, /* state to update */ -*************** -*** 4730,4752 **** - int tlen = l->n; - int count; - int listidx = *ip; - - /* First add the state(s) at the end, so that we know how many there are. - * Pass the listidx as offset (avoids adding another argument to - * addstate(). */ -! addstate(l, state, subs, pim, -listidx - ADDSTATE_HERE_OFFSET); - -! /* when "*ip" was at the end of the list, nothing to do */ - if (listidx + 1 == tlen) -! return; - -! /* re-order to put the new state at the current position */ - count = l->n - tlen; - if (count == 0) -! return; /* no state got added */ - if (count == 1) - { -! /* overwrite the current state */ - l->t[listidx] = l->t[l->n - 1]; - } - else if (count > 1) ---- 4746,4771 ---- - int tlen = l->n; - int count; - int listidx = *ip; -+ regsubs_T *r; - - /* First add the state(s) at the end, so that we know how many there are. - * Pass the listidx as offset (avoids adding another argument to - * addstate(). */ -! r = addstate(l, state, subs, pim, -listidx - ADDSTATE_HERE_OFFSET); -! if (r == NULL) -! return r; - -! // when "*ip" was at the end of the list, nothing to do - if (listidx + 1 == tlen) -! return r; - -! // re-order to put the new state at the current position - count = l->n - tlen; - if (count == 0) -! return r; // no state got added - if (count == 1) - { -! // overwrite the current state - l->t[listidx] = l->t[l->n - 1]; - } - else if (count > 1) -*************** -*** 4760,4766 **** - l->len = l->len * 3 / 2 + 50; - newl = (nfa_thread_T *)alloc(l->len * sizeof(nfa_thread_T)); - if (newl == NULL) -! return; - mch_memmove(&(newl[0]), - &(l->t[0]), - sizeof(nfa_thread_T) * listidx); ---- 4779,4785 ---- - l->len = l->len * 3 / 2 + 50; - newl = (nfa_thread_T *)alloc(l->len * sizeof(nfa_thread_T)); - if (newl == NULL) -! return r; - mch_memmove(&(newl[0]), - &(l->t[0]), - sizeof(nfa_thread_T) * listidx); -*************** -*** 4787,4792 **** ---- 4806,4813 ---- - } - --l->n; - *ip = listidx - 1; -+ -+ return r; - } - - /* -*************** -*** 5493,5498 **** ---- 5514,5520 ---- - int add_count; - int add_off = 0; - int toplevel = start->c == NFA_MOPEN; -+ regsubs_T *r; - #ifdef NFA_REGEXP_DEBUG_LOG - FILE *debug; - #endif -*************** -*** 5567,5576 **** - else - m->norm.list.line[0].start = rex.input; - m->norm.in_use = 1; -! addstate(thislist, start->out, m, NULL, 0); - } - else -! addstate(thislist, start, m, NULL, 0); - - #define ADD_STATE_IF_MATCH(state) \ - if (result) { \ ---- 5589,5603 ---- - else - m->norm.list.line[0].start = rex.input; - m->norm.in_use = 1; -! r = addstate(thislist, start->out, m, NULL, 0); - } - else -! r = addstate(thislist, start, m, NULL, 0); -! if (r == NULL) -! { -! nfa_match = NFA_TOO_EXPENSIVE; -! goto theend; -! } - - #define ADD_STATE_IF_MATCH(state) \ - if (result) { \ -*************** -*** 5874,5881 **** - /* t->state->out1 is the corresponding END_INVISIBLE - * node; Add its out to the current list (zero-width - * match). */ -! addstate_here(thislist, t->state->out1->out, &t->subs, -! &pim, &listidx); - } - } - break; ---- 5901,5912 ---- - /* t->state->out1 is the corresponding END_INVISIBLE - * node; Add its out to the current list (zero-width - * match). */ -! if (addstate_here(thislist, t->state->out1->out, -! &t->subs, &pim, &listidx) == NULL) -! { -! nfa_match = NFA_TOO_EXPENSIVE; -! goto theend; -! } - } - } - break; -*************** -*** 6749,6761 **** - } - - if (add_here) -! addstate_here(thislist, add_state, &t->subs, pim, &listidx); - else - { -! addstate(nextlist, add_state, &t->subs, pim, add_off); - if (add_count > 0) - nextlist->t[nextlist->n - 1].count = add_count; - } - } - - } /* for (thislist = thislist; thislist->state; thislist++) */ ---- 6780,6798 ---- - } - - if (add_here) -! r = addstate_here(thislist, add_state, &t->subs, -! pim, &listidx); - else - { -! r = addstate(nextlist, add_state, &t->subs, pim, add_off); - if (add_count > 0) - nextlist->t[nextlist->n - 1].count = add_count; - } -+ if (r == NULL) -+ { -+ nfa_match = NFA_TOO_EXPENSIVE; -+ goto theend; -+ } - } - - } /* for (thislist = thislist; thislist->state; thislist++) */ -*************** -*** 6831,6841 **** - (colnr_T)(rex.input - rex.line) + clen; - else - m->norm.list.line[0].start = rex.input + clen; -! addstate(nextlist, start->out, m, NULL, clen); - } - } - else -! addstate(nextlist, start, m, NULL, clen); - } - - #ifdef ENABLE_LOG ---- 6868,6888 ---- - (colnr_T)(rex.input - rex.line) + clen; - else - m->norm.list.line[0].start = rex.input + clen; -! if (addstate(nextlist, start->out, m, NULL, clen) == NULL) -! { -! nfa_match = NFA_TOO_EXPENSIVE; -! goto theend; -! } - } - } - else -! { -! if (addstate(nextlist, start, m, NULL, clen) == NULL) -! { -! nfa_match = NFA_TOO_EXPENSIVE; -! goto theend; -! } -! } - } - - #ifdef ENABLE_LOG -*** ../vim-8.1.0904/src/testdir/test_regexp_latin.vim 2019-01-14 23:19:26.244853406 +0100 ---- src/testdir/test_regexp_latin.vim 2019-02-12 23:04:40.336347263 +0100 -*************** -*** 84,86 **** ---- 84,92 ---- - call assert_fails('/a\{a}', 'E870:') - set re=0 - endfunc -+ -+ func Test_recursive_addstate() -+ " This will call addstate() recursively until it runs into the limit. -+ let lnum = search('\v((){328}){389}') -+ call assert_equal(0, lnum) -+ endfunc -*** ../vim-8.1.0904/src/version.c 2019-02-12 22:37:24.181961482 +0100 ---- src/version.c 2019-02-12 22:58:41.059230984 +0100 -*************** -*** 785,786 **** ---- 785,788 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 905, - /**/ - --- -To keep milk from turning sour: Keep it in the cow. - - /// 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 /// |