0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.1059: crash when using :tabonly in an autocommand

Problem:    Crash when using :tabonly in an autocommand. (Yegappan Lakshmanan)
Solution:   Do not allow the autocommand window to be closed.
This commit is contained in:
Bram Moolenaar
2020-06-26 19:44:06 +02:00
parent fc838d6cb0
commit cf8441704d
5 changed files with 32 additions and 2 deletions

View File

@@ -5178,6 +5178,13 @@ ex_win_close(
int need_hide; int need_hide;
buf_T *buf = win->w_buffer; buf_T *buf = win->w_buffer;
// Never close the autocommand window.
if (win == aucmd_win)
{
emsg(_(e_autocmd_close));
return;
}
need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1); need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1);
if (need_hide && !buf_hide(buf) && !forceit) if (need_hide && !buf_hide(buf) && !forceit)
{ {

View File

@@ -1765,6 +1765,7 @@ EXTERN char e_float_as_string[] INIT(= N_("E806: using Float as a String"));
#endif #endif
EXTERN char e_dirnotf[] INIT(= N_("E919: Directory not found in '%s': \"%s\"")); EXTERN char e_dirnotf[] INIT(= N_("E919: Directory not found in '%s': \"%s\""));
EXTERN char e_au_recursive[] INIT(= N_("E952: Autocommand caused recursive behavior")); EXTERN char e_au_recursive[] INIT(= N_("E952: Autocommand caused recursive behavior"));
EXTERN char e_autocmd_close[] INIT(= N_("E813: Cannot close autocmd or popup window"));
#ifdef FEAT_MENU #ifdef FEAT_MENU
EXTERN char e_menuothermode[] INIT(= N_("E328: Menu only exists in another mode")); EXTERN char e_menuothermode[] INIT(= N_("E328: Menu only exists in another mode"));
#endif #endif

View File

@@ -2617,7 +2617,27 @@ func Test_close_autocmd_window()
au! au!
augroup END augroup END
augroup! aucmd_win_test2 augroup! aucmd_win_test2
%bw! %bwipe!
endfunc
" Test for trying to close the tab that has the temporary window for exeucing
" an autocmd.
func Test_close_autocmd_tab()
edit one.txt
tabnew two.txt
augroup aucmd_win_test
au!
au BufEnter * if expand('<afile>') == 'one.txt' | tabfirst | tabonly | endif
augroup END
call assert_fails('doautoall BufEnter', 'E813:')
tabonly
augroup aucmd_win_test
au!
augroup END
augroup! aucmd_win_test
%bwipe!
endfunc endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1059,
/**/ /**/
1058, 1058,
/**/ /**/

View File

@@ -2461,7 +2461,7 @@ win_close(win_T *win, int free_buf)
return FAIL; // window is already being closed return FAIL; // window is already being closed
if (win_unlisted(win)) if (win_unlisted(win))
{ {
emsg(_("E813: Cannot close autocmd or popup window")); emsg(_(e_autocmd_close));
return FAIL; return FAIL;
} }
if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window()) if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window())