Mercurial > vim
changeset 9450:073aebdba121 v7.4.2006
commit https://github.com/vim/vim/commit/30445cb6e94698d212ba866ef3e4022ac625540a
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 09 Jul 2016 15:30:05 +0200 |
parents | 76bbfac1cc81 |
children | afe1b7773181 |
files | src/buffer.c src/testdir/test_autocmd.vim src/version.c |
diffstat | 3 files changed, 34 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- 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. */
--- 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 <buffer> tabnext + augroup END + + quit + call assert_equal(2, tabpagenr('$')) + + augroup! test_autocmd_bufunload_with_tabnext_group + tablast + quit +endfunc