From 12957e461d18c06567807cbaf6f973d60684e7d7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 9 Sep 2017 05:26:14 +0200 Subject: [PATCH] Reduce more stack usage for offending functions --- audio/audio_driver.c | 9 +-- command.c | 151 +++++++++++++++++++++++++++---------------- 2 files changed, 100 insertions(+), 60 deletions(-) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index c6f1990fc8..45a02e6fd3 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -755,11 +755,12 @@ void audio_driver_dsp_filter_init(const char *device) { struct string_list *plugs = NULL; #if defined(HAVE_DYLIB) && !defined(HAVE_FILTERS_BUILTIN) - char *basedir = (char*)calloc(PATH_MAX_LENGTH, sizeof(*basedir)); - char *ext_name = (char*)calloc(PATH_MAX_LENGTH, sizeof(*ext_name)); - fill_pathname_basedir(basedir, device, sizeof(basedir)); + char *basedir = (char*)calloc(PATH_MAX_LENGTH, sizeof(*basedir)); + char *ext_name = (char*)calloc(PATH_MAX_LENGTH, sizeof(*ext_name)); + size_t str_size = PATH_MAX_LENGTH * sizeof(char); + fill_pathname_basedir(basedir, device, str_size); - if (!frontend_driver_get_core_extension(ext_name, sizeof(ext_name))) + if (!frontend_driver_get_core_extension(ext_name, str_size)) goto error; plugs = dir_list_new(basedir, ext_name, false, true, false, false); diff --git a/command.c b/command.c index 9fa4b5b80e..89997e8b23 100644 --- a/command.c +++ b/command.c @@ -1075,31 +1075,33 @@ static void command_event_init_cheats(void) static void command_event_load_auto_state(void) { bool ret; - char msg[128] = {0}; - char savestate_name_auto[PATH_MAX_LENGTH] = {0}; - settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); + char msg[128] = {0}; + char *savestate_name_auto = (char*)calloc(PATH_MAX_LENGTH, + sizeof(*savestate_name_auto)); + size_t savestate_name_auto_size = PATH_MAX_LENGTH * sizeof(char); + settings_t *settings = config_get_ptr(); + global_t *global = global_get_ptr(); #ifdef HAVE_NETWORKING if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL)) - return; + goto error; #endif #ifdef HAVE_CHEEVOS if (settings->bools.cheevos_hardcore_mode_enable) - return; + goto error; #endif if (!settings->bools.savestate_auto_load) - return; + goto error; if (global) fill_pathname_noext(savestate_name_auto, global->name.savestate, file_path_str(FILE_PATH_AUTO_EXTENSION), - sizeof(savestate_name_auto)); + savestate_name_auto_size); if (!path_file_exists(savestate_name_auto)) - return; + goto error; ret = content_load_state(savestate_name_auto, false, true); @@ -1110,20 +1112,28 @@ static void command_event_load_auto_state(void) msg_hash_to_str(MSG_AUTOLOADING_SAVESTATE_FROM), savestate_name_auto, ret ? "succeeded" : "failed"); RARCH_LOG("%s\n", msg); + + free(savestate_name_auto); + + return; + +error: + free(savestate_name_auto); } static void command_event_set_savestate_auto_index(void) { size_t i; - char state_dir[PATH_MAX_LENGTH] = {0}; - char state_base[PATH_MAX_LENGTH] = {0}; - struct string_list *dir_list = NULL; - unsigned max_idx = 0; - settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); + char *state_dir = (char*)calloc(PATH_MAX_LENGTH, sizeof(*state_dir)); + char *state_base = (char*)calloc(PATH_MAX_LENGTH, sizeof(*state_base)); + size_t state_size = PATH_MAX_LENGTH * sizeof(char); + struct string_list *dir_list = NULL; + unsigned max_idx = 0; + settings_t *settings = config_get_ptr(); + global_t *global = global_get_ptr(); if (!settings->bools.savestate_auto_index) - return; + goto error; if (global) { @@ -1134,15 +1144,15 @@ static void command_event_set_savestate_auto_index(void) * /foo/path/content.state%d, where %d is the largest number available. */ fill_pathname_basedir(state_dir, global->name.savestate, - sizeof(state_dir)); + state_size); fill_pathname_base(state_base, global->name.savestate, - sizeof(state_base)); + state_size); } dir_list = dir_list_new_special(state_dir, DIR_LIST_PLAIN, NULL); if (!dir_list) - return; + goto error; for (i = 0; i < dir_list->size; i++) { @@ -1172,6 +1182,14 @@ static void command_event_set_savestate_auto_index(void) RARCH_LOG("%s: #%d\n", msg_hash_to_str(MSG_FOUND_LAST_STATE_SLOT), max_idx); + + free(state_dir); + free(state_base); + return; + +error: + free(state_dir); + free(state_base); } static bool event_init_content(void) @@ -1297,33 +1315,36 @@ static void command_event_restore_remaps(void) static bool command_event_save_auto_state(void) { - char savestate_name_auto[PATH_MAX_LENGTH] = {0}; - bool ret = false; - bool contentless = false; - bool is_inited = false; - settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); + bool ret = false; + bool contentless = false; + bool is_inited = false; + char *savestate_name_auto = (char*) + calloc(PATH_MAX_LENGTH, sizeof(*savestate_name_auto)); + size_t + savestate_name_auto_size = PATH_MAX_LENGTH * sizeof(char); + settings_t *settings = config_get_ptr(); + global_t *global = global_get_ptr(); if (!settings || !settings->bools.savestate_auto_save) - return false; + goto error; if (!global) - return false; + goto error; if (rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) - return false; + goto error; content_get_status(&contentless, &is_inited); if (contentless) - return false; + goto error; #ifdef HAVE_CHEEVOS if (settings->bools.cheevos_hardcore_mode_enable) - return false; + goto error; #endif fill_pathname_noext(savestate_name_auto, global->name.savestate, file_path_str(FILE_PATH_AUTO_EXTENSION), - sizeof(savestate_name_auto)); + savestate_name_auto_size); ret = content_save_state((const char*)savestate_name_auto, true, true); RARCH_LOG("%s \"%s\" %s.\n", @@ -1331,7 +1352,12 @@ static bool command_event_save_auto_state(void) savestate_name_auto, ret ? "succeeded" : "failed"); + free(savestate_name_auto); return true; + +error: + free(savestate_name_auto); + return false; } static bool command_event_save_config(const char *config_path, @@ -1364,29 +1390,30 @@ static bool command_event_save_config(const char *config_path, **/ static bool command_event_save_core_config(void) { - char config_dir[PATH_MAX_LENGTH]; - char config_name[PATH_MAX_LENGTH]; - char config_path[PATH_MAX_LENGTH]; char msg[128]; - bool ret = false; - bool found_path = false; - bool overrides_active = false; - settings_t *settings = config_get_ptr(); + bool ret = false; + bool found_path = false; + bool overrides_active = false; + char *config_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + char *config_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + char *config_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + size_t config_size = PATH_MAX_LENGTH * sizeof(char); + settings_t *settings = config_get_ptr(); - config_dir[0] = config_name[0] = - config_path[0] = msg[0] = '\0'; + config_dir[0] = config_name[0] = + config_path[0] = msg[0] = '\0'; if (!string_is_empty(settings->paths.directory_menu_config)) strlcpy(config_dir, settings->paths.directory_menu_config, - sizeof(config_dir)); + config_size); else if (!path_is_empty(RARCH_PATH_CONFIG)) /* Fallback */ fill_pathname_basedir(config_dir, path_get(RARCH_PATH_CONFIG), - sizeof(config_dir)); + config_size); else { runloop_msg_queue_push(msg_hash_to_str(MSG_CONFIG_DIRECTORY_NOT_SET), 1, 180, true); RARCH_ERR("[Config]: %s\n", msg_hash_to_str(MSG_CONFIG_DIRECTORY_NOT_SET)); - return false; + goto error; } /* Infer file name based on libretro core. */ @@ -1403,10 +1430,10 @@ static bool command_event_save_core_config(void) fill_pathname_base_noext( config_name, path_get(RARCH_PATH_CORE), - sizeof(config_name)); + config_size); fill_pathname_join(config_path, config_dir, config_name, - sizeof(config_path)); + config_size); if (i) snprintf(tmp, sizeof(tmp), "-%u%s", @@ -1417,7 +1444,7 @@ static bool command_event_save_core_config(void) file_path_str(FILE_PATH_CONFIG_EXTENSION), sizeof(tmp)); - strlcat(config_path, tmp, sizeof(config_path)); + strlcat(config_path, tmp, config_size); if (!path_file_exists(config_path)) { found_path = true; @@ -1433,9 +1460,9 @@ static bool command_event_save_core_config(void) msg_hash_to_str(MSG_CANNOT_INFER_NEW_CONFIG_PATH)); fill_dated_filename(config_name, file_path_str(FILE_PATH_CONFIG_EXTENSION), - sizeof(config_name)); + config_size); fill_pathname_join(config_path, config_dir, config_name, - sizeof(config_path)); + config_size); } if (rarch_ctl(RARCH_CTL_IS_OVERRIDES_ACTIVE, NULL)) @@ -1455,7 +1482,17 @@ static bool command_event_save_core_config(void) rarch_ctl(RARCH_CTL_SET_OVERRIDES_ACTIVE, NULL); else rarch_ctl(RARCH_CTL_UNSET_OVERRIDES_ACTIVE, NULL); + + free(config_dir); + free(config_name); + free(config_path); return ret; + +error: + free(config_dir); + free(config_name); + free(config_path); + return false; } /** @@ -1546,13 +1583,14 @@ static void command_event_undo_load_state(char *s, size_t len) static bool command_event_main_state(unsigned cmd) { retro_ctx_size_info_t info; - char path[PATH_MAX_LENGTH]; char msg[128]; + char *state_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + size_t state_path_size = PATH_MAX_LENGTH * sizeof(char); bool ret = false; global_t *global = global_get_ptr(); bool push_msg = true; - path[0] = msg[0] = '\0'; + state_path[0] = msg[0] = '\0'; if (global) { @@ -1560,13 +1598,13 @@ static bool command_event_main_state(unsigned cmd) int state_slot = settings->ints.state_slot; if (state_slot > 0) - snprintf(path, sizeof(path), "%s%d", + snprintf(state_path, state_path_size, "%s%d", global->name.savestate, state_slot); else if (state_slot < 0) - fill_pathname_join_delim(path, - global->name.savestate, "auto", '.', sizeof(path)); + fill_pathname_join_delim(state_path, + global->name.savestate, "auto", '.', state_path_size); else - strlcpy(path, global->name.savestate, sizeof(path)); + strlcpy(state_path, global->name.savestate, state_path_size); } core_serialize_size(&info); @@ -1576,12 +1614,12 @@ static bool command_event_main_state(unsigned cmd) switch (cmd) { case CMD_EVENT_SAVE_STATE: - content_save_state(path, true, false); + content_save_state(state_path, true, false); ret = true; push_msg = false; break; case CMD_EVENT_LOAD_STATE: - if (content_load_state(path, false, false)) + if (content_load_state(state_path, false, false)) { ret = true; #ifdef HAVE_NETWORKING @@ -1608,6 +1646,7 @@ static bool command_event_main_state(unsigned cmd) runloop_msg_queue_push(msg, 2, 180, true); RARCH_LOG("%s\n", msg); + free(state_path); return ret; }