mirror of
https://github.com/vim/vim.git
synced 2025-10-08 06:04:08 -04:00
updated for version 7.4.593
Problem: Crash when searching for "x\{0,90000}". (Dominique Pelle) Solution: Bail out from the NFA engine when the max limit is much higher than the min limit.
This commit is contained in:
13
src/regexp.c
13
src/regexp.c
@@ -8081,7 +8081,8 @@ vim_regcomp(expr_arg, re_flags)
|
|||||||
* First try the NFA engine, unless backtracking was requested.
|
* First try the NFA engine, unless backtracking was requested.
|
||||||
*/
|
*/
|
||||||
if (regexp_engine != BACKTRACKING_ENGINE)
|
if (regexp_engine != BACKTRACKING_ENGINE)
|
||||||
prog = nfa_regengine.regcomp(expr, re_flags);
|
prog = nfa_regengine.regcomp(expr,
|
||||||
|
re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0));
|
||||||
else
|
else
|
||||||
prog = bt_regengine.regcomp(expr, re_flags);
|
prog = bt_regengine.regcomp(expr, re_flags);
|
||||||
|
|
||||||
@@ -8105,16 +8106,14 @@ vim_regcomp(expr_arg, re_flags)
|
|||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* If the NFA engine failed, try the backtracking engine.
|
* If the NFA engine failed, try the backtracking engine.
|
||||||
* Disabled for now, both engines fail on the same patterns.
|
* The NFA engine also fails for patterns that it can't handle well
|
||||||
* Re-enable when regcomp() fails when the pattern would work better
|
* but are still valid patterns, thus a retry should work.
|
||||||
* with the other engine.
|
*/
|
||||||
*
|
|
||||||
if (regexp_engine == AUTOMATIC_ENGINE)
|
if (regexp_engine == AUTOMATIC_ENGINE)
|
||||||
{
|
{
|
||||||
|
regexp_engine = BACKTRACKING_ENGINE;
|
||||||
prog = bt_regengine.regcomp(expr, re_flags);
|
prog = bt_regengine.regcomp(expr, re_flags);
|
||||||
regexp_engine == BACKTRACKING_ENGINE;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prog != NULL)
|
if (prog != NULL)
|
||||||
|
@@ -244,6 +244,9 @@ static char_u e_nul_found[] = N_("E865: (NFA) Regexp end encountered prematurely
|
|||||||
static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c");
|
static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c");
|
||||||
static char_u e_ill_char_class[] = N_("E877: (NFA regexp) Invalid character class: %ld");
|
static char_u e_ill_char_class[] = N_("E877: (NFA regexp) Invalid character class: %ld");
|
||||||
|
|
||||||
|
/* re_flags passed to nfa_regcomp() */
|
||||||
|
static int nfa_re_flags;
|
||||||
|
|
||||||
/* NFA regexp \ze operator encountered. */
|
/* NFA regexp \ze operator encountered. */
|
||||||
static int nfa_has_zend;
|
static int nfa_has_zend;
|
||||||
|
|
||||||
@@ -2011,10 +2014,10 @@ nfa_regpiece()
|
|||||||
* <atom>* */
|
* <atom>* */
|
||||||
if (minval == 0 && maxval == MAX_LIMIT)
|
if (minval == 0 && maxval == MAX_LIMIT)
|
||||||
{
|
{
|
||||||
if (greedy)
|
if (greedy) /* { { (match the braces) */
|
||||||
/* \{}, \{0,} */
|
/* \{}, \{0,} */
|
||||||
EMIT(NFA_STAR);
|
EMIT(NFA_STAR);
|
||||||
else
|
else /* { { (match the braces) */
|
||||||
/* \{-}, \{-0,} */
|
/* \{-}, \{-0,} */
|
||||||
EMIT(NFA_STAR_NONGREEDY);
|
EMIT(NFA_STAR_NONGREEDY);
|
||||||
break;
|
break;
|
||||||
@@ -2030,6 +2033,12 @@ nfa_regpiece()
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The engine is very inefficient (uses too many states) when the
|
||||||
|
* maximum is much larger than the minimum. Bail out if we can
|
||||||
|
* use the other engine. */
|
||||||
|
if ((nfa_re_flags & RE_AUTO) && maxval > minval + 200)
|
||||||
|
return FAIL;
|
||||||
|
|
||||||
/* Ignore previous call to nfa_regatom() */
|
/* Ignore previous call to nfa_regatom() */
|
||||||
post_ptr = post_start + my_post_start;
|
post_ptr = post_start + my_post_start;
|
||||||
/* Save parse state after the repeated atom and the \{} */
|
/* Save parse state after the repeated atom and the \{} */
|
||||||
@@ -7046,6 +7055,7 @@ nfa_regcomp(expr, re_flags)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
nfa_regengine.expr = expr;
|
nfa_regengine.expr = expr;
|
||||||
|
nfa_re_flags = re_flags;
|
||||||
|
|
||||||
init_class_tab();
|
init_class_tab();
|
||||||
|
|
||||||
|
@@ -741,6 +741,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
593,
|
||||||
/**/
|
/**/
|
||||||
592,
|
592,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -1020,6 +1020,7 @@ extern char *(*dyn_libintl_textdomain)(const char *domainname);
|
|||||||
#define RE_MAGIC 1 /* 'magic' option */
|
#define RE_MAGIC 1 /* 'magic' option */
|
||||||
#define RE_STRING 2 /* match in string instead of buffer text */
|
#define RE_STRING 2 /* match in string instead of buffer text */
|
||||||
#define RE_STRICT 4 /* don't allow [abc] without ] */
|
#define RE_STRICT 4 /* don't allow [abc] without ] */
|
||||||
|
#define RE_AUTO 8 /* automatic engine selection */
|
||||||
|
|
||||||
#ifdef FEAT_SYN_HL
|
#ifdef FEAT_SYN_HL
|
||||||
/* values for reg_do_extmatch */
|
/* values for reg_do_extmatch */
|
||||||
|
Reference in New Issue
Block a user