# HG changeset patch # User Christian Brabandt # Date 1468071005 -7200 # Node ID 073aebdba121968dd2c8bc83d150326b0f9f4d37 # Parent 76bbfac1cc812b9312477d2d46d36f29c92ffc84 commit https://github.com/vim/vim/commit/30445cb6e94698d212ba866ef3e4022ac625540a Author: Bram Moolenaar Date: Sat Jul 9 15:21:02 2016 +0200 patch 7.4.2006 Problem: Crash when using tabnext in BufUnload autocmd. (Norio Takagi) Solution: First check that the current buffer is the right one. (Hirohito Higashi) diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -459,14 +459,6 @@ aucmd_abort: #endif buf_freeall(buf, (del_buf ? BFA_DEL : 0) + (wipe_buf ? BFA_WIPE : 0)); - if ( -#ifdef FEAT_WINDOWS - win_valid(win) && -#else - win != NULL && -#endif - win->w_buffer == buf) - win->w_buffer = NULL; /* make sure we don't use the buffer now */ #ifdef FEAT_AUTOCMD /* Autocommands may have deleted the buffer. */ @@ -477,11 +469,6 @@ aucmd_abort: return; # endif - /* Autocommands may have opened or closed windows for this buffer. - * Decrement the count for the close we do here. */ - if (buf->b_nwindows > 0) - --buf->b_nwindows; - /* * It's possible that autocommands change curbuf to the one being deleted. * This might cause the previous curbuf to be deleted unexpectedly. But @@ -491,6 +478,20 @@ aucmd_abort: */ if (buf == curbuf && !is_curbuf) return; + + if ( +#ifdef FEAT_WINDOWS + win_valid(win) && +#else + win != NULL && +#endif + win->w_buffer == buf) + win->w_buffer = NULL; /* make sure we don't use the buffer now */ + + /* Autocommands may have opened or closed windows for this buffer. + * Decrement the count for the close we do here. */ + if (buf->b_nwindows > 0) + --buf->b_nwindows; #endif /* Change directories when the 'acd' option is set. */ diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -60,3 +60,21 @@ function Test_bufunload() augroup! test_bufunload_group endfunc + +" SEGV occurs in older versions. (At least 7.4.2005 or older) +function Test_autocmd_bufunload_with_tabnext() + tabedit + tabfirst + + augroup test_autocmd_bufunload_with_tabnext_group + autocmd! + autocmd BufUnload tabnext + augroup END + + quit + call assert_equal(2, tabpagenr('$')) + + augroup! test_autocmd_bufunload_with_tabnext_group + tablast + quit +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2006, +/**/ 2005, /**/ 2004,