summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-05-03 23:15:37 +0200
committerBram Moolenaar <Bram@vim.org>2019-05-03 23:15:37 +0200
commite5c83286bb9a72cc686f2826e605eddebe3c730c (patch)
tree8de5a0730ab3f8a50674728d48a18b645bffe586
parent9404a18ad9a47b10fc8de908da833ba7f12f72f5 (diff)
downloadvim-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.c51
-rw-r--r--src/os_unix.c11
-rw-r--r--src/tag.c3
-rw-r--r--src/usercmd.c3
-rw-r--r--src/version.c2
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 */
diff --git a/src/tag.c b/src/tag.c
index 1242668a8..2d46e1400 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -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,