diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-01-19 11:00:00 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-19 11:00:00 +0800 |
commit | 42e9a09a44f4203a96aabbbe2382ae9bb46096d4 (patch) | |
tree | 99f5a737c12c744d767703f49f0a20c2e5630def /src | |
parent | 45dc0f3454d826c42efdcd841953b5e7e613bc5e (diff) | |
parent | 01ddc097474627f35cc34fb7015dd26505e2ddcc (diff) | |
download | rneovim-42e9a09a44f4203a96aabbbe2382ae9bb46096d4.tar.gz rneovim-42e9a09a44f4203a96aabbbe2382ae9bb46096d4.tar.bz2 rneovim-42e9a09a44f4203a96aabbbe2382ae9bb46096d4.zip |
Merge pull request #21879 from zeertzjq/stl-click-zero-len
Fix statusline memory leaks with click labels
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/statusline.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/nvim/statusline.c b/src/nvim/statusline.c index 0639615b8b..29ce8dab71 100644 --- a/src/nvim/statusline.c +++ b/src/nvim/statusline.c @@ -231,8 +231,12 @@ void stl_fill_click_defs(StlClickDefinition *click_defs, StlClickRecord *click_r }; for (int i = 0; click_recs[i].start != NULL; i++) { len += vim_strnsize(buf, (int)(click_recs[i].start - buf)); - while (col < len) { - click_defs[col++] = cur_click_def; + if (col < len) { + while (col < len) { + click_defs[col++] = cur_click_def; + } + } else { + xfree(cur_click_def.func); } buf = (char *)click_recs[i].start; cur_click_def = click_recs[i].def; @@ -242,8 +246,12 @@ void stl_fill_click_defs(StlClickDefinition *click_defs, StlClickRecord *click_r cur_click_def.type = kStlClickDisabled; } } - while (col < width) { - click_defs[col++] = cur_click_def; + if (col < width) { + while (col < width) { + click_defs[col++] = cur_click_def; + } + } else { + xfree(cur_click_def.func); } } @@ -1979,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; } |