mirror of
https://github.com/neovim/neovim.git
synced 2025-10-12 12:56:04 +00:00
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:
@@ -909,6 +909,8 @@ If the function returns |v:null| instead of a List, a standard tag lookup will
|
||||
be performed instead.
|
||||
|
||||
It is not allowed to change the tagstack from inside 'tagfunc'. *E986*
|
||||
It is not allowed to close a window or change window from inside 'tagfunc'.
|
||||
*E1299*
|
||||
|
||||
The following is a hypothetical example of a function used for 'tagfunc'. It
|
||||
uses the output of |taglist()| to generate the result: a list of tags in the
|
||||
|
@@ -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.
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user