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.
--- 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))
{