diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-07-09 15:21:02 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-07-09 15:21:02 +0200 |
commit | 30445cb6e94698d212ba866ef3e4022ac625540a (patch) | |
tree | 70ded697cac9ceb7da59dcb6ab3b706e90c9dc1c | |
parent | ee1deb4a00f39f133558321ec535354497f490c8 (diff) | |
download | vim-git-30445cb6e94698d212ba866ef3e4022ac625540a.tar.gz |
patch 7.4.2006v7.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)
-rw-r--r-- | src/buffer.c | 27 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 18 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 34 insertions, 13 deletions
diff --git a/src/buffer.c b/src/buffer.c index 058e4d785..7c69b8e9d 100644 --- 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 index 1dceb70cd..187d8d2a2 100644 --- 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 diff --git a/src/version.c b/src/version.c index a326ecb80..89e8c7f76 100644 --- 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, |