vim-patch:9.0.0947: invalid memory access in substitute with function (#23126)

Problem:    Invalid memory access in substitute with function that goes to
            another file.
Solution:   Check for text locked in CTRL-W gf.

cc762a48d4

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq 2023-04-16 17:44:14 +08:00 committed by GitHub
parent c54592bfda
commit b28683d252
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 5 deletions

View File

@ -462,7 +462,7 @@ static bool check_text_locked(oparg_T *oap)
/// If text is locked, "curbuf->b_ro_locked" or "allbuf_lock" is set:
/// Give an error message, possibly beep and return true.
/// "oap" may be NULL.
static bool check_text_or_curbuf_locked(oparg_T *oap)
bool check_text_or_curbuf_locked(oparg_T *oap)
{
if (check_text_locked(oap)) {
return true;

View File

@ -504,6 +504,9 @@ newwindow:
case Ctrl_F: {
wingotofile:
CHECK_CMDWIN;
if (check_text_or_curbuf_locked(NULL)) {
break;
}
linenr_T lnum = -1;
char *ptr = grab_file_name(Prenum1, &lnum);
@ -1068,10 +1071,10 @@ int win_split(int size, int flags)
return win_split_ins(size, flags, NULL, 0);
}
// When "new_wp" is NULL: split the current window in two.
// When "new_wp" is not NULL: insert this window at the far
// top/left/right/bottom.
// return FAIL for failure, OK otherwise
/// When "new_wp" is NULL: split the current window in two.
/// When "new_wp" is not NULL: insert this window at the far
/// top/left/right/bottom.
/// @return FAIL for failure, OK otherwise
int win_split_ins(int size, int flags, win_T *new_wp, int dir)
{
win_T *wp = new_wp;

View File

@ -1090,6 +1090,25 @@ func Test_sub_edit_scriptfile()
bwipe!
endfunc
" This was editing another file from the expression.
func Test_sub_expr_goto_other_file()
call writefile([''], 'Xfileone', 'D')
enew!
call setline(1, ['a', 'b', 'c', 'd',
\ 'Xfileone zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'])
func g:SplitGotoFile()
exe "sil! norm 0\<C-W>gf"
return ''
endfunc
$
s/\%')/\=g:SplitGotoFile()
delfunc g:SplitGotoFile
bwipe!
endfunc
" Test for the 2-letter and 3-letter :substitute commands
func Test_substitute_short_cmd()
new