From fcd9905291c02917410ff7c55542fd73e4b25e2d Mon Sep 17 00:00:00 2001 From: luukvbaal Date: Tue, 23 Jan 2024 22:51:18 +0100 Subject: [PATCH] fix(sign): avoid deleting from sign map while looping over it (#27158) --- src/nvim/sign.c | 7 ++++++- test/functional/ui/sign_spec.lua | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/nvim/sign.c b/src/nvim/sign.c index b1a2d1ad08..dc09bcc5a0 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -1021,9 +1021,14 @@ static void sign_get_placed(buf_T *buf, linenr_T lnum, int id, const char *group void free_signs(void) { cstr_t name; + kvec_t(cstr_t) names = KV_INITIAL_VALUE; map_foreach_key(&sign_map, name, { - sign_undefine_by_name(name); + kv_push(names, name); }); + for (size_t i = 0; i < kv_size(names); i++) { + sign_undefine_by_name(kv_A(names, i)); + } + kv_destroy(names); } static enum { diff --git a/test/functional/ui/sign_spec.lua b/test/functional/ui/sign_spec.lua index af03bce4a0..847a918dc9 100644 --- a/test/functional/ui/sign_spec.lua +++ b/test/functional/ui/sign_spec.lua @@ -1,6 +1,7 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') -local clear, feed, exec, api = helpers.clear, helpers.feed, helpers.exec, helpers.api +local api, clear, eq = helpers.api, helpers.clear, helpers.eq +local eval, exec, feed = helpers.eval, helpers.exec, helpers.feed describe('Signs', function() local screen @@ -565,4 +566,13 @@ describe('Signs', function() | ]]) end) + + it('sign_undefine() frees all signs', function() + exec([[ + sign define 1 text=1 + sign define 2 text=2 + call sign_undefine() + ]]) + eq({}, eval('sign_getdefined()')) + end) end)