From dbe270476a72978f3aeb88069e4f66b5694adbfb Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 2 Feb 2018 11:41:54 -0500 Subject: [PATCH] Prevent undefined behavior reported by UBSan runtime error: member access within null pointer of type 'const struct dirent' --- libretro-common/file/retro_dirent.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libretro-common/file/retro_dirent.c b/libretro-common/file/retro_dirent.c index 0b716e6e56..171a4dee72 100644 --- a/libretro-common/file/retro_dirent.c +++ b/libretro-common/file/retro_dirent.c @@ -138,7 +138,7 @@ struct RDIR *retro_opendir(const char *name) #elif defined(VITA) || defined(PSP) rdir->directory = sceIoDopen(name); #elif defined(_3DS) - rdir->directory = (name && *name)? opendir(name) : NULL; + rdir->directory = !string_is_empty(name) ? opendir(name) : NULL; rdir->entry = NULL; #elif defined(__CELLOS_LV2__) rdir->error = cellFsOpendir(name, &rdir->directory); @@ -147,7 +147,13 @@ struct RDIR *retro_opendir(const char *name) rdir->entry = NULL; #endif - return rdir; + if (rdir->directory) + return rdir; + else + { + free(rdir); + return NULL; + } } bool retro_dirent_error(struct RDIR *rdir) @@ -208,6 +214,7 @@ const char *retro_dirent_get_name(struct RDIR *rdir) #elif defined(VITA) || defined(PSP) || defined(__CELLOS_LV2__) return rdir->entry.d_name; #else + return rdir->entry->d_name; #endif }