vim-patch:9.0.0389: crash when 'tagfunc' closes the window

Problem:    Crash when 'tagfunc' closes the window.
Solution:   Bail out when the window was closed.

ccfde4d028

Add docs for E1299 from Vim runtime.

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2022-11-05 17:01:39 +08:00
parent 595f7f37a9
commit 84881674fd
3 changed files with 26 additions and 0 deletions

View File

@@ -106,6 +106,8 @@ static char_u *recurmsg
= (char_u *)N_("E986: cannot modify the tag stack within tagfunc");
static char_u *tfu_inv_ret_msg
= (char_u *)N_("E987: invalid return value from tagfunc");
static char e_window_unexpectedly_close_while_searching_for_tags[]
= N_("E1299: Window unexpectedly closed while searching for tags");
static char *tagmatchname = NULL; // name of last used tag
@@ -501,6 +503,15 @@ void do_tag(char *tag, int type, int count, int forceit, int verbose)
// found: all matches found.
}
// A tag function may do anything, which may cause various
// information to become invalid. At least check for the tagstack
// to still be the same.
if (tagstack != curwin->w_tagstack) {
emsg(_(e_window_unexpectedly_close_while_searching_for_tags));
FreeWild(new_num_matches, new_matches);
break;
}
// If there already were some matches for the same name, move them
// to the start. Avoids that the order changes when using
// ":tnext" and jumping to another file.

View File

@@ -285,4 +285,17 @@ func Test_tagfunc_wipes_buffer()
set tagfunc=
endfunc
func Test_tagfunc_closes_window()
split any
func MytagfuncClose(pat, flags, info)
close
return [{'name' : 'mytag', 'filename' : 'Xtest', 'cmd' : '1'}]
endfunc
set tagfunc=MytagfuncClose
call assert_fails('tag xyz', 'E1299:')
set tagfunc=
endfunc
" vim: shiftwidth=2 sts=2 expandtab