From 7a07cc1305790762e6b3ceafbfc180e20d9785f5 Mon Sep 17 00:00:00 2001 From: jdgleaver Date: Wed, 26 Aug 2020 15:17:37 +0100 Subject: [PATCH] Fix 'Set Core Association' regression --- core_info.c | 2 +- libretro-common/include/lists/dir_list.h | 3 +++ libretro-common/lists/dir_list.c | 7 +++++-- libretro-common/lists/string_list.c | 9 ++++++++- menu/cbs/menu_cbs_ok.c | 5 ++++- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/core_info.c b/core_info.c index f05a84d2bd..02f8a43c56 100644 --- a/core_info.c +++ b/core_info.c @@ -911,7 +911,7 @@ void core_info_get_name(const char *path, char *s, size_t len, bool get_display_name) { size_t i; - struct string_list contents; + struct string_list contents = {0}; const char *path_basedir = !string_is_empty(path_info) ? path_info : dir_cores; const char *core_path_basename = path_basename(path); diff --git a/libretro-common/include/lists/dir_list.h b/libretro-common/include/lists/dir_list.h index e85a9559fd..4c48978113 100644 --- a/libretro-common/include/lists/dir_list.h +++ b/libretro-common/include/lists/dir_list.h @@ -64,6 +64,9 @@ bool dir_list_append(struct string_list *list, const char *dir, const char *ext, struct string_list *dir_list_new(const char *dir, const char *ext, bool include_dirs, bool include_hidden, bool include_compressed, bool recursive); +/* Warning: 'list' must zero initialised before + * calling this function, otherwise memory leaks/ + * undefined behaviour will occur */ bool dir_list_initialize(struct string_list *list, const char *dir, const char *ext, bool include_dirs, diff --git a/libretro-common/lists/dir_list.c b/libretro-common/lists/dir_list.c index e362e8ea6a..22cbb02cd1 100644 --- a/libretro-common/lists/dir_list.c +++ b/libretro-common/lists/dir_list.c @@ -264,14 +264,17 @@ struct string_list *dir_list_new(const char *dir, return list; } +/* Warning: 'list' must zero initialised before + * calling this function, otherwise memory leaks/ + * undefined behaviour will occur */ bool dir_list_initialize(struct string_list *list, const char *dir, const char *ext, bool include_dirs, bool include_hidden, bool include_compressed, bool recursive) { - if (!list) - return NULL; + if (!list || !string_list_initialize(list)) + return false; return dir_list_append(list, dir, ext, include_dirs, include_hidden, include_compressed, recursive); } diff --git a/libretro-common/lists/string_list.c b/libretro-common/lists/string_list.c index 87bf3e26a8..6e9cda4dc4 100644 --- a/libretro-common/lists/string_list.c +++ b/libretro-common/lists/string_list.c @@ -168,8 +168,15 @@ bool string_list_append(struct string_list *list, const char *elem, { char *data_dup = NULL; + /* Note: If 'list' is incorrectly initialised + * (i.e. if struct is zero initialised and + * string_list_initialize() is not called on + * it) capacity will be zero. This will cause + * a segfault. Handle this case by forcing the new + * capacity to a fixed size of 32 */ if (list->size >= list->cap && - !string_list_capacity(list, list->cap * 2)) + !string_list_capacity(list, + (list->cap > 0) ? (list->cap * 2) : 32)) return false; data_dup = strdup(elem); diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index f385097db4..2087499532 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -4623,12 +4623,15 @@ static int action_ok_reset_core_association(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_handle_t *menu = menu_driver_get_ptr(); + size_t playlist_index; if (!menu) return menu_cbs_exit(); + playlist_index = (size_t)menu->rpl_entry_selection_ptr; + if (!command_event(CMD_EVENT_RESET_CORE_ASSOCIATION, - (void *)&menu->rpl_entry_selection_ptr)) + (void *)&playlist_index)) return menu_cbs_exit(); return 0; }