Fix desktop keybinds buffer overrun

This commit is contained in:
Willy-JL
2024-02-07 03:49:34 +00:00
parent ddfb495498
commit adb4d96bad
4 changed files with 46 additions and 19 deletions
@@ -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));
@@ -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);
@@ -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;
@@ -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,