diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-05-03 23:15:37 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-05-03 23:15:37 +0200 |
commit | e5c83286bb9a72cc686f2826e605eddebe3c730c (patch) | |
tree | 8de5a0730ab3f8a50674728d48a18b645bffe586 /src/misc2.c | |
parent | 9404a18ad9a47b10fc8de908da833ba7f12f72f5 (diff) | |
download | vim-git-e5c83286bb9a72cc686f2826e605eddebe3c730c.tar.gz |
patch 8.1.1259: crash when exiting earlyv8.1.1259
Problem: Crash when exiting early. (Ralf Schandl)
Solution: Only pop/push the title when it was set. (closes #4334)
Diffstat (limited to 'src/misc2.c')
-rw-r--r-- | src/misc2.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/misc2.c b/src/misc2.c index fe1438083..e615f96b5 100644 --- 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. */ |