mirror of
https://github.com/vim/vim.git
synced 2025-07-04 23:07:33 -04:00
patch 8.0.1402: crash with nasty autocommand
Problem: Crash with nasty autocommand. (gy741, Dominique Pelle) Solution: Check that the new current buffer isn't wiped out. (closes #2447)
This commit is contained in:
parent
cb89c98c26
commit
9bca805ec4
23
src/buffer.c
23
src/buffer.c
@ -1665,7 +1665,8 @@ set_curbuf(buf_T *buf, int action)
|
|||||||
#ifdef FEAT_SYN_HL
|
#ifdef FEAT_SYN_HL
|
||||||
long old_tw = curbuf->b_p_tw;
|
long old_tw = curbuf->b_p_tw;
|
||||||
#endif
|
#endif
|
||||||
bufref_T bufref;
|
bufref_T newbufref;
|
||||||
|
bufref_T prevbufref;
|
||||||
|
|
||||||
setpcmark();
|
setpcmark();
|
||||||
if (!cmdmod.keepalt)
|
if (!cmdmod.keepalt)
|
||||||
@ -1675,18 +1676,22 @@ set_curbuf(buf_T *buf, int action)
|
|||||||
/* Don't restart Select mode after switching to another buffer. */
|
/* Don't restart Select mode after switching to another buffer. */
|
||||||
VIsual_reselect = FALSE;
|
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;
|
prevbuf = curbuf;
|
||||||
set_bufref(&bufref, prevbuf);
|
set_bufref(&prevbufref, prevbuf);
|
||||||
|
set_bufref(&newbufref, buf);
|
||||||
|
|
||||||
#ifdef FEAT_AUTOCMD
|
#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)
|
if (!apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf)
|
||||||
|
|| (bufref_valid(&prevbufref)
|
||||||
|
&& bufref_valid(&newbufref)
|
||||||
# ifdef FEAT_EVAL
|
# ifdef FEAT_EVAL
|
||||||
|| (bufref_valid(&bufref) && !aborting())
|
&& !aborting()
|
||||||
# else
|
|
||||||
|| bufref_valid(&bufref)
|
|
||||||
# endif
|
# endif
|
||||||
)
|
))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#ifdef FEAT_SYN_HL
|
#ifdef FEAT_SYN_HL
|
||||||
@ -1696,9 +1701,9 @@ set_curbuf(buf_T *buf, int action)
|
|||||||
if (unload)
|
if (unload)
|
||||||
close_windows(prevbuf, FALSE);
|
close_windows(prevbuf, FALSE);
|
||||||
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
|
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
|
||||||
if (bufref_valid(&bufref) && !aborting())
|
if (bufref_valid(&prevbufref) && !aborting())
|
||||||
#else
|
#else
|
||||||
if (bufref_valid(&bufref))
|
if (bufref_valid(&prevbufref))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
win_T *previouswin = curwin;
|
win_T *previouswin = curwin;
|
||||||
|
@ -1163,3 +1163,11 @@ func Test_TextYankPost()
|
|||||||
unlet g:event
|
unlet g:event
|
||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
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
|
||||||
|
@ -771,6 +771,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1402,
|
||||||
/**/
|
/**/
|
||||||
1401,
|
1401,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user