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.

(cherry picked from commit a3b0403412)
This commit is contained in:
Ryan C. Gordon
2026-02-17 19:41:20 -05:00
committed by Sam Lantinga
parent 42abf69434
commit 13ff9e0818

View File

@@ -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);