From 5f787e5e91492b40804049d0c45ea64b25de0c49 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Sat, 27 Jul 2013 21:19:22 +0300 Subject: [PATCH] keymap: be more careful in xkb_keymap_unref To allow calling _unref on the keymap in whatever limbo state it happens to be in. Signed-off-by: Ran Benita --- src/keymap.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/keymap.c b/src/keymap.c index 4fbf33e..f8efd7b 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -91,21 +91,27 @@ xkb_keymap_unref(struct xkb_keymap *keymap) if (keymap->keys) { xkb_foreach_key(key, keymap) { - for (i = 0; i < key->num_groups; i++) { - for (j = 0; j < XkbKeyGroupWidth(key, i); j++) - if (key->groups[i].levels[j].num_syms > 1) - free(key->groups[i].levels[j].u.syms); - free(key->groups[i].levels); + if (key->groups) { + for (i = 0; i < key->num_groups; i++) { + if (key->groups[i].levels) { + for (j = 0; j < XkbKeyGroupWidth(key, i); j++) + if (key->groups[i].levels[j].num_syms > 1) + free(key->groups[i].levels[j].u.syms); + free(key->groups[i].levels); + } + } + free(key->groups); } - free(key->groups); } free(keymap->keys); } - for (i = 0; i < keymap->num_types; i++) { - free(keymap->types[i].entries); - free(keymap->types[i].level_names); + if (keymap->types) { + for (i = 0; i < keymap->num_types; i++) { + free(keymap->types[i].entries); + free(keymap->types[i].level_names); + } + free(keymap->types); } - free(keymap->types); free(keymap->sym_interprets); free(keymap->key_aliases); free(keymap->group_names); -- 2.7.4