# HG changeset patch # User Bram Moolenaar # Date 1652623203 -7200 # Node ID c3570bdc93eb1b6e79fa0d2cf29cf27ae07de1d1 # Parent d86ddacad21d530ceec61856885385d40da39662 patch 8.2.4959: using NULL regexp program Commit: https://github.com/vim/vim/commit/b62dc5e7825bc195efe3041d5b3a9f1528359e1c Author: Bram Moolenaar Date: Sun May 15 14:50:12 2022 +0100 patch 8.2.4959: using NULL regexp program Problem: Using NULL regexp program. Solution: Check for regexp program becoming NULL in more places. diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -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)) @@ -2674,6 +2676,7 @@ buflist_findpat( } match = buf->b_fnum; // remember first match } + } vim_regfree(regmatch.regprog); if (match >= 0) // found one match @@ -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. @@ -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(®match, buf, p_wic); + } else { p = NULL; @@ -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( @@ -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 * @@ -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; diff --git a/src/testdir/test_buffer.vim b/src/testdir/test_buffer.vim --- a/src/testdir/test_buffer.vim +++ b/src/testdir/test_buffer.vim @@ -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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4959, +/**/ 4958, /**/ 4957,