From bb6190bec5f18c1f9e2c1d29ef1f7cf7912ea625 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sat, 1 Jun 2024 08:19:41 -0700 Subject: refactor: move shared messages to errors.h #26214 --- src/nvim/winfloat.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/nvim/winfloat.c') diff --git a/src/nvim/winfloat.c b/src/nvim/winfloat.c index e3ca0ff139..77bbaed105 100644 --- a/src/nvim/winfloat.c +++ b/src/nvim/winfloat.c @@ -11,6 +11,7 @@ #include "nvim/autocmd.h" #include "nvim/buffer_defs.h" #include "nvim/drawscreen.h" +#include "nvim/errors.h" #include "nvim/globals.h" #include "nvim/grid.h" #include "nvim/grid_defs.h" -- cgit From 8ddcf9d9390000c05bb817f70a1cbe36f2145d81 Mon Sep 17 00:00:00 2001 From: glepnir Date: Wed, 17 Jul 2024 20:22:59 +0800 Subject: fix(float): handle error in win_float_create() (#29742) Problem: Missing error handling in win_float_create() function. Solution: Add an inline function for error handling. --- src/nvim/winfloat.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'src/nvim/winfloat.c') diff --git a/src/nvim/winfloat.c b/src/nvim/winfloat.c index 77bbaed105..e70f84ee7b 100644 --- a/src/nvim/winfloat.c +++ b/src/nvim/winfloat.c @@ -17,6 +17,7 @@ #include "nvim/grid_defs.h" #include "nvim/macros_defs.h" #include "nvim/memory.h" +#include "nvim/message.h" #include "nvim/mouse.h" #include "nvim/move.h" #include "nvim/option.h" @@ -359,6 +360,21 @@ win_T *win_float_find_altwin(const win_T *win, const tabpage_T *tp) : tp->tp_firstwin; } +/// Inline helper function for handling errors and cleanup in win_float_create. +static inline win_T *handle_error_and_cleanup(win_T *wp, Error *err) +{ + if (ERROR_SET(err)) { + emsg(err->msg); + api_clear_error(err); + } + if (wp) { + win_remove(wp, NULL); + win_free(wp, NULL); + } + unblock_autocmds(); + return NULL; +} + /// create a floating preview window. /// /// @param[in] bool enter floating window. @@ -381,23 +397,25 @@ win_T *win_float_create(bool enter, bool new_buf) block_autocmds(); win_T *wp = win_new_float(NULL, false, config, &err); if (!wp) { - unblock_autocmds(); - return NULL; + return handle_error_and_cleanup(wp, &err); } if (new_buf) { Buffer b = nvim_create_buf(false, true, &err); if (!b) { - win_remove(wp, NULL); - win_free(wp, NULL); - unblock_autocmds(); - return NULL; + return handle_error_and_cleanup(wp, &err); } buf_T *buf = find_buffer_by_handle(b, &err); + if (!buf) { + return handle_error_and_cleanup(wp, &err); + } buf->b_p_bl = false; // unlist set_option_direct_for(kOptBufhidden, STATIC_CSTR_AS_OPTVAL("wipe"), OPT_LOCAL, 0, kOptReqBuf, buf); win_set_buf(wp, buf, &err); + if (ERROR_SET(&err)) { + return handle_error_and_cleanup(wp, &err); + } } unblock_autocmds(); wp->w_p_diff = false; -- cgit From f55213ce0e2b0053ded8416e8ae922a0e406012f Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 27 Sep 2024 22:33:24 +0800 Subject: fix(api): fix crash/leak with float title/footer on error (#30543) --- src/nvim/winfloat.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/nvim/winfloat.c') diff --git a/src/nvim/winfloat.c b/src/nvim/winfloat.c index e70f84ee7b..0a90f638f3 100644 --- a/src/nvim/winfloat.c +++ b/src/nvim/winfloat.c @@ -10,6 +10,7 @@ #include "nvim/ascii_defs.h" #include "nvim/autocmd.h" #include "nvim/buffer_defs.h" +#include "nvim/decoration.h" #include "nvim/drawscreen.h" #include "nvim/errors.h" #include "nvim/globals.h" @@ -202,6 +203,12 @@ void win_config_float(win_T *wp, WinConfig fconfig) wp->w_config.border_hl_ids, sizeof fconfig.border_hl_ids) != 0); + if (fconfig.title_chunks.items != wp->w_config.title_chunks.items) { + clear_virttext(&wp->w_config.title_chunks); + } + if (fconfig.footer_chunks.items != wp->w_config.footer_chunks.items) { + clear_virttext(&wp->w_config.footer_chunks); + } wp->w_config = fconfig; bool has_border = wp->w_floating && wp->w_config.border; -- cgit From 4f9311b759fff0371433fb5b5355fccb001d54e7 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 28 Sep 2024 10:21:06 +0800 Subject: fix(window): making float with title/footer non-float leaks memory (#30551) --- src/nvim/winfloat.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'src/nvim/winfloat.c') diff --git a/src/nvim/winfloat.c b/src/nvim/winfloat.c index 0a90f638f3..f7e9128599 100644 --- a/src/nvim/winfloat.c +++ b/src/nvim/winfloat.c @@ -203,13 +203,7 @@ void win_config_float(win_T *wp, WinConfig fconfig) wp->w_config.border_hl_ids, sizeof fconfig.border_hl_ids) != 0); - if (fconfig.title_chunks.items != wp->w_config.title_chunks.items) { - clear_virttext(&wp->w_config.title_chunks); - } - if (fconfig.footer_chunks.items != wp->w_config.footer_chunks.items) { - clear_virttext(&wp->w_config.footer_chunks); - } - wp->w_config = fconfig; + merge_win_config(&wp->w_config, fconfig); bool has_border = wp->w_floating && wp->w_config.border; for (int i = 0; i < 4; i++) { -- cgit From df915f3afccb2717bc62e7b8649d76885cc3916c Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sun, 29 Sep 2024 18:38:17 +0800 Subject: fix(float): properly find last window of tabpage (#30571) --- src/nvim/winfloat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/nvim/winfloat.c') diff --git a/src/nvim/winfloat.c b/src/nvim/winfloat.c index f7e9128599..fdb65ad614 100644 --- a/src/nvim/winfloat.c +++ b/src/nvim/winfloat.c @@ -59,7 +59,7 @@ win_T *win_new_float(win_T *wp, bool last, WinConfig fconfig, Error *err) if (!tp) { return NULL; } - tp_last = tp->tp_lastwin; + tp_last = tp == curtab ? lastwin : tp->tp_lastwin; while (tp_last->w_floating && tp_last->w_prev) { tp_last = tp_last->w_prev; } -- cgit