mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.4959: using NULL regexp program (#21855)
Problem: Using NULL regexp program.
Solution: Check for regexp program becoming NULL in more places.
b62dc5e782
Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
parent
b4d669e7ac
commit
ddd69a6c81
@ -2255,12 +2255,13 @@ int buflist_findpat(const char *pattern, const char *pattern_end, bool unlisted,
|
|||||||
|
|
||||||
regmatch_T regmatch;
|
regmatch_T regmatch;
|
||||||
regmatch.regprog = vim_regcomp(p, magic_isset() ? RE_MAGIC : 0);
|
regmatch.regprog = vim_regcomp(p, magic_isset() ? RE_MAGIC : 0);
|
||||||
|
|
||||||
|
FOR_ALL_BUFFERS_BACKWARDS(buf) {
|
||||||
if (regmatch.regprog == NULL) {
|
if (regmatch.regprog == NULL) {
|
||||||
|
// invalid pattern, possibly after switching engine
|
||||||
xfree(pat);
|
xfree(pat);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
FOR_ALL_BUFFERS_BACKWARDS(buf) {
|
|
||||||
if (buf->b_p_bl == find_listed
|
if (buf->b_p_bl == find_listed
|
||||||
&& (!diffmode || diff_mode_buf(buf))
|
&& (!diffmode || diff_mode_buf(buf))
|
||||||
&& buflist_match(®match, buf, false) != NULL) {
|
&& buflist_match(®match, buf, false) != NULL) {
|
||||||
@ -2372,12 +2373,6 @@ int ExpandBufnames(char *pat, int *num_file, char ***file, int options)
|
|||||||
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) {
|
|
||||||
xfree(patc);
|
|
||||||
}
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int score = 0;
|
int score = 0;
|
||||||
@ -2398,6 +2393,13 @@ int ExpandBufnames(char *pat, int *num_file, char ***file, int options)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!fuzzy) {
|
if (!fuzzy) {
|
||||||
|
if (regmatch.regprog == NULL) {
|
||||||
|
// invalid pattern, possibly after recompiling
|
||||||
|
if (patc != pat) {
|
||||||
|
xfree(patc);
|
||||||
|
}
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
p = buflist_match(®match, buf, p_wic);
|
p = buflist_match(®match, buf, p_wic);
|
||||||
} else {
|
} else {
|
||||||
p = NULL;
|
p = NULL;
|
||||||
@ -2495,6 +2497,7 @@ int ExpandBufnames(char *pat, int *num_file, char ***file, int options)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 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.
|
||||||
///
|
///
|
||||||
/// @param ignore_case When true, ignore case. Use 'fic' otherwise.
|
/// @param ignore_case When true, ignore case. Use 'fic' otherwise.
|
||||||
static char *buflist_match(regmatch_T *rmp, buf_T *buf, bool ignore_case)
|
static char *buflist_match(regmatch_T *rmp, buf_T *buf, bool ignore_case)
|
||||||
@ -2507,7 +2510,8 @@ static char *buflist_match(regmatch_T *rmp, buf_T *buf, bool ignore_case)
|
|||||||
return match;
|
return 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.
|
||||||
///
|
///
|
||||||
/// @param ignore_case When true, ignore case. Use 'fileignorecase' otherwise.
|
/// @param ignore_case When true, ignore case. Use 'fileignorecase' otherwise.
|
||||||
///
|
///
|
||||||
|
@ -423,6 +423,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
|
||||||
|
Loading…
Reference in New Issue
Block a user