1
0
forked from aniani/vim

patch 7.4.2309

Problem:    Crash when doing tabnext in a BufUnload autocmd. (Dominique Pelle)
Solution:   When detecting that the tab page changed, don't just abort but
            delete the window where w_buffer is NULL.
This commit is contained in:
Bram Moolenaar
2016-09-02 21:48:32 +02:00
parent 44f660c421
commit 11fbc2866c
3 changed files with 35 additions and 7 deletions

View File

@@ -2379,7 +2379,7 @@ win_close(win_T *win, int free_buf)
#endif
close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, TRUE);
#ifdef FEAT_AUTOCMD
if (win_valid(win))
if (win_valid_any_tab(win))
win->w_closing = FALSE;
#endif
/* Make sure curbuf is valid. It can become invalid if 'bufhidden' is
@@ -2399,9 +2399,18 @@ win_close(win_T *win, int free_buf)
getout(0);
}
/* Autocommands may have closed the window already, or closed the only
* other window or moved to another tab page. */
else if (!win_valid(win) || last_window() || curtab != prev_curtab
/* Autocommands may have moved to another tab page. */
if (curtab != prev_curtab && win_valid_any_tab(win)
&& win->w_buffer == NULL)
{
/* Need to close the window anyway, since the buffer is NULL. */
win_close_othertab(win, FALSE, prev_curtab);
return FAIL;
}
/* Autocommands may have closed the window already or closed the only
* other window. */
if (!win_valid(win) || last_window()
|| close_last_window_tabpage(win, free_buf, prev_curtab))
return FAIL;
@@ -2492,12 +2501,15 @@ win_close_othertab(win_T *win, int free_buf, tabpage_T *tp)
int free_tp = FALSE;
#ifdef FEAT_AUTOCMD
if (win->w_closing || win->w_buffer->b_closing)
/* Get here with win->w_buffer == NULL when win_close() detects the tab
* page changed. */
if (win->w_closing || (win->w_buffer != NULL && win->w_buffer->b_closing))
return; /* window is already being closed */
#endif
/* Close the link to the buffer. */
close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, FALSE);
if (win->w_buffer != NULL)
/* Close the link to the buffer. */
close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, FALSE);
/* Careful: Autocommands may have closed the tab page or made it the
* current tab page. */