Skip to content

Commit

Permalink
patch 8.2.4959: using NULL regexp program
Browse files Browse the repository at this point in the history
Problem:    Using NULL regexp program.
Solution:   Check for regexp program becoming NULL in more places.
  • Loading branch information
brammool committed May 15, 2022
1 parent dd41037 commit b62dc5e
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 13 deletions.
35 changes: 22 additions & 13 deletions src/buffer.c
Expand Up @@ -2642,13 +2642,15 @@ buflist_findpat(
if (*p == '^' && !(attempt & 1)) // add/remove '^'
++p;
regmatch.regprog = vim_regcomp(p, magic_isset() ? RE_MAGIC : 0);
if (regmatch.regprog == NULL)
{
vim_free(pat);
return -1;
}

FOR_ALL_BUFS_FROM_LAST(buf)
{
if (regmatch.regprog == NULL)
{
// invalid pattern, possibly after switching engine
vim_free(pat);
return -1;
}
if (buf->b_p_bl == find_listed
#ifdef FEAT_DIFF
&& (!diffmode || diff_mode_buf(buf))
Expand All @@ -2674,6 +2676,7 @@ buflist_findpat(
}
match = buf->b_fnum; // remember first match
}
}

vim_regfree(regmatch.regprog);
if (match >= 0) // found one match
Expand Down Expand Up @@ -2766,12 +2769,6 @@ ExpandBufnames(
if (attempt > 0 && patc == pat)
break; // there was no anchor, no need to try again
regmatch.regprog = vim_regcomp(patc + attempt * 11, RE_MAGIC);
if (regmatch.regprog == NULL)
{
if (patc != pat)
vim_free(patc);
return FAIL;
}
}

// round == 1: Count the matches.
Expand All @@ -2792,7 +2789,16 @@ ExpandBufnames(
#endif

if (!fuzzy)
{
if (regmatch.regprog == NULL)
{
// invalid pattern, possibly after recompiling
if (patc != pat)
vim_free(patc);
return FAIL;
}
p = buflist_match(&regmatch, buf, p_wic);
}
else
{
p = NULL;
Expand Down Expand Up @@ -2921,6 +2927,7 @@ ExpandBufnames(

/*
* Check for a match on the file name for buffer "buf" with regprog "prog".
* Note that rmp->regprog may become NULL when switching regexp engine.
*/
static char_u *
buflist_match(
Expand All @@ -2939,7 +2946,8 @@ buflist_match(
}

/*
* Try matching the regexp in "prog" with file name "name".
* Try matching the regexp in "rmp->regprog" with file name "name".
* Note that rmp->regprog may become NULL when switching regexp engine.
* Return "name" when there is a match, NULL when not.
*/
static char_u *
Expand All @@ -2951,7 +2959,8 @@ fname_match(
char_u *match = NULL;
char_u *p;

if (name != NULL)
// extra check for valid arguments
if (name != NULL && rmp->regprog != NULL)
{
// Ignore case when 'fileignorecase' or the argument is set.
rmp->rm_ic = p_fic || ignore_case;
Expand Down
6 changes: 6 additions & 0 deletions src/testdir/test_buffer.vim
Expand Up @@ -419,6 +419,12 @@ func Test_buf_pattern_invalid()
vsplit 00000000000000000000000000
silent! buf [0--]\&\zs*\zs*e
bwipe!

" similar case with different code path
split 0
edit ÿ
silent! buf [0--]\&\zs*\zs*0
bwipe!
endfunc

" Test for the 'maxmem' and 'maxmemtot' options
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -746,6 +746,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4959,
/**/
4958,
/**/
Expand Down

0 comments on commit b62dc5e

Please sign in to comment.