From 9e931224db8f8843ddc778307984dbe37ebde47c Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 20 Jun 2012 11:55:01 +0200 Subject: 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) --- src/buffer.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'src/buffer.c') diff --git a/src/buffer.c b/src/buffer.c index e27626eb16..183429159d 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -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); } -- cgit v1.2.3