mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
fix(statusline): don't leak memory with zero-width click labels
A zero-width click label isn't assigned to any click definition, so its function name should be freed when filling click definitions.
This commit is contained in:
@@ -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++) {
|
for (int i = 0; click_recs[i].start != NULL; i++) {
|
||||||
len += vim_strnsize(buf, (int)(click_recs[i].start - buf));
|
len += vim_strnsize(buf, (int)(click_recs[i].start - buf));
|
||||||
while (col < len) {
|
if (col < len) {
|
||||||
click_defs[col++] = cur_click_def;
|
while (col < len) {
|
||||||
|
click_defs[col++] = cur_click_def;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
xfree(cur_click_def.func);
|
||||||
}
|
}
|
||||||
buf = (char *)click_recs[i].start;
|
buf = (char *)click_recs[i].start;
|
||||||
cur_click_def = click_recs[i].def;
|
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;
|
cur_click_def.type = kStlClickDisabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (col < width) {
|
if (col < width) {
|
||||||
click_defs[col++] = cur_click_def;
|
while (col < width) {
|
||||||
|
click_defs[col++] = cur_click_def;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
xfree(cur_click_def.func);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -164,6 +164,16 @@ describe('statusline clicks', function()
|
|||||||
meths.input_mouse('right', 'press', '', 0, 6, 5)
|
meths.input_mouse('right', 'press', '', 0, 6, 5)
|
||||||
eq('0 1 r', eval("g:testvar"))
|
eq('0 1 r', eval("g:testvar"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('no memory leak with zero-width click labels', function()
|
||||||
|
command([[
|
||||||
|
let &stl = '%@Test@%T%@MyClickFunc@%=%T%@Test@'
|
||||||
|
]])
|
||||||
|
meths.input_mouse('left', 'press', '', 0, 6, 0)
|
||||||
|
eq('0 1 l', eval("g:testvar"))
|
||||||
|
meths.input_mouse('right', 'press', '', 0, 6, 39)
|
||||||
|
eq('0 1 r', eval("g:testvar"))
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('global statusline', function()
|
describe('global statusline', function()
|
||||||
|
Reference in New Issue
Block a user