aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-03-27 09:19:56 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-03-27 10:01:35 +0800
commitae0a43ec23d9d902d2d9c446dda592873988ea50 (patch)
treeb4367538dee666321835525be7c5634d26f8fea9
parentf4f18a983305d3cf8a6028333e9b99e86283032b (diff)
downloadrneovim-ae0a43ec23d9d902d2d9c446dda592873988ea50.tar.gz
rneovim-ae0a43ec23d9d902d2d9c446dda592873988ea50.tar.bz2
rneovim-ae0a43ec23d9d902d2d9c446dda592873988ea50.zip
fix(tabpage): correct check for failure to close window
Avoid closing window 999 times.
-rw-r--r--src/nvim/ex_docmd.c2
-rw-r--r--test/functional/editor/tabpage_spec.lua17
2 files changed, 18 insertions, 1 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 0dbc9d6b14..20325509c4 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -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;
}
}
diff --git a/test/functional/editor/tabpage_spec.lua b/test/functional/editor/tabpage_spec.lua
index d1d6854b07..2494daf99b 100644
--- a/test/functional/editor/tabpage_spec.lua
+++ b/test/functional/editor/tabpage_spec.lua
@@ -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)
@@ -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)