map: verifiy that the keycode is legal
authorRan Benita <ran234@gmail.com>
Sun, 15 Jul 2012 11:35:57 +0000 (14:35 +0300)
committerRan Benita <ran234@gmail.com>
Wed, 18 Jul 2012 09:46:29 +0000 (12:46 +0300)
In case someone passes in a bad keycode.

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

index 1cbbc38..a91eba4 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -247,10 +247,14 @@ xkb_key_get_level(struct xkb_state *state, xkb_keycode_t kc,
                   unsigned int group)
 {
     struct xkb_keymap *keymap = xkb_state_get_map(state);
-    struct xkb_key_type *type = XkbKeyType(keymap, kc, group);
+    struct xkb_key_type *type;
     struct xkb_kt_map_entry *entry;
     unsigned int active_mods;
 
+    if (!XkbKeycodeInRange(keymap, kc))
+        return 0;
+
+    type = XkbKeyType(keymap, kc, group);
     active_mods = xkb_state_serialize_mods(state, XKB_STATE_EFFECTIVE);
     active_mods &= type->mods.mask;
 
@@ -271,7 +275,11 @@ xkb_key_get_group(struct xkb_state *state, xkb_keycode_t kc)
 {
     struct xkb_keymap *keymap = xkb_state_get_map(state);
     unsigned int ret = xkb_state_serialize_group(state, XKB_STATE_EFFECTIVE);
-    struct xkb_key *key = XkbKey(keymap, kc);
+    struct xkb_key *key;
+
+    if (!XkbKeycodeInRange(keymap, kc))
+        return 0;
+    key = XkbKey(keymap, kc);
 
     if (ret < key->num_groups)
         return ret;
@@ -336,7 +344,7 @@ xkb_key_get_syms(struct xkb_state *state, xkb_keycode_t kc,
     int group;
     int level;
 
-    if (!state || kc < keymap->min_key_code || kc > keymap->max_key_code)
+    if (!state || !XkbKeycodeInRange(keymap, kc))
         return -1;
 
     group = xkb_key_get_group(state, kc);