keymap: be more careful in xkb_keymap_unref
authorRan Benita <ran234@gmail.com>
Sat, 27 Jul 2013 18:19:22 +0000 (21:19 +0300)
committerRan Benita <ran234@gmail.com>
Wed, 31 Jul 2013 07:58:25 +0000 (10:58 +0300)
To allow calling _unref on the keymap in whatever limbo state it happens
to be in.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/keymap.c

index 4fbf33e..f8efd7b 100644 (file)
@@ -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);