From adb4d96bad9b791256e457719ccc00c3246cc574 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Wed, 7 Feb 2024 03:49:34 +0000 Subject: [PATCH] Fix desktop keybinds buffer overrun --- .../desktop_settings/desktop_settings_app.c | 30 ++++++++++++++++++- .../desktop_settings/desktop_settings_app.h | 3 +- .../desktop_settings_scene_keybinds_action.c | 12 ++++---- ...ktop_settings_scene_keybinds_action_type.c | 20 ++++++------- 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/applications/settings/desktop_settings/desktop_settings_app.c b/applications/settings/desktop_settings/desktop_settings_app.c index ab2f818cb..b82a47282 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.c +++ b/applications/settings/desktop_settings/desktop_settings_app.c @@ -31,7 +31,7 @@ static bool desktop_settings_back_event_callback(void* context) { return scene_manager_handle_back_event(app->scene_manager); } -char* desktop_settings_app_get_keybind(DesktopSettingsApp* app) { +const char* desktop_settings_app_get_keybind(DesktopSettingsApp* app) { KeybindType type = scene_manager_get_scene_state(app->scene_manager, DesktopSettingsAppSceneKeybindsType); KeybindKey key = @@ -39,6 +39,34 @@ char* desktop_settings_app_get_keybind(DesktopSettingsApp* app) { return app->desktop->keybinds[type][key].data; } +bool desktop_settings_app_set_keybind(DesktopSettingsApp* app, const char* value) { + if(strnlen(value, MAX_KEYBIND_LENGTH) == MAX_KEYBIND_LENGTH) { + // No NULL terminator, value is too long for keybind + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header(message, "Keybind Too Long", 64, 0, AlignCenter, AlignTop); + dialog_message_set_buttons(message, NULL, "Ok", NULL); + dialog_message_set_text( + message, + "Keybinds are max 63 chars.\n" + "Shorten the file path or\n" + "choose something else.", + 64, + 32, + AlignCenter, + AlignCenter); + dialog_message_show(app->dialogs, message); + dialog_message_free(message); + return false; + } + KeybindType type = + scene_manager_get_scene_state(app->scene_manager, DesktopSettingsAppSceneKeybindsType); + KeybindKey key = + scene_manager_get_scene_state(app->scene_manager, DesktopSettingsAppSceneKeybindsKey); + strlcpy(app->desktop->keybinds[type][key].data, value, MAX_KEYBIND_LENGTH); + DESKTOP_KEYBINDS_SAVE(&app->desktop->keybinds, sizeof(app->desktop->keybinds)); + return true; +} + DesktopSettingsApp* desktop_settings_app_alloc() { DesktopSettingsApp* app = malloc(sizeof(DesktopSettingsApp)); diff --git a/applications/settings/desktop_settings/desktop_settings_app.h b/applications/settings/desktop_settings/desktop_settings_app.h index a18de1025..3fcd05601 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.h +++ b/applications/settings/desktop_settings/desktop_settings_app.h @@ -58,4 +58,5 @@ typedef struct { bool save_settings; } DesktopSettingsApp; -char* desktop_settings_app_get_keybind(DesktopSettingsApp* app); +const char* desktop_settings_app_get_keybind(DesktopSettingsApp* app); +bool desktop_settings_app_set_keybind(DesktopSettingsApp* app, const char* value); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action.c index 557956650..40f4fc656 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action.c @@ -5,19 +5,17 @@ static void desktop_settings_scene_keybinds_action_submenu_callback(void* context, uint32_t index) { DesktopSettingsApp* app = context; - char* keybind = desktop_settings_app_get_keybind(app); - strncpy(keybind, (const char*)index, MAX_KEYBIND_LENGTH); - - DESKTOP_KEYBINDS_SAVE(&app->desktop->keybinds, sizeof(app->desktop->keybinds)); - scene_manager_search_and_switch_to_previous_scene( - app->scene_manager, DesktopSettingsAppSceneStart); + if(desktop_settings_app_set_keybind(app, (const char*)index)) { + scene_manager_search_and_switch_to_previous_scene( + app->scene_manager, DesktopSettingsAppSceneStart); + } } void desktop_settings_scene_keybinds_action_on_enter(void* context) { DesktopSettingsApp* app = context; Submenu* submenu = app->submenu; - char* keybind = desktop_settings_app_get_keybind(app); + const char* keybind = desktop_settings_app_get_keybind(app); submenu_reset(submenu); uint32_t pre_select_item = 0; diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action_type.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action_type.c index cd6f54e7e..c4ac5ec56 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action_type.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action_type.c @@ -23,7 +23,7 @@ static void DesktopSettingsApp* app = context; scene_manager_set_scene_state( app->scene_manager, DesktopSettingsAppSceneKeybindsActionType, index); - char* keybind = desktop_settings_app_get_keybind(app); + const char* keybind = desktop_settings_app_get_keybind(app); switch(index) { case DesktopSettingsAppKeybindActionTypeMainApp: @@ -60,19 +60,19 @@ static void } furi_record_close(RECORD_STORAGE); if(dialog_file_browser_show(app->dialogs, temp_path, temp_path, &browser_options)) { - strncpy(keybind, furi_string_get_cstr(temp_path), MAX_KEYBIND_LENGTH); - DESKTOP_KEYBINDS_SAVE(&app->desktop->keybinds, sizeof(app->desktop->keybinds)); - scene_manager_search_and_switch_to_previous_scene( - app->scene_manager, DesktopSettingsAppSceneStart); + if(desktop_settings_app_set_keybind(app, furi_string_get_cstr(temp_path))) { + scene_manager_search_and_switch_to_previous_scene( + app->scene_manager, DesktopSettingsAppSceneStart); + } } furi_string_free(temp_path); break; } case DesktopSettingsAppKeybindActionTypeRemoveKeybind: - strncpy(keybind, "", MAX_KEYBIND_LENGTH); - DESKTOP_KEYBINDS_SAVE(&app->desktop->keybinds, sizeof(app->desktop->keybinds)); - scene_manager_search_and_switch_to_previous_scene( - app->scene_manager, DesktopSettingsAppSceneStart); + if(desktop_settings_app_set_keybind(app, "")) { + scene_manager_search_and_switch_to_previous_scene( + app->scene_manager, DesktopSettingsAppSceneStart); + } break; default: break; @@ -82,7 +82,7 @@ static void void desktop_settings_scene_keybinds_action_type_on_enter(void* context) { DesktopSettingsApp* app = context; Submenu* submenu = app->submenu; - char* keybind = desktop_settings_app_get_keybind(app); + const char* keybind = desktop_settings_app_get_keybind(app); submenu_add_item( submenu,