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:
35
src/buffer.c
35
src/buffer.c
@@ -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(®match, buf, p_wic);
|
p = buflist_match(®match, 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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user