# HG changeset patch # User Bram Moolenaar # Date 1556919005 -7200 # Node ID 4182f74e2965201cc71db6312e530691e642d560 # Parent 816e05c23ddcb14eeb319f8d08a8b12dcbaac110 patch 8.1.1259: crash when exiting early commit https://github.com/vim/vim/commit/e5c83286bb9a72cc686f2826e605eddebe3c730c Author: Bram Moolenaar 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) diff --git a/src/misc2.c b/src/misc2.c --- 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. */ diff --git a/src/os_unix.c b/src/os_unix.c --- 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 */ diff --git a/src/tag.c b/src/tag.c --- 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) diff --git a/src/usercmd.c b/src/usercmd.c --- 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); } /* diff --git a/src/version.c b/src/version.c --- 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,