forked from aniani/vim
patch 8.2.4687: "vimgrep /\%v/ *" may cause a crash
Problem: "vimgrep /\%v/ *" may cause a crash. Solution: When compiling the pattern with the old engine fails, restore the regprog of the new engine instead of leaving it NULL. (closes #10079)
This commit is contained in:
14
src/regexp.c
14
src/regexp.c
@@ -2874,9 +2874,10 @@ vim_regexec_multi(
|
|||||||
char_u *pat = vim_strsave(((nfa_regprog_T *)rmp->regprog)->pattern);
|
char_u *pat = vim_strsave(((nfa_regprog_T *)rmp->regprog)->pattern);
|
||||||
|
|
||||||
p_re = BACKTRACKING_ENGINE;
|
p_re = BACKTRACKING_ENGINE;
|
||||||
vim_regfree(rmp->regprog);
|
|
||||||
if (pat != NULL)
|
if (pat != NULL)
|
||||||
{
|
{
|
||||||
|
regprog_T *prev_prog = rmp->regprog;
|
||||||
|
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
report_re_switch(pat);
|
report_re_switch(pat);
|
||||||
#endif
|
#endif
|
||||||
@@ -2889,9 +2890,16 @@ vim_regexec_multi(
|
|||||||
#ifdef FEAT_SYN_HL
|
#ifdef FEAT_SYN_HL
|
||||||
reg_do_extmatch = 0;
|
reg_do_extmatch = 0;
|
||||||
#endif
|
#endif
|
||||||
|
if (rmp->regprog == NULL)
|
||||||
if (rmp->regprog != NULL)
|
|
||||||
{
|
{
|
||||||
|
// Somehow compiling the pattern failed now, put back the
|
||||||
|
// previous one to avoid "regprog" becoming NULL.
|
||||||
|
rmp->regprog = prev_prog;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vim_regfree(prev_prog);
|
||||||
|
|
||||||
rmp->regprog->re_in_use = TRUE;
|
rmp->regprog->re_in_use = TRUE;
|
||||||
result = rmp->regprog->engine->regexec_multi(
|
result = rmp->regprog->engine->regexec_multi(
|
||||||
rmp, win, buf, lnum, col, tm, timed_out);
|
rmp, win, buf, lnum, col, tm, timed_out);
|
||||||
|
@@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
4687,
|
||||||
/**/
|
/**/
|
||||||
4686,
|
4686,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user