summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-12-18 12:37:55 +0100
committerBram Moolenaar <Bram@vim.org>2017-12-18 12:37:55 +0100
commit9bca805ec49eb0d2d0d0b2093f418ff425500169 (patch)
tree107e825bc35cfd39d760427047196805804559fb
parentcb89c98c264b0fe9fd26e3501eab5a062e57c064 (diff)
downloadvim-git-9bca805ec49eb0d2d0d0b2093f418ff425500169.tar.gz
patch 8.0.1402: crash with nasty autocommandv8.0.1402
Problem: Crash with nasty autocommand. (gy741, Dominique Pelle) Solution: Check that the new current buffer isn't wiped out. (closes #2447)
-rw-r--r--src/buffer.c23
-rw-r--r--src/testdir/test_autocmd.vim8
-rw-r--r--src/version.c2
3 files changed, 24 insertions, 9 deletions
diff --git a/src/buffer.c b/src/buffer.c
index ed5773e88..eeba53012 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1665,7 +1665,8 @@ set_curbuf(buf_T *buf, int action)
#ifdef FEAT_SYN_HL
long old_tw = curbuf->b_p_tw;
#endif
- bufref_T bufref;
+ bufref_T newbufref;
+ bufref_T prevbufref;
setpcmark();
if (!cmdmod.keepalt)
@@ -1675,18 +1676,22 @@ set_curbuf(buf_T *buf, int action)
/* Don't restart Select mode after switching to another buffer. */
VIsual_reselect = FALSE;
- /* close_windows() or apply_autocmds() may change curbuf */
+ /* close_windows() or apply_autocmds() may change curbuf and wipe out "buf"
+ */
prevbuf = curbuf;
- set_bufref(&bufref, prevbuf);
+ set_bufref(&prevbufref, prevbuf);
+ set_bufref(&newbufref, buf);
#ifdef FEAT_AUTOCMD
+ /* Autocommands may delete the curren buffer and/or the buffer we wan to go
+ * to. In those cases don't close the buffer. */
if (!apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf)
+ || (bufref_valid(&prevbufref)
+ && bufref_valid(&newbufref)
# ifdef FEAT_EVAL
- || (bufref_valid(&bufref) && !aborting())
-# else
- || bufref_valid(&bufref)
+ && !aborting()
# endif
- )
+ ))
#endif
{
#ifdef FEAT_SYN_HL
@@ -1696,9 +1701,9 @@ set_curbuf(buf_T *buf, int action)
if (unload)
close_windows(prevbuf, FALSE);
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
- if (bufref_valid(&bufref) && !aborting())
+ if (bufref_valid(&prevbufref) && !aborting())
#else
- if (bufref_valid(&bufref))
+ if (bufref_valid(&prevbufref))
#endif
{
win_T *previouswin = curwin;
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index bf106f33c..8ac881107 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -1163,3 +1163,11 @@ func Test_TextYankPost()
unlet g:event
bwipe!
endfunc
+
+func Test_nocatch_wipe_all_buffers()
+ " Real nasty autocommand: wipe all buffers on any event.
+ au * * bwipe *
+ call assert_fails('next x', 'E93')
+ bwipe
+ au!
+endfunc
diff --git a/src/version.c b/src/version.c
index ba65a54fa..fc2eda65e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1402,
+/**/
1401,
/**/
1400,