commit a2b97209395e4ecdec5d7df4f74be067f655a158
parent d788864cdea705a981aa90ec0625516466c04bec
Author: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Date: Wed, 17 Dec 2025 17:57:30 +0000
fix(api): open_win leak from naughty autocommands
Problem: error set by win_set_buf may leak if autocommands immediately close the
new window.
Solution: free the error set by win_set_buf. (prefer nvim_open_win's error as
it's more important and will cause 0 to be returned)
Diffstat:
2 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c
@@ -337,6 +337,7 @@ Window nvim_open_win(Buffer buffer, Boolean enter, Dict(win_config) *config, Err
}
}
if (!tp) {
+ api_clear_error(err); // may have been set by win_set_buf
api_set_error(err, kErrorTypeException, "Window was closed immediately");
goto cleanup;
}
diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua
@@ -2291,6 +2291,31 @@ describe('API/win', function()
api.nvim_open_win(0, true, { split = 'below' })
eq(11, api.nvim_win_get_height(0))
end)
+
+ it('no leak when win_set_buf fails and window is closed immediately', function()
+ -- Following used to leak.
+ command('autocmd BufEnter * ++once quit! | throw 1337')
+ eq(
+ 'Window was closed immediately',
+ pcall_err(
+ api.nvim_open_win,
+ api.nvim_create_buf(true, true),
+ true,
+ { relative = 'editor', width = 5, height = 5, row = 1, col = 1 }
+ )
+ )
+ -- If the window wasn't closed, still set errors from win_set_buf.
+ command('autocmd BufEnter * ++once throw 1337')
+ eq(
+ 'BufEnter Autocommands for "*": 1337',
+ pcall_err(
+ api.nvim_open_win,
+ api.nvim_create_buf(true, true),
+ true,
+ { relative = 'editor', width = 5, height = 5, row = 1, col = 1 }
+ )
+ )
+ end)
end)
describe('set_config', function()