Skip to content

Commit e5c8328

Browse files
committed
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 #4334)
1 parent 9404a18 commit e5c8328

5 files changed

Lines changed: 44 additions & 26 deletions

File tree

src/misc2.c

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ free_all_mem(void)
10681068

10691069
/* Close all tabs and windows. Reset 'equalalways' to avoid redraws. */
10701070
p_ea = FALSE;
1071-
if (first_tabpage->tp_next != NULL)
1071+
if (first_tabpage != NULL && first_tabpage->tp_next != NULL)
10721072
do_cmdline_cmd((char_u *)"tabonly!");
10731073
if (!ONE_WINDOW)
10741074
do_cmdline_cmd((char_u *)"only!");
@@ -1085,29 +1085,33 @@ free_all_mem(void)
10851085
// Clear user commands (before deleting buffers).
10861086
ex_comclear(NULL);
10871087

1088+
// When exiting from mainerr_arg_missing curbuf has not been initialized,
1089+
// and not much else.
1090+
if (curbuf != NULL)
1091+
{
10881092
# ifdef FEAT_MENU
1089-
/* Clear menus. */
1090-
do_cmdline_cmd((char_u *)"aunmenu *");
1093+
// Clear menus.
1094+
do_cmdline_cmd((char_u *)"aunmenu *");
10911095
# ifdef FEAT_MULTI_LANG
1092-
do_cmdline_cmd((char_u *)"menutranslate clear");
1096+
do_cmdline_cmd((char_u *)"menutranslate clear");
10931097
# endif
10941098
# endif
1095-
1096-
/* Clear mappings, abbreviations, breakpoints. */
1097-
do_cmdline_cmd((char_u *)"lmapclear");
1098-
do_cmdline_cmd((char_u *)"xmapclear");
1099-
do_cmdline_cmd((char_u *)"mapclear");
1100-
do_cmdline_cmd((char_u *)"mapclear!");
1101-
do_cmdline_cmd((char_u *)"abclear");
1099+
// Clear mappings, abbreviations, breakpoints.
1100+
do_cmdline_cmd((char_u *)"lmapclear");
1101+
do_cmdline_cmd((char_u *)"xmapclear");
1102+
do_cmdline_cmd((char_u *)"mapclear");
1103+
do_cmdline_cmd((char_u *)"mapclear!");
1104+
do_cmdline_cmd((char_u *)"abclear");
11021105
# if defined(FEAT_EVAL)
1103-
do_cmdline_cmd((char_u *)"breakdel *");
1106+
do_cmdline_cmd((char_u *)"breakdel *");
11041107
# endif
11051108
# if defined(FEAT_PROFILE)
1106-
do_cmdline_cmd((char_u *)"profdel *");
1109+
do_cmdline_cmd((char_u *)"profdel *");
11071110
# endif
11081111
# if defined(FEAT_KEYMAP)
1109-
do_cmdline_cmd((char_u *)"set keymap=");
1112+
do_cmdline_cmd((char_u *)"set keymap=");
11101113
#endif
1114+
}
11111115

11121116
# ifdef FEAT_TITLE
11131117
free_titles();
@@ -1142,7 +1146,8 @@ free_all_mem(void)
11421146
set_expr_line(NULL);
11431147
# endif
11441148
# ifdef FEAT_DIFF
1145-
diff_clear(curtab);
1149+
if (curtab != NULL)
1150+
diff_clear(curtab);
11461151
# endif
11471152
clear_sb_text(TRUE); /* free any scrollback text */
11481153

@@ -1172,17 +1177,18 @@ free_all_mem(void)
11721177
tabpage_T *tab;
11731178

11741179
qf_free_all(NULL);
1175-
/* Free all location lists */
1180+
// Free all location lists
11761181
FOR_ALL_TAB_WINDOWS(tab, win)
11771182
qf_free_all(win);
11781183
}
11791184
#endif
11801185

1181-
/* Close all script inputs. */
1186+
// Close all script inputs.
11821187
close_all_scripts();
11831188

1184-
/* Destroy all windows. Must come before freeing buffers. */
1185-
win_free_all();
1189+
if (curwin != NULL)
1190+
// Destroy all windows. Must come before freeing buffers.
1191+
win_free_all();
11861192

11871193
/* Free all option values. Must come after closing windows. */
11881194
free_all_options();
@@ -1223,8 +1229,11 @@ free_all_mem(void)
12231229

12241230
reset_last_sourcing();
12251231

1226-
free_tabpage(first_tabpage);
1227-
first_tabpage = NULL;
1232+
if (first_tabpage != NULL)
1233+
{
1234+
free_tabpage(first_tabpage);
1235+
first_tabpage = NULL;
1236+
}
12281237

12291238
# ifdef UNIX
12301239
/* Machine-specific free. */

src/os_unix.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,14 +2205,19 @@ mch_settitle(char_u *title, char_u *icon)
22052205
void
22062206
mch_restore_title(int which)
22072207
{
2208+
int do_push_pop = did_set_title || did_set_icon;
2209+
22082210
/* only restore the title or icon when it has been set */
22092211
mch_settitle(((which & SAVE_RESTORE_TITLE) && did_set_title) ?
22102212
(oldtitle ? oldtitle : p_titleold) : NULL,
22112213
((which & SAVE_RESTORE_ICON) && did_set_icon) ? oldicon : NULL);
22122214

2213-
// pop and push from/to the stack
2214-
term_pop_title(which);
2215-
term_push_title(which);
2215+
if (do_push_pop)
2216+
{
2217+
// pop and push from/to the stack
2218+
term_pop_title(which);
2219+
term_push_title(which);
2220+
}
22162221
}
22172222

22182223
#endif /* FEAT_TITLE */

src/tag.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2860,7 +2860,8 @@ found_tagfile_cb(char_u *fname, void *cookie UNUSED)
28602860
free_tag_stuff(void)
28612861
{
28622862
ga_clear_strings(&tag_fnames);
2863-
do_tag(NULL, DT_FREE, 0, 0, 0);
2863+
if (curwin != NULL)
2864+
do_tag(NULL, DT_FREE, 0, 0, 0);
28642865
tag_freematch();
28652866

28662867
# if defined(FEAT_QUICKFIX)

src/usercmd.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,8 @@ ex_command(exarg_T *eap)
10451045
ex_comclear(exarg_T *eap UNUSED)
10461046
{
10471047
uc_clear(&ucmds);
1048-
uc_clear(&curbuf->b_ucmds);
1048+
if (curbuf != NULL)
1049+
uc_clear(&curbuf->b_ucmds);
10491050
}
10501051

10511052
/*

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,8 @@ static char *(features[]) =
767767

768768
static int included_patches[] =
769769
{ /* Add new patch number below this line */
770+
/**/
771+
1259,
770772
/**/
771773
1258,
772774
/**/

0 commit comments

Comments
 (0)