summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-04-04 18:14:34 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-04 18:14:34 +0100
commite8a4c0d91f89544e4f94b7bd612b5fb780944c33 (patch)
tree8c23d6fc9f8fba0a301d7a0b665bfaea187d3855
parentb471690fad5f40f74aca488b13669641fb2b9de1 (diff)
patch 8.2.4687: "vimgrep /\%v/ *" may cause a crashv8.2.4687
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)
-rw-r--r--src/regexp.c14
-rw-r--r--src/version.c2
2 files changed, 13 insertions, 3 deletions
diff --git a/src/regexp.c b/src/regexp.c
index 110d76d042..c031cc9966 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -2874,9 +2874,10 @@ vim_regexec_multi(
char_u *pat = vim_strsave(((nfa_regprog_T *)rmp->regprog)->pattern);
p_re = BACKTRACKING_ENGINE;
- vim_regfree(rmp->regprog);
if (pat != NULL)
{
+ regprog_T *prev_prog = rmp->regprog;
+
#ifdef FEAT_EVAL
report_re_switch(pat);
#endif
@@ -2889,9 +2890,16 @@ vim_regexec_multi(
#ifdef FEAT_SYN_HL
reg_do_extmatch = 0;
#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;
result = rmp->regprog->engine->regexec_multi(
rmp, win, buf, lnum, col, tm, timed_out);
diff --git a/src/version.c b/src/version.c
index fffd85f2a9..23dede051a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4687,
+/**/
4686,
/**/
4685,