Skip to content

Commit b3d29f3

Browse files
janlazobrammool
andauthored
vim-patch:8.1.1259: crash when exiting early (neovim#35552)
Problem: Crash when exiting early. (Ralf Schandl) Solution: Only pop/push the title when it was set. (closes vim/vim#4334) vim/vim@e5c8328 Co-authored-by: Bram Moolenaar <[email protected]>
1 parent 0c0ef48 commit b3d29f3

File tree

3 files changed

+31
-19
lines changed

3 files changed

+31
-19
lines changed

src/nvim/memory.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ void free_all_mem(void)
863863

864864
// Close all tabs and windows. Reset 'equalalways' to avoid redraws.
865865
p_ea = false;
866-
if (first_tabpage->tp_next != NULL) {
866+
if (first_tabpage != NULL && first_tabpage->tp_next != NULL) {
867867
do_cmdline_cmd("tabonly!");
868868
}
869869

@@ -873,18 +873,20 @@ void free_all_mem(void)
873873
// Clear user commands (before deleting buffers).
874874
ex_comclear(NULL);
875875

876-
// Clear menus.
877-
do_cmdline_cmd("aunmenu *");
878-
do_cmdline_cmd("tlunmenu *");
879-
do_cmdline_cmd("menutranslate clear");
876+
if (curbuf != NULL) {
877+
// Clear menus.
878+
do_cmdline_cmd("aunmenu *");
879+
do_cmdline_cmd("tlunmenu *");
880+
do_cmdline_cmd("menutranslate clear");
880881

881-
// Clear mappings, abbreviations, breakpoints.
882-
// NB: curbuf not used with local=false arg
883-
map_clear_mode(curbuf, MAP_ALL_MODES, false, false);
884-
map_clear_mode(curbuf, MAP_ALL_MODES, false, true);
885-
do_cmdline_cmd("breakdel *");
886-
do_cmdline_cmd("profdel *");
887-
do_cmdline_cmd("set keymap=");
882+
// Clear mappings, abbreviations, breakpoints.
883+
// NB: curbuf not used with local=false arg
884+
map_clear_mode(curbuf, MAP_ALL_MODES, false, false);
885+
map_clear_mode(curbuf, MAP_ALL_MODES, false, true);
886+
do_cmdline_cmd("breakdel *");
887+
do_cmdline_cmd("profdel *");
888+
do_cmdline_cmd("set keymap=");
889+
}
888890

889891
free_titles();
890892
free_findfile();
@@ -905,7 +907,9 @@ void free_all_mem(void)
905907
free_cd_dir();
906908
free_signs();
907909
set_expr_line(NULL);
908-
diff_clear(curtab);
910+
if (curtab != NULL) {
911+
diff_clear(curtab);
912+
}
909913
clear_sb_text(true); // free any scrollback text
910914

911915
// Free some global vars.
@@ -922,8 +926,10 @@ void free_all_mem(void)
922926
// Close all script inputs.
923927
close_all_scripts();
924928

925-
// Destroy all windows. Must come before freeing buffers.
926-
win_free_all();
929+
if (curwin != NULL) {
930+
// Destroy all windows. Must come before freeing buffers.
931+
win_free_all();
932+
}
927933

928934
// Free all option values. Must come after closing windows.
929935
free_all_options();
@@ -957,8 +963,10 @@ void free_all_mem(void)
957963

958964
reset_last_sourcing();
959965

960-
free_tabpage(first_tabpage);
961-
first_tabpage = NULL;
966+
if (first_tabpage != NULL) {
967+
free_tabpage(first_tabpage);
968+
first_tabpage = NULL;
969+
}
962970

963971
// message history
964972
msg_hist_clear(0);

src/nvim/tag.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2453,7 +2453,9 @@ static bool found_tagfile_cb(int num_fnames, char **fnames, bool all, void *cook
24532453
void free_tag_stuff(void)
24542454
{
24552455
ga_clear_strings(&tag_fnames);
2456-
do_tag(NULL, DT_FREE, 0, 0, 0);
2456+
if (curwin != NULL) {
2457+
do_tag(NULL, DT_FREE, 0, 0, 0);
2458+
}
24572459
tag_freematch();
24582460

24592461
tagstack_clear_entry(&ptag_entry);

src/nvim/usercmd.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,9 @@ void ex_command(exarg_T *eap)
10531053
void ex_comclear(exarg_T *eap)
10541054
{
10551055
uc_clear(&ucmds);
1056-
uc_clear(&curbuf->b_ucmds);
1056+
if (curbuf != NULL) {
1057+
uc_clear(&curbuf->b_ucmds);
1058+
}
10571059
}
10581060

10591061
void free_ucmd(ucmd_T *cmd)

0 commit comments

Comments
 (0)