mirror of
https://github.com/neovim/neovim.git
synced 2025-10-12 21:06:13 +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.
|
be performed instead.
|
||||||
|
|
||||||
It is not allowed to change the tagstack from inside 'tagfunc'. *E986*
|
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
|
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
|
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");
|
= (char_u *)N_("E986: cannot modify the tag stack within tagfunc");
|
||||||
static char_u *tfu_inv_ret_msg
|
static char_u *tfu_inv_ret_msg
|
||||||
= (char_u *)N_("E987: invalid return value from tagfunc");
|
= (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
|
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.
|
// 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
|
// If there already were some matches for the same name, move them
|
||||||
// to the start. Avoids that the order changes when using
|
// to the start. Avoids that the order changes when using
|
||||||
// ":tnext" and jumping to another file.
|
// ":tnext" and jumping to another file.
|
||||||
|
@@ -285,4 +285,17 @@ func Test_tagfunc_wipes_buffer()
|
|||||||
set tagfunc=
|
set tagfunc=
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
Reference in New Issue
Block a user