patch 9.0.0550: crash when closing a tabpage and buffer is NULL
Problem: Crash when closing a tabpage and buffer is NULL.
Solution: Adjust how autocommands are triggered when closing a window.
(closes #11198, closes #11197)
diff --git a/src/window.c b/src/window.c
index 3e1a3ef..d73dfd9 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2340,7 +2340,6 @@
{
win_T *wp;
tabpage_T *tp, *nexttp;
- int h = tabline_height();
int count = tabpage_index(NULL);
++RedrawingDisabled;
@@ -2384,10 +2383,6 @@
if (count != tabpage_index(NULL))
apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf);
-
- redraw_tabline = TRUE;
- if (h != tabline_height())
- shell_new_rows();
}
/*
@@ -2446,18 +2441,11 @@
* that below.
*/
goto_tabpage_tp(alt_tabpage(), FALSE, TRUE);
- redraw_tabline = TRUE;
// Safety check: Autocommands may have closed the window when jumping
// to the other tab page.
if (valid_tabpage(prev_curtab) && prev_curtab->tp_firstwin == win)
- {
- int h = tabline_height();
-
win_close_othertab(win, free_buf, prev_curtab);
- if (h != tabline_height())
- shell_new_rows();
- }
#ifdef FEAT_JOB_CHANNEL
entering_window(curwin);
#endif
@@ -2656,7 +2644,10 @@
&& win->w_buffer == NULL)
{
// Need to close the window anyway, since the buffer is NULL.
+ // Don't trigger autocmds with a NULL buffer.
+ block_autocmds();
win_close_othertab(win, FALSE, prev_curtab);
+ unblock_autocmds();
return FAIL;
}
@@ -2907,6 +2898,8 @@
// When closing the last window in a tab page remove the tab page.
if (tp->tp_firstwin == tp->tp_lastwin)
{
+ int h = tabline_height();
+
if (tp == first_tabpage)
first_tabpage = tp->tp_next;
else
@@ -2922,6 +2915,9 @@
ptp->tp_next = tp->tp_next;
}
free_tp = TRUE;
+ redraw_tabline = TRUE;
+ if (h != tabline_height())
+ shell_new_rows();
}
// Free the memory used for the window.