diff --git a/command.c b/command.c index 1511e27c98..85bbfaeadc 100644 --- a/command.c +++ b/command.c @@ -341,7 +341,8 @@ command_t* command_stdin_new(void) bool command_get_config_param(command_t *cmd, const char* arg) { - char reply[8192] = {0}; + size_t _len; + char reply[8192]; const char *value = "unsupported"; settings_t *settings = config_get_ptr(); bool video_fullscreen = settings->bools.video_fullscreen; @@ -374,7 +375,11 @@ bool command_get_config_param(command_t *cmd, const char* arg) value = path_username; /* TODO: query any string */ - snprintf(reply, sizeof(reply), "GET_CONFIG_PARAM %s %s\n", arg, value); + strlcpy(reply, "GET_CONFIG_PARAM ", sizeof(reply)); + _len = strlcat(reply, arg, sizeof(reply)); + reply[_len ] = ' '; + reply[_len+1] = '\0'; + strlcat(reply, value, sizeof(reply)); cmd->replier(cmd, reply, strlen(reply)); return true; } @@ -700,9 +705,10 @@ bool command_write_ram(command_t *cmd, const char *arg) bool command_version(command_t *cmd, const char* arg) { - char reply[256] = {0}; - - snprintf(reply, sizeof(reply), "%s\n", PACKAGE_VERSION); + char reply[256]; + size_t _len = strlcpy(reply, PACKAGE_VERSION, sizeof(reply)); + reply[_len ] = '\n'; + reply[_len+1] = '\0'; cmd->replier(cmd, reply, strlen(reply)); return true; @@ -913,17 +919,23 @@ void command_event_set_volume( bool widgets_active, bool audio_driver_mute_enable) { + size_t _len; char msg[128]; - float new_volume = settings->floats.audio_volume + gain; - - new_volume = MAX(new_volume, -80.0f); - new_volume = MIN(new_volume, 12.0f); - + float new_volume = settings->floats.audio_volume + gain; + new_volume = MAX(new_volume, -80.0f); + new_volume = MIN(new_volume, 12.0f); configuration_set_float(settings, settings->floats.audio_volume, new_volume); - - snprintf(msg, sizeof(msg), "%s: %.1f dB", - msg_hash_to_str(MSG_AUDIO_VOLUME), + _len = strlcpy(msg, msg_hash_to_str(MSG_AUDIO_VOLUME), + sizeof(msg)); + msg[_len ] = ':'; + msg[++_len] = ' '; + msg[++_len] = '\0'; + _len += snprintf(msg + _len, sizeof(msg) - _len, "%.1f", new_volume); + msg[_len ] = ' '; + msg[++_len] = 'd'; + msg[++_len] = 'B'; + msg[++_len] = '\0'; #if defined(HAVE_GFX_WIDGETS) if (widgets_active) @@ -950,17 +962,23 @@ void command_event_set_mixer_volume( settings_t *settings, float gain) { + size_t _len; char msg[128]; - float new_volume = settings->floats.audio_mixer_volume + gain; - - new_volume = MAX(new_volume, -80.0f); - new_volume = MIN(new_volume, 12.0f); - + float new_volume = settings->floats.audio_mixer_volume + gain; + new_volume = MAX(new_volume, -80.0f); + new_volume = MIN(new_volume, 12.0f); configuration_set_float(settings, settings->floats.audio_mixer_volume, new_volume); - - snprintf(msg, sizeof(msg), "%s: %.1f dB", - msg_hash_to_str(MSG_AUDIO_VOLUME), + _len = strlcpy(msg, msg_hash_to_str(MSG_AUDIO_VOLUME), + sizeof(msg)); + msg[_len ] = ':'; + msg[++_len] = ' '; + msg[++_len] = '\0'; + _len += snprintf(msg + _len, sizeof(msg) - _len, "%.1f", new_volume); + msg[_len ] = ' '; + msg[++_len] = 'd'; + msg[++_len] = 'B'; + msg[++_len] = '\0'; runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); RARCH_LOG("[Audio]: %s\n", msg); @@ -1492,10 +1510,9 @@ bool command_event_save_core_config( /* In case of collision, find an alternative name. */ for (i = 0; i < 16; i++) { + size_t _len = strlcpy(tmp, config_path, sizeof(tmp)); if (i) - snprintf(tmp, sizeof(tmp), "%s-%u", config_path, i); - else - strlcpy(tmp, config_path, sizeof(tmp)); + snprintf(tmp + _len, sizeof(tmp) - _len, "-%u", i); strlcat(tmp, ".cfg", sizeof(tmp)); if (!path_is_valid(tmp)) diff --git a/configuration.c b/configuration.c index d33cfc39ed..ed40031ac5 100644 --- a/configuration.c +++ b/configuration.c @@ -4204,7 +4204,6 @@ static void save_keybind_hat(config_file_t *conf, const char *key, { char config[16]; unsigned hat = (unsigned)GET_HAT(bind->joykey); - const char *dir = NULL; config[0] = 'h'; config[1] = '\0'; @@ -4702,7 +4701,7 @@ bool config_save_file(const char *path) char cfg[64]; char formatted_number[4]; - cfg[0] = formatted_number[0] = '\0'; + formatted_number[0] = '\0'; snprintf(formatted_number, sizeof(formatted_number), "%u", i + 1); @@ -5135,13 +5134,7 @@ bool input_remapping_load_file(void *data, const char *path) char prefix[16]; char s1[32], s2[32], s3[32]; char formatted_number[4]; - - prefix[0] = '\0'; - s1[0] = '\0'; - s2[0] = '\0'; - s3[0] = '\0'; formatted_number[0] = '\0'; - snprintf(formatted_number, sizeof(formatted_number), "%u", i + 1); strlcpy(prefix, "input_player", sizeof(prefix)); strlcat(prefix, formatted_number, sizeof(prefix)); @@ -5225,8 +5218,7 @@ bool input_remapping_load_file(void *data, const char *path) } } - strlcpy(s1, "input_player", sizeof(s1)); - strlcat(s1, formatted_number, sizeof(s1)); + strlcpy(s1, prefix, sizeof(s1)); strlcat(s1, "_analog_dpad_mode", sizeof(s1)); CONFIG_GET_INT_BASE(conf, settings, uints.input_analog_dpad_mode[i], s1); @@ -5299,10 +5291,6 @@ bool input_remapping_save_file(const char *path) char s3[32]; formatted_number[0] = '\0'; - prefix[0] = '\0'; - s1[0] = '\0'; - s2[0] = '\0'; - s3[0] = '\0'; /* We must include all mapped ports + all those * with an index less than max_users */ @@ -5417,8 +5405,7 @@ bool input_remapping_save_file(const char *path) strlcat(s1, formatted_number, sizeof(s1)); config_set_int(conf, s1, input_config_get_device(i)); - strlcpy(s1, "input_player", sizeof(s1)); - strlcat(s1, formatted_number, sizeof(s1)); + strlcpy(s1, prefix, sizeof(s1)); strlcat(s1, "_analog_dpad_mode", sizeof(s1)); config_set_int(conf, s1, settings->uints.input_analog_dpad_mode[i]); diff --git a/disk_control_interface.c b/disk_control_interface.c index 8201cef101..74f55b6e6c 100644 --- a/disk_control_interface.c +++ b/disk_control_interface.c @@ -308,24 +308,25 @@ static void disk_control_get_index_set_msg( /* Check whether image was inserted or removed */ if (index < num_images) { + size_t _len = strlcpy(msg, + success + ? msg_hash_to_str(MSG_SETTING_DISK_IN_TRAY) + : msg_hash_to_str(MSG_FAILED_TO_SET_DISK), len); if (has_label) snprintf( - msg, len, "%s: %u/%u - %s", - success ? msg_hash_to_str(MSG_SETTING_DISK_IN_TRAY) : - msg_hash_to_str(MSG_FAILED_TO_SET_DISK), + msg + _len, len - _len, ": %u/%u - %s", index + 1, num_images, image_label); else snprintf( - msg, len, "%s: %u/%u", - success ? msg_hash_to_str(MSG_SETTING_DISK_IN_TRAY) : - msg_hash_to_str(MSG_FAILED_TO_SET_DISK), + msg + _len, len - _len, ": %u/%u", index + 1, num_images); } else strlcpy( msg, - success ? msg_hash_to_str(MSG_REMOVED_DISK_FROM_TRAY) : - msg_hash_to_str(MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY), + success + ? msg_hash_to_str(MSG_REMOVED_DISK_FROM_TRAY) + : msg_hash_to_str(MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY), len); } @@ -348,17 +349,21 @@ bool disk_control_set_eject_state( /* Set eject state */ if (disk_control->cb.set_eject_state(eject)) - snprintf( - msg, sizeof(msg), "%s", - eject ? msg_hash_to_str(MSG_DISK_EJECTED) : - msg_hash_to_str(MSG_DISK_CLOSED)); + strlcpy( + msg, + eject + ? msg_hash_to_str(MSG_DISK_EJECTED) + : msg_hash_to_str(MSG_DISK_CLOSED), + sizeof(msg)); else { error = true; - snprintf( - msg, sizeof(msg), "%s", - eject ? msg_hash_to_str(MSG_VIRTUAL_DISK_TRAY_EJECT) : - msg_hash_to_str(MSG_VIRTUAL_DISK_TRAY_CLOSE)); + strlcpy( + msg, + eject + ? msg_hash_to_str(MSG_VIRTUAL_DISK_TRAY_EJECT) + : msg_hash_to_str(MSG_VIRTUAL_DISK_TRAY_CLOSE), + sizeof(msg)); } if (!string_is_empty(msg)) @@ -458,15 +463,10 @@ bool disk_control_set_index( if (disk_control->cb.get_image_index && disk_control->cb.get_image_path) { - bool image_path_valid = false; - unsigned new_image_index = 0; - char new_image_path[PATH_MAX_LENGTH]; - - new_image_path[0] = '\0'; - + char new_image_path[PATH_MAX_LENGTH] = {0}; /* Get current image index + path */ - new_image_index = disk_control->cb.get_image_index(); - image_path_valid = disk_control->cb.get_image_path( + unsigned new_image_index = disk_control->cb.get_image_index(); + bool image_path_valid = disk_control->cb.get_image_path( new_image_index, new_image_path, sizeof(new_image_path)); if (image_path_valid) @@ -570,6 +570,7 @@ bool disk_control_append_image( disk_control_interface_t *disk_control, const char *image_path) { + size_t _len; bool initial_disk_ejected = false; unsigned initial_index = 0; unsigned new_index = 0; @@ -577,8 +578,6 @@ bool disk_control_append_image( struct retro_game_info info = {0}; char msg[128]; - msg[0] = '\0'; - /* Sanity check. If any of these fail then a * frontend error has occurred - we will not * deal with that here */ @@ -634,17 +633,17 @@ bool disk_control_append_image( goto error; /* Display log */ - snprintf( - msg, sizeof(msg), "%s: %s", - msg_hash_to_str(MSG_APPENDED_DISK), image_filename); + _len = strlcpy(msg, msg_hash_to_str(MSG_APPENDED_DISK), sizeof(msg)); + msg[_len ] = ':'; + msg[_len+1] = ' '; + msg[_len+2] = '\0'; + strlcat(msg, image_filename, sizeof(msg)); RARCH_LOG("[Disc]: %s\n", msg); /* This message should always be displayed, since * the menu itself does not provide sufficient * visual feedback */ - runloop_msg_queue_push( - msg, 0, 120, - true, NULL, + runloop_msg_queue_push(msg, 0, 120, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); return true; @@ -663,9 +662,12 @@ error: if (!initial_disk_ejected) disk_control_set_eject_state(disk_control, false, false); - snprintf( - msg, sizeof(msg), "%s: %s", - msg_hash_to_str(MSG_FAILED_TO_APPEND_DISK), image_filename); + _len = strlcpy(msg, + msg_hash_to_str(MSG_FAILED_TO_APPEND_DISK), sizeof(msg)); + msg[_len ] = ':'; + msg[_len+1] = ' '; + msg[_len+2] = '\0'; + strlcat(msg, image_filename, sizeof(msg)); runloop_msg_queue_push( msg, 0, 180, diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 7936b7f88e..f8285ea67e 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -669,9 +669,17 @@ void video_monitor_set_refresh_rate(float hz) { char msg[128]; settings_t *settings = config_get_ptr(); - - snprintf(msg, sizeof(msg), - "Setting refresh rate to: %.3f Hz.", hz); + /* TODO/FIXME - localize */ + size_t _len = strlcpy(msg, "Setting refresh rate to", sizeof(msg)); + msg[_len ] = ':'; + msg[++_len] = ' '; + msg[++_len] = '\0'; + _len += snprintf(msg + _len, sizeof(msg) - _len, "%.3f", hz); + msg[_len ] = ' '; + msg[_len+1] = 'H'; + msg[_len+2] = 'z'; + msg[_len+3] = '.'; + msg[_len+4] = '\0'; if (settings->bools.notification_show_refresh_rate) runloop_msg_queue_push(msg, 1, 180, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); diff --git a/input/input_driver.c b/input/input_driver.c index 5e9fbeab4d..2473362e98 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -4663,6 +4663,7 @@ error: static bool runloop_check_movie_init(input_driver_state_t *input_st, settings_t *settings) { + size_t _len; char msg[16384], path[8192]; bsv_movie_t *state = NULL; int state_slot = settings->ints.state_slot; @@ -4670,15 +4671,10 @@ static bool runloop_check_movie_init(input_driver_state_t *input_st, configuration_set_uint(settings, settings->uints.rewind_granularity, 1); - strlcpy(path, + _len = strlcpy(path, input_st->bsv_movie_state.movie_path, sizeof(path)); if (state_slot > 0) - { - char formatted_number[16]; - formatted_number[0] = '\0'; - snprintf(formatted_number, sizeof(formatted_number), "%d", state_slot); - strlcat(path, formatted_number, sizeof(path)); - } + snprintf(path + _len, sizeof(path) - _len, "%d", state_slot); strlcat(path, ".bsv", sizeof(path)); snprintf(msg, sizeof(msg), "%s \"%s\".", diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index f9fb678580..a3afe1d150 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -3443,8 +3443,6 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i) char path[8204]; runloop_state_t *runloop_st = runloop_state_get_ptr(); - path[0] = '\0'; - /* State slot dropdown */ if (string_to_unsigned(entry.label) == MENU_ENUM_LABEL_STATE_SLOT) { @@ -3452,14 +3450,20 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i) ozone->is_state_slot = true; } - if (state_slot > 0) - snprintf(path, sizeof(path), "%s%d", - runloop_st->name.savestate, state_slot); - else if (state_slot < 0) + if (state_slot < 0) + { + path[0] = '\0'; fill_pathname_join_delim(path, runloop_st->name.savestate, "auto", '.', sizeof(path)); + } else - strlcpy(path, runloop_st->name.savestate, sizeof(path)); + { + size_t _len = strlcpy(path, + runloop_st->name.savestate, sizeof(path)); + if (state_slot > 0) + snprintf(path + _len, sizeof(path) - _len, "%d", + state_slot); + } strlcat(path, FILE_PATH_PNG_EXTENSION, sizeof(path)); @@ -3864,14 +3868,14 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone) /* Fill entry enumeration */ if (show_entry_idx) { + unsigned long _entry = (unsigned long)(playlist_index + 1); if (ozone->is_explore_list) - snprintf(ozone->selection_entry_enumeration, sizeof(ozone->selection_entry_enumeration), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_INFO_ENTRY_IDX), - (unsigned long)(selection), (unsigned long)list_size); - else - snprintf(ozone->selection_entry_enumeration, sizeof(ozone->selection_entry_enumeration), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_INFO_ENTRY_IDX), - (unsigned long)(playlist_index + 1), (unsigned long)list_size); + _entry = (unsigned long)(selection); + + snprintf(ozone->selection_entry_enumeration, + sizeof(ozone->selection_entry_enumeration), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_INFO_ENTRY_IDX), + _entry, (unsigned long)list_size); if (!scroll_content_metadata) linebreak_after_colon(&ozone->selection_entry_enumeration); diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index fdcf9cbb8c..6684b4681b 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -5019,17 +5019,22 @@ static void rgui_render(void *data, /* State slot title */ if (is_state_slot) { + size_t _len = strlcpy(thumbnail_title_buf, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT), + sizeof(thumbnail_title_buf)); if (rgui->is_quick_menu) { - snprintf(thumbnail_title_buf, sizeof(thumbnail_title_buf), "%s %d", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT), + snprintf(thumbnail_title_buf + _len, + sizeof(thumbnail_title_buf) - _len, + " %d", config_get_ptr()->ints.state_slot); thumbnail_title = thumbnail_title_buf; } else if (rgui->is_state_slot) { - snprintf(thumbnail_title_buf, sizeof(thumbnail_title_buf), "%s %d", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT), + snprintf(thumbnail_title_buf + _len, + sizeof(thumbnail_title_buf) - _len, + " %d", (int)menu_navigation_get_selection() - 1); thumbnail_title = thumbnail_title_buf; } @@ -6572,8 +6577,6 @@ static void rgui_update_savestate_thumbnail_path(void *data, unsigned i) char path[8204]; runloop_state_t *runloop_st = runloop_state_get_ptr(); - path[0] = '\0'; - /* State slot dropdown */ if (string_to_unsigned(entry.label) == MENU_ENUM_LABEL_STATE_SLOT) { @@ -6581,14 +6584,20 @@ static void rgui_update_savestate_thumbnail_path(void *data, unsigned i) rgui->is_state_slot = true; } - if (state_slot > 0) - snprintf(path, sizeof(path), "%s%d", - runloop_st->name.savestate, state_slot); - else if (state_slot < 0) + if (state_slot < 0) + { + path[0] = '\0'; fill_pathname_join_delim(path, runloop_st->name.savestate, "auto", '.', sizeof(path)); + } else - strlcpy(path, runloop_st->name.savestate, sizeof(path)); + { + size_t _len = strlcpy(path, + runloop_st->name.savestate, sizeof(path)); + if (state_slot > 0) + snprintf(path + _len, sizeof(path) - _len, "%d", + state_slot); + } strlcat(path, FILE_PATH_PNG_EXTENSION, sizeof(path)); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index f955a90120..57d7f50c9b 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1197,8 +1197,6 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) char path[8204]; runloop_state_t *runloop_st = runloop_state_get_ptr(); - path[0] = '\0'; - /* State slot dropdown */ if (string_to_unsigned(entry.label) == MENU_ENUM_LABEL_STATE_SLOT) { @@ -1206,14 +1204,20 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) xmb->is_state_slot = true; } - if (state_slot > 0) - snprintf(path, sizeof(path), "%s%d", - runloop_st->name.savestate, state_slot); - else if (state_slot < 0) + if (state_slot < 0) + { + path[0] = '\0'; fill_pathname_join_delim(path, runloop_st->name.savestate, "auto", '.', sizeof(path)); + } else - strlcpy(path, runloop_st->name.savestate, sizeof(path)); + { + size_t _len = strlcpy(path, + runloop_st->name.savestate, sizeof(path)); + if (state_slot > 0) + snprintf(path + _len, sizeof(path) - _len, "%d", + state_slot); + } strlcat(path, FILE_PATH_PNG_EXTENSION, sizeof(path)); diff --git a/menu/menu_contentless_cores.c b/menu/menu_contentless_cores.c index 22481e56c9..878e155251 100644 --- a/menu/menu_contentless_cores.c +++ b/menu/menu_contentless_cores.c @@ -121,11 +121,15 @@ static void contentless_cores_init_info_entries( if (core_info && core_info->supports_no_game) { + char licenses_str[MENU_SUBLABEL_MAX_LENGTH]; contentless_core_info_entry_t *entry = (contentless_core_info_entry_t*)malloc(sizeof(*entry)); - char licenses_str[MENU_SUBLABEL_MAX_LENGTH]; - - licenses_str[0] = '\0'; + size_t _len = strlcpy(licenses_str, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES), + sizeof(licenses_str)); + licenses_str[_len ] = ':'; + licenses_str[_len+1] = ' '; + licenses_str[_len+2] = '\0'; /* Populate licences string */ if (core_info->licenses_list) @@ -134,17 +138,15 @@ static void contentless_cores_init_info_entries( tmp_str[0] = '\0'; string_list_join_concat(tmp_str, sizeof(tmp_str), core_info->licenses_list, ", "); - snprintf(licenses_str, sizeof(licenses_str), "%s: %s", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES), - tmp_str); + strlcat(licenses_str, tmp_str, sizeof(licenses_str)); } /* No license found - set to N/A */ else - snprintf(licenses_str, sizeof(licenses_str), "%s: %s", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); + strlcat(licenses_str, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), + sizeof(licenses_str)); - entry->licenses_str = strdup(licenses_str); + entry->licenses_str = strdup(licenses_str); /* Initialise runtime info */ entry->runtime.runtime_str = NULL; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 623e11eda7..23297c13dd 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1760,10 +1760,12 @@ static unsigned menu_displaylist_parse_system_info(file_list_t *list) { char cpu_str[64]; unsigned amount_cores = cpu_features_get_core_amount(); - cpu_str[0] = '\0'; - snprintf(cpu_str, sizeof(cpu_str), - "%s %d\n", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CPU_CORES), amount_cores); + size_t _len = strlcpy(cpu_str, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CPU_CORES), + sizeof(cpu_str)); + snprintf(cpu_str + _len, + sizeof(cpu_str) - _len, + " %d\n", amount_cores); if (menu_entries_append(list, cpu_str, msg_hash_to_str(MENU_ENUM_LABEL_CPU_CORES), MENU_ENUM_LABEL_CPU_CORES, MENU_SETTINGS_CORE_INFO_NONE, 0, 0, NULL)) @@ -2029,10 +2031,13 @@ static unsigned menu_displaylist_parse_system_info(file_list_t *list) if (video_context_driver_get_metrics(&metrics)) { - snprintf(tmp, sizeof(tmp), "%s: %.2f", + size_t _len = strlcpy(tmp, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH), - val); + sizeof(tmp)); + snprintf(tmp + _len, + sizeof(tmp) - _len, + ": %.2f", val); if (menu_entries_append(list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0, NULL)) @@ -5167,15 +5172,13 @@ static int menu_displaylist_parse_input_device_index_list( if (!string_is_empty(device_name)) { unsigned idx = input_config_get_device_name_index(i); + size_t _len = strlcpy(device_label, device_name, + sizeof(device_label)); /*if idx is non-zero, it's part of a set*/ if (idx > 0) - snprintf(device_label, sizeof(device_label), - "%s (#%u)", - device_name, - idx); - else - strlcpy(device_label, device_name, sizeof(device_label)); + snprintf(device_label + _len, + sizeof(device_label) - _len, " (#%u)", idx); } else snprintf(device_label, sizeof(device_label), "%s (%s %u)", val_na, @@ -5297,8 +5300,8 @@ static int menu_displaylist_parse_input_description_list( * > Above RARCH_FIRST_CUSTOM_BIND, inputs * are analog axes - have to add +/- * indicators */ - size_t _len = strlcpy(input_description, input_desc_btn, - sizeof(input_description)); + size_t _len = strlcpy(input_description, input_desc_btn, + sizeof(input_description)); if (i >= RARCH_FIRST_CUSTOM_BIND) { input_description [_len ] = ' '; @@ -5306,7 +5309,7 @@ static int menu_displaylist_parse_input_description_list( input_description[_len+1] = '+'; else input_description[_len+1] = '-'; - input_description [_len+2] = '\0'; + input_description [_len+2] = '\0'; } if (string_is_empty(input_description)) @@ -7094,18 +7097,18 @@ unsigned menu_displaylist_build_list( #ifdef HAVE_LIBNX { unsigned user; + char key_split_joycon[PATH_MAX_LENGTH]; + const char *split_joycon_str = + msg_hash_to_str(MENU_ENUM_LABEL_INPUT_SPLIT_JOYCON); + size_t _len = strlcpy(key_split_joycon, split_joycon_str, + sizeof(key_split_joycon)); for (user = 0; user < 8; user++) { - char key_split_joycon[PATH_MAX_LENGTH]; unsigned val = user + 1; - - key_split_joycon[0] = '\0'; - - snprintf(key_split_joycon, sizeof(key_split_joycon), - "%s_%u", - msg_hash_to_str(MENU_ENUM_LABEL_INPUT_SPLIT_JOYCON), val); - + snprintf(key_split_joycon + _len, + sizeof(key_split_joycon) - _len, + "_%u", val); if (MENU_DISPLAYLIST_PARSE_SETTINGS(list, key_split_joycon, PARSE_ONLY_UINT, true, 0) != -1) count++; @@ -7235,12 +7238,12 @@ unsigned menu_displaylist_build_list( size_t i; char buf[768]; const char *msg_intf = msg_hash_to_str(MSG_INTERFACE); + size_t _len = strlcpy(buf, msg_intf, sizeof(buf)); for (i = 0; i < interfaces.size; i++) { struct net_ifinfo_entry *entry = &interfaces.entries[i]; - - snprintf(buf, sizeof(buf), "%s (%s) : %s\n", msg_intf, + snprintf(buf + _len, sizeof(buf) - _len, " (%s) : %s\n", entry->name, entry->host); if (menu_entries_append(list, buf, entry->name, MENU_ENUM_LABEL_NETWORK_INFO_ENTRY, diff --git a/menu/menu_driver.c b/menu/menu_driver.c index b418635db0..a593eb9e5e 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -7999,20 +7999,31 @@ int generic_menu_entry_action( if (!string_is_empty(title_name)) { + size_t _len = strlcpy(speak_string, + title_name, sizeof(speak_string)); + speak_string[_len ] = ' '; + speak_string[_len+1] = '\0'; + _len = strlcat(speak_string, + current_label, sizeof(speak_string)); if (!string_is_equal(current_value, "...")) - snprintf(speak_string, sizeof(speak_string), - "%s %s %s", title_name, current_label, current_value); - else - snprintf(speak_string, sizeof(speak_string), - "%s %s", title_name, current_label); + { + speak_string[_len ] = ' '; + speak_string[_len+1] = '\0'; + strlcat(speak_string, current_value, + sizeof(speak_string)); + } } else { + size_t _len = strlcpy(speak_string, + current_label, sizeof(speak_string)); if (!string_is_equal(current_value, "...")) - snprintf(speak_string, sizeof(speak_string), - "%s %s", current_label, current_value); - else - strlcpy(speak_string, current_label, sizeof(speak_string)); + { + speak_string[_len ] = ' '; + speak_string[_len+1] = '\0'; + strlcat(speak_string, current_value, + sizeof(speak_string)); + } } if (!string_is_empty(speak_string)) diff --git a/menu/menu_explore.c b/menu/menu_explore.c index f1e574c9bc..e7e8f2adc1 100644 --- a/menu/menu_explore.c +++ b/menu/menu_explore.c @@ -1017,10 +1017,8 @@ unsigned menu_displaylist_explore(file_list_t *list, if (is_top && tmplen < sizeof(tmp) - 5) { if (explore_by_info[cat].is_numeric) - { snprintf(tmp + tmplen, sizeof(tmp) - tmplen, " (%s - %s)", entries[0]->str, entries[RBUF_LEN(entries) - 1]->str); - } else { strlcat(tmp, " (", sizeof(tmp)); diff --git a/retroarch.c b/retroarch.c index d88994918a..7cbddc188a 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1693,14 +1693,15 @@ bool command_event(enum event_command cmd, void *data) if (video_driver_get_video_output_size(&width, &height, desc, sizeof(desc))) { - char msg[128] = {0}; + char msg[128]; video_driver_set_video_mode(width, height, true); if (width == 0 || height == 0) - snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_SCREEN_RESOLUTION_DEFAULT)); + strlcpy(msg, msg_hash_to_str(MSG_SCREEN_RESOLUTION_DEFAULT), sizeof(msg)); else { + msg[0] = '\0'; if (!string_is_empty(desc)) snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_SCREEN_RESOLUTION_DESC), diff --git a/runloop.c b/runloop.c index 8b62fa2c7d..3069d9422d 100644 --- a/runloop.c +++ b/runloop.c @@ -7336,15 +7336,17 @@ static enum runloop_state_enum runloop_check_state( * for this frame. */ if (check2) { + size_t _len; char msg[128]; int cur_state_slot = state_slot; if (check1) configuration_set_int(settings, settings->ints.state_slot, cur_state_slot + addition); - msg[0] = '\0'; - snprintf(msg, sizeof(msg), "%s: %d", - msg_hash_to_str(MSG_STATE_SLOT), - settings->ints.state_slot); + _len = strlcpy(msg, msg_hash_to_str(MSG_STATE_SLOT), sizeof(msg)); + snprintf(msg + _len, + sizeof(msg) - _len, + ": %d", + settings->ints.state_slot); runloop_msg_queue_push(msg, 2, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); RARCH_LOG("[State]: %s\n", msg); @@ -8130,6 +8132,7 @@ bool retroarch_get_current_savestate_path(char *path, size_t len) bool retroarch_get_entry_state_path(char *path, size_t len, unsigned slot) { + size_t _len; runloop_state_t *runloop_st = &runloop_state; const char *name_savestate = NULL; @@ -8140,8 +8143,8 @@ bool retroarch_get_entry_state_path(char *path, size_t len, unsigned slot) if (string_is_empty(name_savestate)) return false; - snprintf(path, len, "%s%d", name_savestate, slot); - strlcat(path, ".entry", len); + _len = strlcpy(path, name_savestate, len); + snprintf(path + _len, len - _len, "%d.entry", slot); return true; } diff --git a/tasks/task_core_updater.c b/tasks/task_core_updater.c index cf800db181..479c2d83ed 100644 --- a/tasks/task_core_updater.c +++ b/tasks/task_core_updater.c @@ -1370,8 +1370,9 @@ static void task_update_installed_cores_handler(retro_task_t *task) if (update_installed_handle->list_size > 0) { char task_title[PATH_MAX_LENGTH]; - - task_title[0] = '\0'; + size_t _len = strlcpy(task_title, + msg_hash_to_str(MSG_ALL_CORES_UPDATED), + sizeof(task_title)); /* > Generate final status message based on number * of cores that were updated/locked */ @@ -1379,28 +1380,28 @@ static void task_update_installed_cores_handler(retro_task_t *task) { if (update_installed_handle->num_locked > 0) snprintf( - task_title, sizeof(task_title), "%s [%s%u, %s%u]", - msg_hash_to_str(MSG_ALL_CORES_UPDATED), + task_title + _len, + sizeof(task_title) - _len, + " [%s%u, %s%u]", msg_hash_to_str(MSG_NUM_CORES_UPDATED), update_installed_handle->num_updated, msg_hash_to_str(MSG_NUM_CORES_LOCKED), update_installed_handle->num_locked); else snprintf( - task_title, sizeof(task_title), "%s [%s%u]", - msg_hash_to_str(MSG_ALL_CORES_UPDATED), + task_title + _len, + sizeof(task_title) - _len, + " [%s%u]", msg_hash_to_str(MSG_NUM_CORES_UPDATED), update_installed_handle->num_updated); } else if (update_installed_handle->num_locked > 0) snprintf( - task_title, sizeof(task_title), "%s [%s%u]", - msg_hash_to_str(MSG_ALL_CORES_UPDATED), + task_title + _len, + sizeof(task_title) - _len, + " [%s%u]", msg_hash_to_str(MSG_NUM_CORES_LOCKED), update_installed_handle->num_locked); - else - strlcpy(task_title, msg_hash_to_str(MSG_ALL_CORES_UPDATED), - sizeof(task_title)); task_set_title(task, strdup(task_title)); } diff --git a/tasks/task_translation.c b/tasks/task_translation.c index 646c58c882..d82d09916a 100644 --- a/tasks/task_translation.c +++ b/tasks/task_translation.c @@ -790,7 +790,6 @@ bool run_translation_service(settings_t *settings, bool paused) int bmp64_length = 0; bool TRANSLATE_USE_BMP = false; - bool use_overlay = false; const char *label = NULL; char* system_label = NULL; @@ -814,12 +813,6 @@ bool run_translation_service(settings_t *settings, bool paused) } #endif -#ifdef HAVE_GFX_WIDGETS - if ( video_st->poke - && video_st->poke->load_texture - && video_st->poke->unload_texture) - use_overlay = true; -#endif /* get the core info here so we can pass long the game name */ core_info_get_current_core(&core_info); @@ -940,10 +933,8 @@ bool run_translation_service(settings_t *settings, bool paused) the BMP header as bytes, and then covert that to a b64 encoded array for transport in JSON. */ - form_bmp_header(header, width, height, false); - bmp_buffer = (uint8_t*)malloc(width * height * 3 + 54); - if (!bmp_buffer) + if (!(bmp_buffer = (uint8_t*)malloc(width * height * 3 + 54))) goto finish; memcpy(bmp_buffer, header, 54 * sizeof(uint8_t)); @@ -1028,13 +1019,15 @@ bool run_translation_service(settings_t *settings, bool paused) RARCH_LOG("Request size: %d\n", bmp64_length); #endif { + size_t _len; char new_ai_service_url[PATH_MAX_LENGTH]; char separator = '?'; unsigned ai_service_source_lang = settings->uints.ai_service_source_lang; unsigned ai_service_target_lang = settings->uints.ai_service_target_lang; const char *ai_service_url = settings->arrays.ai_service_url; - strlcpy(new_ai_service_url, ai_service_url, sizeof(new_ai_service_url)); + _len = strlcpy(new_ai_service_url, + ai_service_url, sizeof(new_ai_service_url)); /* if query already exists in url, then use &'s instead */ if (strrchr(new_ai_service_url, '?')) @@ -1048,13 +1041,15 @@ bool run_translation_service(settings_t *settings, bool paused) if (!string_is_empty(lang_source)) { - char temp_string[PATH_MAX_LENGTH]; - snprintf(temp_string, - sizeof(temp_string), - "%csource_lang=%s", separator, lang_source); - separator = '&'; - strlcat(new_ai_service_url, - temp_string, sizeof(new_ai_service_url)); + new_ai_service_url[_len ] = separator; + new_ai_service_url[_len+1] = '\0'; + strlcat( + new_ai_service_url, "source_lang=", + sizeof(new_ai_service_url)); + _len = strlcat( + new_ai_service_url, lang_source, + sizeof(new_ai_service_url)); + separator = '&'; } } @@ -1066,57 +1061,58 @@ bool run_translation_service(settings_t *settings, bool paused) if (!string_is_empty(lang_target)) { - char temp_string[PATH_MAX_LENGTH]; - snprintf(temp_string, - sizeof(temp_string), - "%ctarget_lang=%s", separator, lang_target); - separator = '&'; - - strlcat(new_ai_service_url, temp_string, + new_ai_service_url[_len ] = separator; + new_ai_service_url[_len+1] = '\0'; + strlcat( + new_ai_service_url, "target_lang=", sizeof(new_ai_service_url)); + _len = strlcat( + new_ai_service_url, lang_target, + sizeof(new_ai_service_url)); + separator = '&'; } } /* mode */ { - char temp_string[PATH_MAX_LENGTH]; - const char *mode_chr = NULL; - unsigned ai_service_mode = settings->uints.ai_service_mode; + unsigned ai_service_mode = settings->uints.ai_service_mode; /*"image" is included for backwards compatability with * vgtranslate < 1.04 */ - temp_string[0] = '\0'; + new_ai_service_url[_len ] = separator; + new_ai_service_url[_len+1] = '\0'; + _len = strlcat( + new_ai_service_url, "output=", + sizeof(new_ai_service_url)); switch (ai_service_mode) { - case 0: - if (use_overlay) - mode_chr = "image,png,png-a"; - else - mode_chr = "image,png"; + case 2: + strlcat(new_ai_service_url, "text", + sizeof(new_ai_service_url)); break; case 1: - mode_chr = "sound,wav"; - break; - case 2: - mode_chr = "text"; - break; case 3: - if (use_overlay) - mode_chr = "image,png,png-a,sound,wav"; - else - mode_chr = "image,png,sound,wav"; + strlcat(new_ai_service_url, "sound,wav", + sizeof(new_ai_service_url)); + if (ai_service_mode == 1) + break; + /* fall-through intentional for ai_service_mode == 3 */ + case 0: + strlcat(new_ai_service_url, "image,png", + sizeof(new_ai_service_url)); +#ifdef HAVE_GFX_WIDGETS + if ( video_st->poke + && video_st->poke->load_texture + && video_st->poke->unload_texture) + strlcat(new_ai_service_url, ",png-a", + sizeof(new_ai_service_url)); +#endif break; default: break; } - snprintf(temp_string, - sizeof(temp_string), - "%coutput=%s", separator, mode_chr); - - strlcat(new_ai_service_url, temp_string, - sizeof(new_ai_service_url)); } #ifdef DEBUG if (access_st->ai_service_auto != 2)