aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/win_config.c
diff options
context:
space:
mode:
authorSean Dewar <seandewar@users.noreply.github.com>2024-02-04 00:42:36 +0000
committerSean Dewar <6256228+seandewar@users.noreply.github.com>2024-03-08 22:37:31 +0000
commitbcb70eeac48040fd6d6bfc20cf7fb6f41374a67c (patch)
treeda257682c06ca8f8f11b5c4aac8db49649d0cd1a /src/nvim/api/win_config.c
parenta69c72063994f8e9064b6d9c9f280120423897b8 (diff)
downloadrneovim-bcb70eeac48040fd6d6bfc20cf7fb6f41374a67c.tar.gz
rneovim-bcb70eeac48040fd6d6bfc20cf7fb6f41374a67c.tar.bz2
rneovim-bcb70eeac48040fd6d6bfc20cf7fb6f41374a67c.zip
fix(api): win_set_config autocmds crash when moving win to other tabpage
Problem: win_enter autocommands can close new_curwin, crashing if it was the last window in its tabpage after removing win, or can close parent, crashing when attempting to split it later. Solution: remove win first, check that parent is valid after win_enter. NOTE: This isn't actually quite right, as this means win is not in the window list or even has a frame when triggering enter autocommands (so it's not considered valid in the tabpage). This is addressed in later commits.
Diffstat (limited to 'src/nvim/api/win_config.c')
-rw-r--r--src/nvim/api/win_config.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c
index 3cc520dc78..bb1117b3fe 100644
--- a/src/nvim/api/win_config.c
+++ b/src/nvim/api/win_config.c
@@ -478,12 +478,17 @@ void nvim_win_set_config(Window window, Dict(win_config) *config, Error *err)
int dir;
new_curwin = winframe_remove(win, &dir, win_tp == curtab ? NULL : win_tp);
}
+ win_remove(win, win_tp == curtab ? NULL : win_tp);
// move to neighboring window if we're moving the current window to a new tabpage
if (curwin == win && parent != NULL && new_curwin != NULL
&& win_tp != win_find_tabpage(parent)) {
win_enter(new_curwin, true);
+ if (!win_valid_any_tab(parent)) {
+ // win_enter autocommands closed the `parent` to split from.
+ api_set_error(err, kErrorTypeException, "Window to split was closed");
+ return;
+ }
}
- win_remove(win, win_tp == curtab ? NULL : win_tp);
} else {
win_remove(win, win_tp == curtab ? NULL : win_tp);
ui_comp_remove_grid(&win->w_grid_alloc);