diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-12-18 12:37:55 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-12-18 12:37:55 +0100 |
commit | 9bca805ec49eb0d2d0d0b2093f418ff425500169 (patch) | |
tree | 107e825bc35cfd39d760427047196805804559fb | |
parent | cb89c98c264b0fe9fd26e3501eab5a062e57c064 (diff) |
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.c | 23 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 8 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 24 insertions, 9 deletions
diff --git a/src/buffer.c b/src/buffer.c index ed5773e882..eeba530125 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 bf106f33c7..8ac8811075 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 ba65a54fac..fc2eda65e4 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, |