Parcourir la source

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 a3b0403412bc7b43cf7ce863114f31b43b50b431)
Ryan C. Gordon il y a 2 semaines
Parent
commit
13ff9e0818
1 fichiers modifiés avec 20 ajouts et 22 suppressions
  1. 20 22
      src/filesystem/posix/SDL_sysfsops.c

+ 20 - 22
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);