0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.4959: using NULL regexp program

Problem:    Using NULL regexp program.
Solution:   Check for regexp program becoming NULL in more places.
This commit is contained in:
Bram Moolenaar
2022-05-15 14:50:12 +01:00
parent dd41037552
commit b62dc5e782
3 changed files with 30 additions and 13 deletions

View File

@@ -2642,13 +2642,15 @@ buflist_findpat(
if (*p == '^' && !(attempt & 1)) // add/remove '^' if (*p == '^' && !(attempt & 1)) // add/remove '^'
++p; ++p;
regmatch.regprog = vim_regcomp(p, magic_isset() ? RE_MAGIC : 0); 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) 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 if (buf->b_p_bl == find_listed
#ifdef FEAT_DIFF #ifdef FEAT_DIFF
&& (!diffmode || diff_mode_buf(buf)) && (!diffmode || diff_mode_buf(buf))
@@ -2674,6 +2676,7 @@ buflist_findpat(
} }
match = buf->b_fnum; // remember first match match = buf->b_fnum; // remember first match
} }
}
vim_regfree(regmatch.regprog); vim_regfree(regmatch.regprog);
if (match >= 0) // found one match if (match >= 0) // found one match
@@ -2766,12 +2769,6 @@ ExpandBufnames(
if (attempt > 0 && patc == pat) if (attempt > 0 && patc == pat)
break; // there was no anchor, no need to try again break; // there was no anchor, no need to try again
regmatch.regprog = vim_regcomp(patc + attempt * 11, RE_MAGIC); 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. // round == 1: Count the matches.
@@ -2792,7 +2789,16 @@ ExpandBufnames(
#endif #endif
if (!fuzzy) 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); p = buflist_match(&regmatch, buf, p_wic);
}
else else
{ {
p = NULL; p = NULL;
@@ -2921,6 +2927,7 @@ ExpandBufnames(
/* /*
* Check for a match on the file name for buffer "buf" with regprog "prog". * 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 * static char_u *
buflist_match( buflist_match(
@@ -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. * Return "name" when there is a match, NULL when not.
*/ */
static char_u * static char_u *
@@ -2951,7 +2959,8 @@ fname_match(
char_u *match = NULL; char_u *match = NULL;
char_u *p; 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. // Ignore case when 'fileignorecase' or the argument is set.
rmp->rm_ic = p_fic || ignore_case; rmp->rm_ic = p_fic || ignore_case;

View File

@@ -419,6 +419,12 @@ func Test_buf_pattern_invalid()
vsplit 00000000000000000000000000 vsplit 00000000000000000000000000
silent! buf [0--]\&\zs*\zs*e silent! buf [0--]\&\zs*\zs*e
bwipe! bwipe!
" similar case with different code path
split 0
edit ÿ
silent! buf [0--]\&\zs*\zs*0
bwipe!
endfunc endfunc
" Test for the 'maxmem' and 'maxmemtot' options " Test for the 'maxmem' and 'maxmemtot' options

View File

@@ -746,6 +746,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 */
/**/
4959,
/**/ /**/
4958, 4958,
/**/ /**/