diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c index 6ce317f38b..55084c9cea 100644 --- 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 index 1686065c57..bb18143749 100644 --- 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()