changeset 5233:1899acc5aebd v7.4a.042

updated for version 7.4a.042 Problem: Crash when BufUnload autocommands close all buffers. (Andrew Pimlott) Solution: Set curwin->w_buffer to curbuf to avoid NULL.
author Bram Moolenaar <bram@vim.org>
date Wed, 24 Jul 2013 16:02:36 +0200
parents d473976e9113
children e0258a94f389
files src/testdir/test8.in src/testdir/test8.ok src/version.c src/window.c
diffstat 4 files changed, 31 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test8.in
+++ b/src/testdir/test8.in
@@ -1,4 +1,5 @@
 Test for BufWritePre autocommand that deletes or unloads the buffer.
+Test for BufUnload autocommand that unloads all other buffers.
 
 STARTTEST
 :so small.vim
@@ -16,6 +17,27 @@ A1:.,/end of/w! Xxx1  " write test file
 :bwipe test.out         " remove test.out from the buffer list
 :w                      " write it, will delete the buffer and give an error msg
 :w >>test.out           " Append contents of this file
+:au! BufWritePre
+:func CloseAll()
+  let i = 0
+  while i <= bufnr('$')
+    if i != bufnr('%') && bufloaded(i)
+      exe  i . "bunload"
+    endif
+    let i += 1
+  endwhile
+endfunc
+:func WriteToOut()
+  edit! test.out
+  $put ='VimLeave done'
+  write
+endfunc
+:set viminfo='100,nviminfo
+:au BufUnload * call CloseAll()
+:au VimLeave * call WriteToOut()
+:e small.vim
+:sp mbyte.vim
+:q
 :qa!
 ENDTEST
 
--- a/src/testdir/test8.ok
+++ b/src/testdir/test8.ok
@@ -4,3 +4,4 @@ end of Xxx
 start of Xxx1
 	test
 end of Xxx
+VimLeave done
--- a/src/version.c
+++ b/src/version.c
@@ -728,6 +728,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    42,
+/**/
     41,
 /**/
     40,
--- a/src/window.c
+++ b/src/window.c
@@ -2291,8 +2291,13 @@ win_close(win, free_buf)
     if (only_one_window() && win_valid(win) && win->w_buffer == NULL
 	    && (last_window() || curtab != prev_curtab
 		|| close_last_window_tabpage(win, free_buf, prev_curtab)))
-	/* Autocommands have close all windows, quit now. */
+    {
+	/* Autocommands have close all windows, quit now.  Restore
+	 * curwin->w_buffer, otherwise writing viminfo may fail. */
+	if (curwin->w_buffer == NULL)
+	    curwin->w_buffer = curbuf;
 	getout(0);
+    }
 
     /* Autocommands may have closed the window already, or closed the only
      * other window or moved to another tab page. */