patch 9.1.2055: Division by zero in :file after failing to wipe buffer
Commit:
https://github.com/vim/vim/commit/1aa5ca4ecbef76a4df3a228e115eae7cc939cc86
Author: zeertzjq <[email protected]>
Date: Tue Jan 6 11:11:16 2026 +0000
patch 9.1.2055: Division by zero in :file after failing to wipe buffer
Problem: Division by zero in :file after failing to wipe buffer
(after 8.2.4631).
Solution: Still call buf_clear_file() when failing to wipe buffer
(zeertzjq).
closes: #19088
Signed-off-by: zeertzjq <[email protected]>
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/src/buffer.c b/src/buffer.c
index 7dca75307..1d624ae91 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -707,7 +707,7 @@ aucmd_abort:
// If the buffer was in curwin and the window has changed, go back to that
// window, if it still exists. This avoids that ":edit x" triggering a
// "tabnext" BufUnload autocmd leaves a window behind without a buffer.
- if (is_curwin && curwin != the_curwin && win_valid_any_tab(the_curwin))
+ if (is_curwin && curwin != the_curwin && win_valid_any_tab(the_curwin))
{
block_autocmds();
goto_tabpage_win(the_curtab, the_curwin);
@@ -782,16 +782,13 @@ aucmd_abort:
/*
* Remove the buffer from the list.
+ * Do not wipe out the buffer if it is used in a window.
*/
- if (wipe_buf)
+ if (wipe_buf && buf->b_nwindows <= 0)
{
tabpage_T *tp;
win_T *wp;
- // Do not wipe out the buffer if it is used in a window.
- if (buf->b_nwindows > 0)
- return FALSE;
-
FOR_ALL_TAB_WINDOWS(tp, wp)
mark_forget_file(wp, buf->b_fnum);
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 96b076b5e..12203cbe0 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -3696,7 +3696,7 @@ func Test_BufReadPre_changebuf()
close!
endfunc
-" Test for BufWipeouti autocmd changing the current buffer when reading a file
+" Test for BufWipeout autocmd changing the current buffer when reading a file
" in an empty buffer with 'f' flag in 'cpo'
func Test_BufDelete_changebuf()
new
@@ -4016,6 +4016,29 @@ func Test_bufwipeout_changes_window()
%bwipe!
endfunc
+func Test_autocmd_prevent_buf_wipe()
+ " Xa must be the first buffer so that win_close_othertab() puts it in
+ " another window, which causes wiping the buffer to fail.
+ %bwipe!
+
+ file Xa
+ call setline(1, 'foo')
+ setlocal bufhidden=wipe
+ tabnew Xb
+ setlocal bufhidden=wipe
+ autocmd BufUnload Xa ++once ++nested tabonly
+ autocmd BufWinLeave Xb ++once tabnext
+ tabfirst
+
+ edit! Xc
+ call assert_equal('Xc', bufname('%'))
+ tabnext
+ call assert_equal('Xa', bufname('%'))
+ call assert_equal("
\"Xa\" --No lines in buffer--", execute('file'))
+
+ %bwipe!
+endfunc
+
func Test_v_event_readonly()
autocmd CompleteChanged * let v:event.width = 0
call assert_fails("normal! i\<C-X>\<C-V>", 'E46:')
diff --git a/src/version.c b/src/version.c
index 2f0b90769..24e5ac79a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -734,6 +734,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 2055,
/**/
2054,
/**/
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/vim_dev/E1vd51j-00Gop3-Vk%40256bit.org.