Don't leave internal structures temporarily modified before calling an
authorRyan C. Gordon <icculus@icculus.org>
Sun, 18 Sep 2005 22:27:05 +0000
changeset 755 ccb7ed0547ef
parent 754 e7cd7411eadf
child 756 f61923cbf078
Don't leave internal structures temporarily modified before calling an application callback, so that state is sane if they call into the API from inside the callback.
CHANGELOG
physfs.c
--- a/CHANGELOG	Sun Sep 18 21:44:42 2005 +0000
+++ b/CHANGELOG	Sun Sep 18 22:27:05 2005 +0000
@@ -5,7 +5,9 @@
 09182005 - API BREAKAGE: PHYSFS_enumerateFilesCallback() now passes the
            original directory name back to the app in the callback. This
            API was only in 1.1.0, and wasn't promised to be stable at this
-           point. Please update your apps.
+           point. Please update your apps! Cleaned out a FIXME in file
+           enumeration that would confuse the library under certain
+           circumstances.
 09092005 - Some tweaks to PHYSFS_Allocator. Apparently configure.in doesn't
            work like I thought for version bumps, so it thinks 1.1.0 isn't
            binary compatible with 1.0...fixed, I think.
--- a/physfs.c	Sun Sep 18 21:44:42 2005 +0000
+++ b/physfs.c	Sun Sep 18 22:27:05 2005 +0000
@@ -1545,6 +1545,25 @@
 } /* PHYSFS_enumerateFiles */
 
 
+/*
+ * Broke out to seperate function so we can use alloca() gratuitously.
+ */
+static void enumerateFromMountPoint(DirHandle *i, const char *arcfname,
+                                    PHYSFS_EnumFilesCallback callback,
+                                    const char *_fname, void *data)
+{
+    size_t len = strlen(arcfname);
+    char *mountPoint = (char *) alloca(strlen(i->mountPoint) + 1);
+    strcpy(mountPoint, i->mountPoint);
+    char *ptr = mountPoint + ((len) ? len + 1 : 0);
+    char *end = strchr(ptr, '/');
+    assert(end);  /* should always find a terminating '/'. */
+    *end = '\0';
+    callback(data, _fname, ptr);
+} /* enumerateFromMountPoint */
+
+
+
 void PHYSFS_enumerateFilesCallback(const char *_fname,
                                    PHYSFS_EnumFilesCallback callback,
                                    void *data)
@@ -1564,15 +1583,7 @@
     {
         char *arcfname = fname;
         if (partOfMountPoint(i, arcfname))
-        {
-            size_t len = strlen(arcfname);
-            char *ptr = i->mountPoint + ((len) ? len + 1 : 0);
-            char *end = strchr(ptr, '/');
-            assert(end);  /* should always find a terminating '/'. */
-            *end = '\0';  /* !!! FIXME: not safe in a callback... */
-            callback(data, _fname, ptr);
-            *end = '/';   /* !!! FIXME: not safe in a callback... */
-        } /* if */
+            enumerateFromMountPoint(i, arcfname, callback, _fname, data);
 
         else if (verifyPath(i, &arcfname, 0))
         {