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 | |
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)
-rw-r--r-- | src/misc2.c | 51 | ||||
-rw-r--r-- | src/os_unix.c | 11 | ||||
-rw-r--r-- | src/tag.c | 3 | ||||
-rw-r--r-- | src/usercmd.c | 3 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 44 insertions, 26 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. */ diff --git a/src/os_unix.c b/src/os_unix.c index a78b330f2..ba5d386bb 100644 --- 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 */ @@ -2860,7 +2860,8 @@ found_tagfile_cb(char_u *fname, void *cookie UNUSED) 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 index 37c519dfa..ca01a3ca3 100644 --- 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 index 69ab34b42..c8bcdecf0 100644 --- 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, |