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 <ran234@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
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);