Skip to content

Commit

Permalink
fix(tabpage): correct check for failure to close window
Browse files Browse the repository at this point in the history
Avoid closing window 999 times.
  • Loading branch information
zeertzjq committed Mar 27, 2022
1 parent f4f18a9 commit ae0a43e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/nvim/ex_docmd.c
Expand Up @@ -6839,7 +6839,7 @@ void tabpage_close_other(tabpage_T *tp, int forceit)

// Autocommands may delete the tab page under our fingers and we may
// fail to close a window with a modified buffer.
if (!valid_tabpage(tp) || tp->tp_firstwin == wp) {
if (!valid_tabpage(tp) || tp->tp_lastwin == wp) {
break;
}
}
Expand Down
17 changes: 17 additions & 0 deletions test/functional/editor/tabpage_spec.lua
Expand Up @@ -3,8 +3,10 @@ local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local command = helpers.command
local eq = helpers.eq
local neq = helpers.neq
local feed = helpers.feed
local eval = helpers.eval
local exec = helpers.exec

describe('tabpage', function()
before_each(clear)
Expand Down Expand Up @@ -34,5 +36,20 @@ describe('tabpage', function()

eq(3, eval('tabpagenr()'))
end)

it('does not crash or loop 999 times if BufWipeout autocommand switches window #17868', function()
exec([[
tabedit
let s:window_id = win_getid()
botright new
setlocal bufhidden=wipe
let g:win_closed = 0
autocmd WinClosed * let g:win_closed += 1
autocmd BufWipeout <buffer> call win_gotoid(s:window_id)
tabprevious
+tabclose
]])
neq(999, eval('g:win_closed'))
end)
end)

0 comments on commit ae0a43e

Please sign in to comment.