summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-07-24 16:02:36 +0200
committerBram Moolenaar <Bram@vim.org>2013-07-24 16:02:36 +0200
commit2b90ed294e3e3ce9d02d237317deffe296abf798 (patch)
treebd01cd5b7d22f732b4c1cfe5646d90203fc86f11
parentad875fb7fff85d313fa35acde1afaec998d347d7 (diff)
downloadvim-git-2b90ed294e3e3ce9d02d237317deffe296abf798.tar.gz
updated for version 7.4a.042v7.4a.042
Problem: Crash when BufUnload autocommands close all buffers. (Andrew Pimlott) Solution: Set curwin->w_buffer to curbuf to avoid NULL.
-rw-r--r--src/testdir/test8.in22
-rw-r--r--src/testdir/test8.ok1
-rw-r--r--src/version.c2
-rw-r--r--src/window.c7
4 files changed, 31 insertions, 1 deletions
diff --git a/src/testdir/test8.in b/src/testdir/test8.in
index 6fe171546..d9d00d97a 100644
--- 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 @@ $r2:.,/end of/w! Xxx2 " write test file Xxx2
: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
diff --git a/src/testdir/test8.ok b/src/testdir/test8.ok
index 29b066a13..adecb2f4b 100644
--- 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
diff --git a/src/version.c b/src/version.c
index e435c1bdb..652305e74 100644
--- 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,
diff --git a/src/window.c b/src/window.c
index 28bb12547..d1c1e93d9 100644
--- 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. */