To: vim_dev@googlegroups.com Subject: Patch 7.4a.042 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4a.042 Problem: Crash when BufUnload autocommands close all buffers. (Andrew Pimlott) Solution: Set curwin->w_buffer to curbuf to avoid NULL. Files: src/window.c, src/testdir/test8.in, src/testdir/test8.ok *** ../vim-7.4a.041/src/window.c 2013-07-17 17:15:21.000000000 +0200 --- src/window.c 2013-07-24 15:55:34.000000000 +0200 *************** *** 2291,2298 **** 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. */ getout(0); /* Autocommands may have closed the window already, or closed the only * other window or moved to another tab page. */ --- 2291,2303 ---- 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. 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. */ *** ../vim-7.4a.041/src/testdir/test8.in 2010-05-15 13:04:10.000000000 +0200 --- src/testdir/test8.in 2013-07-24 15:55:09.000000000 +0200 *************** *** 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,21 **** --- 17,43 ---- :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 *** ../vim-7.4a.041/src/testdir/test8.ok 2010-05-15 13:04:10.000000000 +0200 --- src/testdir/test8.ok 2013-07-24 15:40:16.000000000 +0200 *************** *** 4,6 **** --- 4,7 ---- start of Xxx1 test end of Xxx + VimLeave done *** ../vim-7.4a.041/src/version.c 2013-07-24 15:02:00.000000000 +0200 --- src/version.c 2013-07-24 15:55:54.000000000 +0200 *************** *** 729,730 **** --- 729,732 ---- { /* Add new patch number below this line */ + /**/ + 42, /**/ -- hundred-and-one symptoms of being an internet addict: 23. You can't call your mother...she doesn't have a modem. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///