# HG changeset patch # User Bram Moolenaar # Date 1340186101 -7200 # Node ID a220dd97b5c7218558eaea27d301af2ed4f9ec2d # Parent ca39f14c1ec3dd00130348e6bedb788920fdd68b 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) diff --git a/src/buffer.c b/src/buffer.c --- 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); } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 557, +/**/ 556, /**/ 555,