From 60d320dea3fe7b7d666d5a18ec8b94178c31acf4 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 21 Jul 2023 08:21:46 +0800 Subject: [PATCH] fix(decoration_provider): don't leak memory on error (#24410) --- src/nvim/decoration_provider.c | 9 +++++---- src/nvim/message.c | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/nvim/decoration_provider.c b/src/nvim/decoration_provider.c index 5f2e2735a9..8e5809c4e0 100644 --- a/src/nvim/decoration_provider.c +++ b/src/nvim/decoration_provider.c @@ -26,11 +26,11 @@ static kvec_t(DecorProvider) decor_providers = KV_INITIAL_VALUE; LUA_NOREF, LUA_NOREF, LUA_NOREF, \ LUA_NOREF, -1, false, false, 0 } -static void decor_provider_error(DecorProvider *provider, const char *name, Error err) +static void decor_provider_error(DecorProvider *provider, const char *name, const char *msg) { const char *ns_name = describe_ns(provider->ns_id); - ELOG("error in provider %s.%s: %s", ns_name, name, err.msg); - msg_schedule_semsg_multiline("Error in decoration provider %s.%s:\n%s", ns_name, name, err.msg); + ELOG("error in provider %s.%s: %s", ns_name, name, msg); + msg_schedule_semsg_multiline("Error in decoration provider %s.%s:\n%s", ns_name, name, msg); } static bool decor_provider_invoke(DecorProvider *provider, const char *name, LuaRef ref, Array args, @@ -51,7 +51,7 @@ static bool decor_provider_invoke(DecorProvider *provider, const char *name, Lua } if (ERROR_SET(&err)) { - decor_provider_error(provider, name, err); + decor_provider_error(provider, name, err.msg); provider->error_count++; if (provider->error_count >= DP_MAX_ERROR) { @@ -59,6 +59,7 @@ static bool decor_provider_invoke(DecorProvider *provider, const char *name, Lua } } + api_clear_error(&err); api_free_object(ret); return false; } diff --git a/src/nvim/message.c b/src/nvim/message.c index 1f6790225c..81760dd017 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -896,10 +896,10 @@ void msg_schedule_semsg_multiline(const char *const fmt, ...) { va_list ap; va_start(ap, fmt); - vim_vsnprintf((char *)IObuff, IOSIZE, fmt, ap); + vim_vsnprintf(IObuff, IOSIZE, fmt, ap); va_end(ap); - char *s = xstrdup((char *)IObuff); + char *s = xstrdup(IObuff); loop_schedule_deferred(&main_loop, event_create(msg_semsg_multiline_event, 1, s)); }