changeset 16511:4182f74e2965 v8.1.1259

patch 8.1.1259: crash when exiting early commit https://github.com/vim/vim/commit/e5c83286bb9a72cc686f2826e605eddebe3c730c Author: Bram Moolenaar <Bram@vim.org> Date: Fri May 3 23:15:37 2019 +0200 patch 8.1.1259: crash when exiting early Problem: Crash when exiting early. (Ralf Schandl) Solution: Only pop/push the title when it was set. (closes https://github.com/vim/vim/issues/4334)
author Bram Moolenaar <Bram@vim.org>
date Fri, 03 May 2019 23:30:05 +0200
parents 816e05c23ddc
children 7e5f5a844629
files src/misc2.c src/os_unix.c src/tag.c src/usercmd.c src/version.c
diffstat 5 files changed, 44 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1068,7 +1068,7 @@ free_all_mem(void)
 
     /* Close all tabs and windows.  Reset 'equalalways' to avoid redraws. */
     p_ea = FALSE;
-    if (first_tabpage->tp_next != NULL)
+    if (first_tabpage != NULL && first_tabpage->tp_next != NULL)
 	do_cmdline_cmd((char_u *)"tabonly!");
     if (!ONE_WINDOW)
 	do_cmdline_cmd((char_u *)"only!");
@@ -1085,29 +1085,33 @@ free_all_mem(void)
     // Clear user commands (before deleting buffers).
     ex_comclear(NULL);
 
+    // When exiting from mainerr_arg_missing curbuf has not been initialized,
+    // and not much else.
+    if (curbuf != NULL)
+    {
 # ifdef FEAT_MENU
-    /* Clear menus. */
-    do_cmdline_cmd((char_u *)"aunmenu *");
+	// Clear menus.
+	do_cmdline_cmd((char_u *)"aunmenu *");
 #  ifdef FEAT_MULTI_LANG
-    do_cmdline_cmd((char_u *)"menutranslate clear");
+	do_cmdline_cmd((char_u *)"menutranslate clear");
 #  endif
 # endif
-
-    /* Clear mappings, abbreviations, breakpoints. */
-    do_cmdline_cmd((char_u *)"lmapclear");
-    do_cmdline_cmd((char_u *)"xmapclear");
-    do_cmdline_cmd((char_u *)"mapclear");
-    do_cmdline_cmd((char_u *)"mapclear!");
-    do_cmdline_cmd((char_u *)"abclear");
+	// Clear mappings, abbreviations, breakpoints.
+	do_cmdline_cmd((char_u *)"lmapclear");
+	do_cmdline_cmd((char_u *)"xmapclear");
+	do_cmdline_cmd((char_u *)"mapclear");
+	do_cmdline_cmd((char_u *)"mapclear!");
+	do_cmdline_cmd((char_u *)"abclear");
 # if defined(FEAT_EVAL)
-    do_cmdline_cmd((char_u *)"breakdel *");
+	do_cmdline_cmd((char_u *)"breakdel *");
 # endif
 # if defined(FEAT_PROFILE)
-    do_cmdline_cmd((char_u *)"profdel *");
+	do_cmdline_cmd((char_u *)"profdel *");
 # endif
 # if defined(FEAT_KEYMAP)
-    do_cmdline_cmd((char_u *)"set keymap=");
+	do_cmdline_cmd((char_u *)"set keymap=");
 #endif
+    }
 
 # ifdef FEAT_TITLE
     free_titles();
@@ -1142,7 +1146,8 @@ free_all_mem(void)
     set_expr_line(NULL);
 # endif
 # ifdef FEAT_DIFF
-    diff_clear(curtab);
+    if (curtab != NULL)
+	diff_clear(curtab);
 # endif
     clear_sb_text(TRUE);	      /* free any scrollback text */
 
@@ -1172,17 +1177,18 @@ free_all_mem(void)
 	tabpage_T   *tab;
 
 	qf_free_all(NULL);
-	/* Free all location lists */
+	// Free all location lists
 	FOR_ALL_TAB_WINDOWS(tab, win)
 	    qf_free_all(win);
     }
 #endif
 
-    /* Close all script inputs. */
+    // Close all script inputs.
     close_all_scripts();
 
-    /* Destroy all windows.  Must come before freeing buffers. */
-    win_free_all();
+    if (curwin != NULL)
+	// Destroy all windows.  Must come before freeing buffers.
+	win_free_all();
 
     /* Free all option values.  Must come after closing windows. */
     free_all_options();
@@ -1223,8 +1229,11 @@ free_all_mem(void)
 
     reset_last_sourcing();
 
-    free_tabpage(first_tabpage);
-    first_tabpage = NULL;
+    if (first_tabpage != NULL)
+    {
+	free_tabpage(first_tabpage);
+	first_tabpage = NULL;
+    }
 
 # ifdef UNIX
     /* Machine-specific free. */
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -2205,14 +2205,19 @@ mch_settitle(char_u *title, char_u *icon
     void
 mch_restore_title(int which)
 {
+    int	do_push_pop = did_set_title || did_set_icon;
+
     /* only restore the title or icon when it has been set */
     mch_settitle(((which & SAVE_RESTORE_TITLE) && did_set_title) ?
 			(oldtitle ? oldtitle : p_titleold) : NULL,
 	       ((which & SAVE_RESTORE_ICON) && did_set_icon) ? oldicon : NULL);
 
-    // pop and push from/to the stack
-    term_pop_title(which);
-    term_push_title(which);
+    if (do_push_pop)
+    {
+	// pop and push from/to the stack
+	term_pop_title(which);
+	term_push_title(which);
+    }
 }
 
 #endif /* FEAT_TITLE */
--- a/src/tag.c
+++ b/src/tag.c
@@ -2860,7 +2860,8 @@ found_tagfile_cb(char_u *fname, void *co
 free_tag_stuff(void)
 {
     ga_clear_strings(&tag_fnames);
-    do_tag(NULL, DT_FREE, 0, 0, 0);
+    if (curwin != NULL)
+	do_tag(NULL, DT_FREE, 0, 0, 0);
     tag_freematch();
 
 # if defined(FEAT_QUICKFIX)
--- a/src/usercmd.c
+++ b/src/usercmd.c
@@ -1045,7 +1045,8 @@ ex_command(exarg_T *eap)
 ex_comclear(exarg_T *eap UNUSED)
 {
     uc_clear(&ucmds);
-    uc_clear(&curbuf->b_ucmds);
+    if (curbuf != NULL)
+	uc_clear(&curbuf->b_ucmds);
 }
 
 /*
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1259,
+/**/
     1258,
 /**/
     1257,