Skip to content

Commit

Permalink
patch 9.0.0389: crash when 'tagfunc' closes the window
Browse files Browse the repository at this point in the history
Problem:    Crash when 'tagfunc' closes the window.
Solution:   Bail out when the window was closed.
  • Loading branch information
brammool committed Sep 5, 2022
1 parent 8894761 commit ccfde4d
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/errors.h
Expand Up @@ -3324,3 +3324,5 @@ EXTERN char e_non_null_dict_required_for_argument_nr[]
EXTERN char e_non_null_list_required_for_argument_nr[]
INIT(= N_("E1298: Non-NULL List required for argument %d"));
#endif
EXTERN char e_window_unexpectedly_close_while_searching_for_tags[]
INIT(= N_("E1299: Window unexpectedly closed while searching for tags"));
10 changes: 10 additions & 0 deletions src/tag.c
Expand Up @@ -690,6 +690,16 @@ do_tag(
max_num_matches = MAXCOL; // If less than max_num_matches
// 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.
Expand Down
13 changes: 13 additions & 0 deletions src/testdir/test_tagfunc.vim
Expand Up @@ -401,4 +401,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
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -703,6 +703,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
389,
/**/
388,
/**/
Expand Down

0 comments on commit ccfde4d

Please sign in to comment.