From c4685e8c319149dee1458fea5be347c5d9ea8679 Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Sun, 16 Jun 2024 19:15:07 +0200 Subject: [PATCH] Cut down on strlcats --- frontend/frontend_driver.c | 62 +++++++++++------------------ frontend/frontend_driver.h | 2 +- libretro-common/lists/nested_list.c | 5 ++- libretro-common/lists/string_list.c | 4 +- menu/menu_displaylist.c | 32 ++++++++------- 5 files changed, 46 insertions(+), 59 deletions(-) diff --git a/frontend/frontend_driver.c b/frontend/frontend_driver.c index 047d14218e..2588bb3fa0 100644 --- a/frontend/frontend_driver.c +++ b/frontend/frontend_driver.c @@ -175,7 +175,7 @@ frontend_ctx_driver_t *frontend_ctx_init_first(void) return frontend_ctx_drivers[0]; } -bool frontend_driver_get_core_extension(char *s, size_t len) +size_t frontend_driver_get_core_extension(char *s, size_t len) { #ifdef HAVE_DYNAMIC @@ -184,7 +184,7 @@ bool frontend_driver_get_core_extension(char *s, size_t len) s[1] = 'l'; s[2] = 'l'; s[3] = '\0'; - return true; + return 3; #elif defined(IOS) s[0] = 'f'; s[1] = 'r'; @@ -196,7 +196,7 @@ bool frontend_driver_get_core_extension(char *s, size_t len) s[7] = 'r'; s[8] = 'k'; s[9] = '\0'; - return true; + return 9; #elif defined(__APPLE__) || defined(__MACH__) s[0] = 'd'; s[1] = 'y'; @@ -204,12 +204,12 @@ bool frontend_driver_get_core_extension(char *s, size_t len) s[3] = 'i'; s[4] = 'b'; s[5] = '\0'; - return true; + return 5; #else s[0] = 's'; s[1] = 'o'; s[2] = '\0'; - return true; + return 2; #endif #else @@ -219,76 +219,60 @@ bool frontend_driver_get_core_extension(char *s, size_t len) s[1] = 'b'; s[2] = 'p'; s[3] = '\0'; - return true; + return 3; #elif defined(ORBIS) || defined(VITA) || defined(__PS3__) - strlcpy(s, "self|bin", len); - return true; + return strlcpy(s, "self|bin", len); #elif defined(PS2) s[0] = 'e'; s[1] = 'l'; s[2] = 'f'; s[3] = '\0'; - return true; + return 3; #elif defined(_XBOX1) s[0] = 'x'; s[1] = 'b'; s[2] = 'e'; s[3] = '\0'; - return true; + return 3; #elif defined(_XBOX360) s[0] = 'x'; s[1] = 'e'; s[2] = 'x'; s[3] = '\0'; - return true; + return 3; #elif defined(GEKKO) s[0] = 'd'; s[1] = 'o'; s[2] = 'l'; s[3] = '\0'; - return true; + return 3; #elif defined(HW_WUP) - strlcpy(s, "rpx|elf", len); - return true; + return strlcpy(s, "rpx|elf", len); #elif defined(__linux__) s[0] = 'e'; s[1] = 'l'; s[2] = 'f'; s[3] = '\0'; - return true; + return 3; #elif defined(HAVE_LIBNX) s[0] = 'n'; s[1] = 'r'; s[2] = 'o'; s[3] = '\0'; - return true; + return 3; #elif defined(DJGPP) s[0] = 'e'; s[1] = 'x'; s[2] = 'e'; s[3] = '\0'; - return true; + return 3; #elif defined(_3DS) if (envIsHomebrew()) - { - s[0] = '3'; - s[1] = 'd'; - s[2] = 's'; - s[3] = 'x'; - s[4] = '\0'; - } - else - { - s[0] = 'c'; - s[1] = 'i'; - s[2] = 'a'; - s[3] = '\0'; - } - return true; + return strlcpy(s, "3dsx", len); + return strlcpy(s, "cia", len); #else - return false; + return 0; #endif - #endif } @@ -401,7 +385,7 @@ void frontend_driver_init_first(void *args) frontend_st->current_frontend_ctx = (frontend_ctx_driver_t*) frontend_ctx_init_first(); - if ( frontend_st->current_frontend_ctx + if ( frontend_st->current_frontend_ctx && frontend_st->current_frontend_ctx->init) frontend_st->current_frontend_ctx->init(args); } @@ -586,15 +570,15 @@ void frontend_driver_attach_console(void) { /* TODO/FIXME - the frontend driver code is garbage and needs to be redesigned. Apparently frontend_driver_attach_console can be called - BEFORE frontend_driver_init_first is called, hence why we need - to resort to the check for non-NULL below. This is just awful, - BEFORE we make any frontend function call, we should be 100% + BEFORE frontend_driver_init_first is called, hence why we need + to resort to the check for non-NULL below. This is just awful, + BEFORE we make any frontend function call, we should be 100% sure frontend_driver_init_first has already been called first. For now, we do this hack, but this absolutely should be redesigned as soon as possible. */ - if ( frontend_driver_st.current_frontend_ctx + if ( frontend_driver_st.current_frontend_ctx && frontend_driver_st.current_frontend_ctx->attach_console) frontend_driver_st.current_frontend_ctx->attach_console(); } diff --git a/frontend/frontend_driver.h b/frontend/frontend_driver.h index 3278fedefa..79d63c0a22 100644 --- a/frontend/frontend_driver.h +++ b/frontend/frontend_driver.h @@ -177,7 +177,7 @@ void frontend_driver_exitspawn(char *s, size_t len, char *args); bool frontend_driver_has_fork(void); -bool frontend_driver_get_core_extension(char *s, size_t len); +size_t frontend_driver_get_core_extension(char *s, size_t len); bool frontend_driver_get_salamander_basename(char *s, size_t len); diff --git a/libretro-common/lists/nested_list.c b/libretro-common/lists/nested_list.c index b05b1ae889..4c5be0f5e6 100644 --- a/libretro-common/lists/nested_list.c +++ b/libretro-common/lists/nested_list.c @@ -577,14 +577,15 @@ bool nested_list_item_get_address(nested_list_item_t *list_item, /* Build address string */ for (i = id_list.size; i > 0; i--) { + size_t _len; const char *id = id_list.elems[i - 1].data; if (string_is_empty(id)) goto end; - strlcat(address, id, len); + _len = strlcat(address, id, len); if (i > 1) - strlcat(address, delim, len); + strlcpy(address + _len, delim, len - _len); } success = true; diff --git a/libretro-common/lists/string_list.c b/libretro-common/lists/string_list.c index 65be0bccbb..e092cfcd32 100644 --- a/libretro-common/lists/string_list.c +++ b/libretro-common/lists/string_list.c @@ -270,9 +270,9 @@ void string_list_join_concat(char *buffer, size_t size, for (i = 0; i < list->size; i++) { - strlcat(buffer, list->elems[i].data, size); + size_t _len = strlcat(buffer, list->elems[i].data, size); if ((i + 1) < list->size) - strlcat(buffer, delim, size); + strlcpy(buffer + _len, delim, size - _len); } } diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index b69f96fd2c..a37ea784c6 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -499,9 +499,9 @@ static int filebrowser_parse( allow_parent_directory = false; else { - fill_pathname_home_dir(dir, sizeof(dir)); + size_t _len = fill_pathname_home_dir(dir, sizeof(dir)); if (string_ends_with(full_path, "/") && !string_ends_with(dir, "/")) - strlcat(dir, "/", sizeof(dir)); + strlcpy(dir + _len, "/", sizeof(dir) - _len); if (string_is_equal(dir, full_path)) allow_parent_directory = false; } @@ -12115,8 +12115,8 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, const struct retro_keybind *auto_bind = (const struct retro_keybind*) input_config_get_bind_auto(port, retro_id); - - input_config_get_bind_string(settings, descriptor, + size_t desc_len = input_config_get_bind_string( + settings, descriptor, keybind, auto_bind, sizeof(descriptor)); if (!strstr(descriptor, "Auto")) @@ -12131,7 +12131,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, desc_label[++_len] = ' '; desc_label[++_len] = '\0'; strlcpy(desc_label + _len, descriptor, sizeof(desc_label) - _len); - strlcpy(descriptor, desc_label, sizeof(descriptor)); + desc_len = strlcpy(descriptor, desc_label, sizeof(descriptor)); } /* Add user index when display driver == rgui and sublabels @@ -12140,8 +12140,8 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, && (max_users > 1) && !settings->bools.menu_show_sublabels) { - size_t _len = strlcat(descriptor, " [", sizeof(descriptor)); - snprintf(descriptor + _len, sizeof(descriptor) - _len, "%s %u]", + desc_len += strlcpy(descriptor + desc_len, " [", sizeof(descriptor) - desc_len); + snprintf(descriptor + desc_len, sizeof(descriptor) - desc_len, "%s %u]", msg_val_port, port + 1); } @@ -12168,8 +12168,8 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, const struct retro_keybind *auto_bind = (const struct retro_keybind*) input_config_get_bind_auto(port, retro_id); - - input_config_get_bind_string(settings, descriptor, + size_t desc_len = input_config_get_bind_string( + settings, descriptor, keybind, auto_bind, sizeof(descriptor)); if (!strstr(descriptor, "Auto")) @@ -12184,7 +12184,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, desc_label[++_len] = ' '; desc_label[++_len] = '\0'; strlcpy(desc_label + _len, descriptor, sizeof(desc_label) - _len); - strlcpy(descriptor, desc_label, sizeof(descriptor)); + desc_len = strlcpy(descriptor, desc_label, sizeof(descriptor)); } /* Add user index when display driver == rgui and sublabels @@ -12193,8 +12193,8 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, && (max_users > 1) && !settings->bools.menu_show_sublabels) { - size_t _len = strlcat(descriptor, " [", sizeof(descriptor)); - snprintf(descriptor + _len, sizeof(descriptor) - _len, "%s %u]", + desc_len += strlcpy(descriptor + desc_len, " [", sizeof(descriptor) - desc_len); + snprintf(descriptor + desc_len, sizeof(descriptor) - desc_len, "%s %u]", val_port, port + 1); } @@ -15225,14 +15225,16 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, break; case DISPLAYLIST_FILE_BROWSER_SELECT_SIDELOAD_CORE: { + size_t _len; char ext_names[32]; info->type_default = FILE_TYPE_SIDELOAD_CORE; - if (frontend_driver_get_core_extension(ext_names, sizeof(ext_names))) + _len = frontend_driver_get_core_extension(ext_names, sizeof(ext_names)); + if (_len > 0) { - strlcat(ext_names, "|", sizeof(ext_names)); - strlcat(ext_names, FILE_PATH_CORE_BACKUP_EXTENSION_NO_DOT, sizeof(ext_names)); + _len += strlcpy(ext_names + _len, "|", sizeof(ext_names) - _len); + _len += strlcpy(ext_names + _len, FILE_PATH_CORE_BACKUP_EXTENSION_NO_DOT, sizeof(ext_names) - _len); } else strlcpy(ext_names, FILE_PATH_CORE_BACKUP_EXTENSION_NO_DOT, sizeof(ext_names));