From a3b0403412bc7b43cf7ce863114f31b43b50b431 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 17 Feb 2026 19:41:20 -0500 Subject: [PATCH] filesystem: Fix SDL_GlobDirectory on iOS and Android. It SDL_SYS_EnumerateDirectory was changing the path string and passing it to the callback, causing chaos in the glob handler, which expected the original string to pass through. Fixes #15057. --- src/filesystem/posix/SDL_sysfsops.c | 42 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/filesystem/posix/SDL_sysfsops.c b/src/filesystem/posix/SDL_sysfsops.c index 5e126b64a0..fb47e986fd 100644 --- a/src/filesystem/posix/SDL_sysfsops.c +++ b/src/filesystem/posix/SDL_sysfsops.c @@ -39,46 +39,44 @@ #include "../../core/android/SDL_android.h" #endif + bool SDL_SYS_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback cb, void *userdata) { -#ifdef SDL_PLATFORM_ANDROID - if (*path != '/') { - char *apath = NULL; - SDL_asprintf(&apath, "%s/%s", SDL_GetAndroidInternalStoragePath(), path); - if (!apath) { - return false; - } - const bool retval = SDL_SYS_EnumerateDirectory(apath, cb, userdata); - SDL_free(apath); - if (retval) { - return true; - } - } -#endif + char *apath = NULL; // absolute path (for Android, iOS, etc). Overrides `path`. -#ifdef SDL_PLATFORM_IOS +#if defined(SDL_PLATFORM_ANDROID) || defined(SDL_PLATFORM_IOS) if (*path != '/') { + #ifdef SDL_PLATFORM_ANDROID + SDL_asprintf(&apath, "%s/%s", SDL_GetAndroidInternalStoragePath(), path); + #elif defined(SDL_PLATFORM_IOS) char *base = SDL_GetPrefPath("", ""); if (!base) { return false; } - char *apath = NULL; SDL_asprintf(&apath, "%s%s", base, path); SDL_free(base); + #endif + if (!apath) { return false; } - const bool retval = SDL_SYS_EnumerateDirectory(apath, cb, userdata); - SDL_free(apath); - if (retval) { - return true; + } +#elif 0 // this is just for testing that `apath` works when you aren't on iOS or Android. + if (*path != '/') { + char *c = SDL_SYS_GetCurrentDirectory(); + SDL_asprintf(&apath, "%s%s", c, path); + SDL_free(c); + if (!apath) { + return false; } } #endif char *pathwithsep = NULL; - int pathwithseplen = SDL_asprintf(&pathwithsep, "%s/", path); + int pathwithseplen = SDL_asprintf(&pathwithsep, "%s/", apath ? apath : path); + const size_t extralen = apath ? (SDL_strlen(apath) - SDL_strlen(path)) : 0; + SDL_free(apath); if ((pathwithseplen == -1) || (!pathwithsep)) { return false; } @@ -112,7 +110,7 @@ bool SDL_SYS_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback if ((SDL_strcmp(name, ".") == 0) || (SDL_strcmp(name, "..") == 0)) { continue; } - result = cb(userdata, pathwithsep, name); + result = cb(userdata, pathwithsep + extralen, name); } closedir(dir);