Skip to content

Commit

Permalink
vial/encoder: fix memory corruption in exec_keycode
Browse files Browse the repository at this point in the history
get_record_keycode calls into update_source_layers_cache which corrupts
memory because our magic row/col isn't present in the matrix

based on drashna code in https://github.com/drashna/qmk_firmware/blob/ed6153062fb868983cb95a23793866c6f8d66c44/users/drashna/encoder_stuff.c
  • Loading branch information
xyzz committed Mar 22, 2021
1 parent c9c90c0 commit c69a05c
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 9 deletions.
8 changes: 5 additions & 3 deletions quantum/quantum.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,14 @@ void post_process_record_quantum(keyrecord_t *record) {
post_process_record_kb(keycode, record);
}

bool process_record_quantum(keyrecord_t *record) {
uint16_t keycode = get_record_keycode(record, true);
return process_record_quantum_helper(keycode, record);
}
/* Core keycode function, hands off handling to other functions,
then processes internal quantum keycodes, and then processes
ACTIONs. */
bool process_record_quantum(keyrecord_t *record) {
uint16_t keycode = get_record_keycode(record, true);

bool process_record_quantum_helper(uint16_t keycode, keyrecord_t *record) {
// This is how you use actions here
// if (keycode == KC_LEAD) {
// action_t action;
Expand Down
1 change: 1 addition & 0 deletions quantum/quantum.h
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record);
bool process_record_user(uint16_t keycode, keyrecord_t *record);
void post_process_record_kb(uint16_t keycode, keyrecord_t *record);
void post_process_record_user(uint16_t keycode, keyrecord_t *record);
bool process_record_quantum_helper(uint16_t keycode, keyrecord_t *record);

#ifndef BOOTMAGIC_LITE_COLUMN
# define BOOTMAGIC_LITE_COLUMN 0
Expand Down
20 changes: 14 additions & 6 deletions quantum/vial.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,15 +176,23 @@ static void exec_keycode(uint16_t keycode) {
#else
g_vial_magic_keycode_override = keycode;

action_exec((keyevent_t){
.key = (keypos_t){.row = VIAL_ENCODER_MATRIX_MAGIC, .col = VIAL_ENCODER_MATRIX_MAGIC}, .pressed = 1, .time = (timer_read() | 1) /* time should not be 0 */
});
keyrecord_t record = {.event = (keyevent_t){.key = { VIAL_ENCODER_MATRIX_MAGIC, VIAL_ENCODER_MATRIX_MAGIC }, .pressed = true, .time = (timer_read() | 1)}};

if (keycode <= QK_MODS_MAX)
register_code16(keycode);
else
process_record_quantum_helper(keycode, &record);

#if VIAL_ENCODER_KEYCODE_DELAY > 0
wait_ms(VIAL_ENCODER_KEYCODE_DELAY);
#endif
action_exec((keyevent_t){
.key = (keypos_t){.row = VIAL_ENCODER_MATRIX_MAGIC, .col = VIAL_ENCODER_MATRIX_MAGIC}, .pressed = 0, .time = (timer_read() | 1) /* time should not be 0 */
});
record.event.time = timer_read() | 1;
record.event.pressed = false;

if (keycode <= QK_MODS_MAX)
unregister_code16(keycode);
else
process_record_quantum_helper(keycode, &record);
#endif
}

Expand Down

0 comments on commit c69a05c

Please sign in to comment.