From ab46f48dde8aa70e44a2fc2d2a1b81ae703d4981 Mon Sep 17 00:00:00 2001 From: Willow Herring <31960031+ReFil@users.noreply.github.com> Date: Fri, 16 Jan 2026 23:55:13 +0000 Subject: [PATCH] fix(keymap): Fix overflow in get/set bindings (#3205) With the binding referenced to as uint8_t the keymap would be incorrect if more than 256 positions were in use, going to a uint16_t gives large enough headroom to not have to worry --- app/include/zmk/keymap.h | 4 ++-- app/src/keymap.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index c7b2681d5..26fd2d160 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -55,8 +55,8 @@ int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer, bool locking); const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer); const struct zmk_behavior_binding *zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer, - uint8_t binding_idx); -int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer, uint8_t binding_idx, + uint16_t binding_idx); +int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer, uint16_t binding_idx, const struct zmk_behavior_binding binding); #if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) diff --git a/app/src/keymap.c b/app/src/keymap.c index a291d5f01..547d6612f 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -242,7 +242,7 @@ const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer_id) { } const struct zmk_behavior_binding * -zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx) { +zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx) { if (binding_idx >= ZMK_KEYMAP_LEN) { return NULL; } @@ -277,7 +277,7 @@ zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t bind static uint8_t zmk_keymap_layer_pending_changes[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE]; -int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx, +int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx, struct zmk_behavior_binding binding) { if (binding_idx >= ZMK_KEYMAP_LEN) { return -EINVAL; @@ -322,7 +322,7 @@ int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t #else -int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx, +int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx, struct zmk_behavior_binding binding) { return -ENOTSUP; }