]> granicus.if.org Git - vim/commitdiff
patch 9.0.0389: crash when 'tagfunc' closes the window v9.0.0389
authorBram Moolenaar <Bram@vim.org>
Mon, 5 Sep 2022 18:51:13 +0000 (19:51 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 5 Sep 2022 18:51:13 +0000 (19:51 +0100)
Problem:    Crash when 'tagfunc' closes the window.
Solution:   Bail out when the window was closed.

src/errors.h
src/tag.c
src/testdir/test_tagfunc.vim
src/version.c

index ee75d07e5c9ec47a933d2406283861608c2e9357..44eb9db9fcf5e1478dcdfd28fe82654cffdb68c8 100644 (file)
@@ -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"));
index c3e23f624ef211f575aa85026fc58f6d72fab454..d07fbbe99c29bc411f4d6a2dcfef120f180b72cb 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
@@ -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.
index 95826121cd8499985c7081e383d8841912c0ee3f..5b18976903f68024101d83fdda4cd1809e213cb8 100644 (file)
@@ -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
index d4fc4d585f99457016953141e56a2b58ba237d26..b114c2760d84a53f0a37ae89df6ba3b5b392cd42 100644 (file)
@@ -703,6 +703,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    389,
 /**/
     388,
 /**/