Mercurial > vim
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)