From: Bram Moolenaar Date: Sun, 4 Sep 2016 19:33:09 +0000 (+0200) Subject: patch 7.4.2328 X-Git-Tag: v7.4.2328 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f9e687e0681a250e1549ab27b6c7ef2c500395e3;p=vim patch 7.4.2328 Problem: Crash when BufWinLeave autocmd goes to another tab page. (Hirohito Higashi) Solution: Make close_buffer() go back to the right window. --- diff --git a/src/buffer.c b/src/buffer.c index 648916821..ac37685aa 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -450,6 +450,11 @@ close_buffer( int is_curbuf; int nwindows; bufref_T bufref; +# ifdef FEAT_WINDOWS + int is_curwin = (curwin!= NULL && curwin->w_buffer == buf); + win_T *the_curwin = curwin; + tabpage_T *the_curtab = curtab; +# endif #endif int unload_buf = (action != 0); int del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE); @@ -544,6 +549,19 @@ aucmd_abort: return; # endif } + +# ifdef FEAT_WINDOWS + /* If the buffer was in curwin and the window has changed, go back to that + * window, if it still exists. This avoids that ":edit x" triggering a + * "tabnext" BufUnload autocmd leaves a window behind without a buffer. */ + if (is_curwin && curwin != the_curwin && win_valid_any_tab(the_curwin)) + { + block_autocmds(); + goto_tabpage_win(the_curtab, the_curwin); + unblock_autocmds(); + } +# endif + nwindows = buf->b_nwindows; #endif diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 43aa8d48d..c029ca1bd 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -83,6 +83,16 @@ function Test_autocmd_bufunload_with_tabnext() quit endfunc +function Test_autocmd_bufwinleave_with_tabfirst() + tabedit + augroup sample + autocmd! + autocmd BufWinLeave tabfirst + augroup END + call setline(1, ['a', 'b', 'c']) + edit! a.txt +endfunc + " SEGV occurs in older versions. (At least 7.4.2321 or older) function Test_autocmd_bufunload_avoiding_SEGV_01() split aa.txt diff --git a/src/version.c b/src/version.c index 4ab697b9b..89e5f9509 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2328, /**/ 2327, /**/