commit 01ddc097474627f35cc34fb7015dd26505e2ddcc
parent 295a264b65bd072bf858496e0e5de83d5b1f5ffa
Author: zeertzjq <zeertzjq@outlook.com>
Date: Wed, 18 Jan 2023 19:10:58 +0800
fix(statusline): don't leak memory with truncated click labels
Diffstat:
2 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/src/nvim/statusline.c b/src/nvim/statusline.c
@@ -1987,6 +1987,11 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, char *opt_n
// the truncation point
for (int i = 0; i < itemcnt; i++) {
if (stl_items[i].start > trunc_p) {
+ for (int j = i; j < itemcnt; j++) {
+ if (stl_items[j].type == ClickFunc) {
+ XFREE_CLEAR(stl_items[j].cmd);
+ }
+ }
itemcnt = i;
break;
}
diff --git a/test/functional/ui/statusline_spec.lua b/test/functional/ui/statusline_spec.lua
@@ -174,6 +174,14 @@ describe('statusline clicks', function()
meths.input_mouse('right', 'press', '', 0, 6, 39)
eq('0 1 r', eval("g:testvar"))
end)
+
+ it('no memory leak with truncated click labels', function()
+ command([[
+ let &stl = '%@MyClickFunc@foo%X' .. repeat('a', 40) .. '%<t%@Test@bar%X%@Test@baz'
+ ]])
+ meths.input_mouse('left', 'press', '', 0, 6, 2)
+ eq('0 1 l', eval("g:testvar"))
+ end)
end)
describe('global statusline', function()