rcxml.c: fix mem leak when deduplicating keybinds

Before this patch `keybind->keysyms` wasn't free'd when
- deduplicating keybinds
- removing keybinds due to empty action list

This patch creates a shared `keybind_destroy()` helper
which gets used in all cases where a keybind is destroyed.
This commit is contained in:
Consolatis 2024-11-15 22:58:44 +01:00 committed by Johan Malm
parent 07110d41ff
commit 6754801052
3 changed files with 14 additions and 4 deletions

View file

@ -30,6 +30,8 @@ struct keybind {
*/
struct keybind *keybind_create(const char *keybind);
void keybind_destroy(struct keybind *keybind);
/**
* parse_modifier - parse a string containing a single modifier name (e.g. "S")
* into the represented modifier value. returns 0 for invalid modifier names.

View file

@ -188,3 +188,12 @@ keybind_create(const char *keybind)
wl_list_init(&k->actions);
return k;
}
void
keybind_destroy(struct keybind *keybind)
{
assert(wl_list_empty(&keybind->actions));
zfree(keybind->keysyms);
zfree(keybind);
}

View file

@ -1626,7 +1626,7 @@ deduplicate_key_bindings(void)
if (keybind_the_same(existing, current)) {
wl_list_remove(&existing->link);
action_list_free(&existing->actions);
free(existing);
keybind_destroy(existing);
replaced++;
break;
}
@ -1635,7 +1635,7 @@ deduplicate_key_bindings(void)
wl_list_for_each_safe(current, tmp, &rc.keybinds, link) {
if (wl_list_empty(&current->actions)) {
wl_list_remove(&current->link);
free(current);
keybind_destroy(current);
cleared++;
}
}
@ -1948,8 +1948,7 @@ rcxml_finish(void)
wl_list_for_each_safe(k, k_tmp, &rc.keybinds, link) {
wl_list_remove(&k->link);
action_list_free(&k->actions);
zfree(k->keysyms);
zfree(k);
keybind_destroy(k);
}
struct mousebind *m, *m_tmp;