Mercurial > vim
diff src/regexp_nfa.c @ 14161:7cac4646c552 v8.1.0098
patch 8.1.0098: segfault when pattern with z() is very slow
commit https://github.com/vim/vim/commit/bcf9442307075bac40d44328c8bf7ea21857b138
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jun 23 14:21:42 2018 +0200
patch 8.1.0098: segfault when pattern with \z() is very slow
Problem: Segfault when pattern with \z() is very slow.
Solution: Check for NULL regprog. Add "nfa_fail" to test_override() to be
able to test this. Fix that 'searchhl' resets called_emsg.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 23 Jun 2018 14:30:07 +0200 |
parents | c9342023ea6f |
children | 99a96be12254 |
line wrap: on
line diff
--- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -1482,7 +1482,7 @@ nfa_regatom(void) case '8': case '9': /* \z1...\z9 */ - if (reg_do_extmatch != REX_USE) + if ((reg_do_extmatch & REX_USE) == 0) EMSG_RET_FAIL(_(e_z1_not_allowed)); EMIT(NFA_ZREF1 + (no_Magic(c) - '1')); /* No need to set nfa_has_backref, the sub-matches don't @@ -1491,7 +1491,7 @@ nfa_regatom(void) break; case '(': /* \z( */ - if (reg_do_extmatch != REX_SET) + if ((reg_do_extmatch & REX_SET) == 0) EMSG_RET_FAIL(_(e_z_not_allowed)); if (nfa_reg(REG_ZPAREN) == FAIL) return FAIL; /* cascaded error */ @@ -5692,7 +5692,8 @@ nfa_regmatch( nextlist->n = 0; /* clear nextlist */ nextlist->has_pim = FALSE; ++nfa_listid; - if (prog->re_engine == AUTOMATIC_ENGINE && nfa_listid >= NFA_MAX_STATES) + if (prog->re_engine == AUTOMATIC_ENGINE + && (nfa_listid >= NFA_MAX_STATES || nfa_fail_for_testing)) { /* too many states, retry with old engine */ nfa_match = NFA_TOO_EXPENSIVE;