Skip to content

Commit c1c34e8

Browse files
committed
fix(keymap): Fix overflow in get/set bindings
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
1 parent 24487bd commit c1c34e8

2 files changed

Lines changed: 7 additions & 7 deletions

File tree

app/include/zmk/keymap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer, bool locking);
5555
const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer);
5656

5757
const struct zmk_behavior_binding *zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer,
58-
uint8_t binding_idx);
59-
int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer, uint8_t binding_idx,
58+
uint16_t binding_idx);
59+
int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer, uint16_t binding_idx,
6060
const struct zmk_behavior_binding binding);
6161

6262
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)

app/src/keymap.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer_id) {
242242
}
243243

244244
const struct zmk_behavior_binding *
245-
zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx) {
245+
zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx) {
246246
if (binding_idx >= ZMK_KEYMAP_LEN) {
247247
return NULL;
248248
}
@@ -277,7 +277,7 @@ zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t bind
277277

278278
static uint8_t zmk_keymap_layer_pending_changes[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE];
279279

280-
int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx,
280+
int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx,
281281
struct zmk_behavior_binding binding) {
282282
if (binding_idx >= ZMK_KEYMAP_LEN) {
283283
return -EINVAL;
@@ -322,7 +322,7 @@ int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t
322322

323323
#else
324324

325-
int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx,
325+
int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx,
326326
struct zmk_behavior_binding binding) {
327327
return -ENOTSUP;
328328
}
@@ -631,8 +631,8 @@ static int keymap_track_changed_bindings(const char *key, size_t len, settings_r
631631
void *cb_arg, void *param) {
632632
const char *next;
633633
if (settings_name_steq(key, "l", &next) && next) {
634-
uint8_t(*state)[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE] =
635-
(uint8_t(*)[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE])param;
634+
uint8_t (*state)[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE] =
635+
(uint8_t (*)[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE])param;
636636
char *endptr;
637637
uint8_t layer = strtoul(next, &endptr, 10);
638638
if (*endptr != '/') {

0 commit comments

Comments
 (0)