summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-07-09 15:21:02 +0200
committerBram Moolenaar <Bram@vim.org>2016-07-09 15:21:02 +0200
commit30445cb6e94698d212ba866ef3e4022ac625540a (patch)
tree70ded697cac9ceb7da59dcb6ab3b706e90c9dc1c
parentee1deb4a00f39f133558321ec535354497f490c8 (diff)
downloadvim-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.c27
-rw-r--r--src/testdir/test_autocmd.vim18
-rw-r--r--src/version.c2
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,