changeset 3594:a220dd97b5c7 v7.3.557

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)
author Bram Moolenaar <bram@vim.org>
date Wed, 20 Jun 2012 11:55:01 +0200
parents ca39f14c1ec3
children 3a48450ebf84
files src/buffer.c src/version.c
diffstat 2 files changed, 17 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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);
 }
--- 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,