0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

updated for version 7.3.557

Problem:    Crash when an autocommand wipes out a buffer when it is hidden.
Solution:   Restore the current window when needed. (Christian Brabandt)
This commit is contained in:
Bram Moolenaar
2012-06-20 11:55:01 +02:00
parent 36105782d2
commit 9e931224db
2 changed files with 17 additions and 6 deletions

View File

@@ -1363,6 +1363,7 @@ set_curbuf(buf, action)
int action;
{
buf_T *prevbuf;
win_T *prevwin;
int unload = (action == DOBUF_UNLOAD || action == DOBUF_DEL
|| action == DOBUF_WIPE);
@@ -1402,22 +1403,30 @@ set_curbuf(buf, action)
if (buf_valid(prevbuf))
#endif
{
prevwin = curwin;
if (prevbuf == curbuf)
u_sync(FALSE);
close_buffer(prevbuf == curwin->w_buffer ? curwin : NULL, prevbuf,
unload ? action : (action == DOBUF_GOTO
&& !P_HID(prevbuf)
&& !bufIsChanged(prevbuf)) ? DOBUF_UNLOAD : 0, FALSE);
if (curwin != prevwin && win_valid(prevwin))
/* autocommands changed curwin, Grr! */
curwin = prevwin;
}
}
#ifdef FEAT_AUTOCMD
/* An autocommand may have deleted "buf", already entered it (e.g., when
* it did ":bunload") or aborted the script processing! */
# ifdef FEAT_EVAL
if (buf_valid(buf) && buf != curbuf && !aborting())
# else
if (buf_valid(buf) && buf != curbuf)
# endif
* it did ":bunload") or aborted the script processing!
* If curwin->w_buffer is null, enter_buffer() will make it valid again */
if ((buf_valid(buf) && buf != curbuf
#ifdef FEAT_EVAL
&& !aborting()
#endif
#ifdef FEAT_WINDOWS
) || curwin->w_buffer == NULL
#endif
)
#endif
enter_buffer(buf);
}