r770 - trunk

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Sep 18 18:27:05 EDT 2005


Author: icculus
Date: 2005-09-18 18:27:05 -0400 (Sun, 18 Sep 2005)
New Revision: 770

Modified:
   trunk/CHANGELOG
   trunk/physfs.c
Log:
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.


Modified: trunk/CHANGELOG
===================================================================
--- trunk/CHANGELOG	2005-09-18 21:44:42 UTC (rev 769)
+++ trunk/CHANGELOG	2005-09-18 22:27:05 UTC (rev 770)
@@ -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.

Modified: trunk/physfs.c
===================================================================
--- trunk/physfs.c	2005-09-18 21:44:42 UTC (rev 769)
+++ trunk/physfs.c	2005-09-18 22:27:05 UTC (rev 770)
@@ -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))
         {




More information about the physfs-commits mailing list