SDL: filesystem: Fix SDL_GlobDirectory on iOS and Android.

From a3b0403412bc7b43cf7ce863114f31b43b50b431 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
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 5e126b64a05a2..fb47e986fd7bc 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);