Skip to content

Commit

Permalink
Don't leave internal structures temporarily modified before calling an
Browse files Browse the repository at this point in the history
 application callback, so that state is sane if they call into the API
 from inside the callback.
  • Loading branch information
icculus committed Sep 18, 2005
1 parent 6e7e45c commit 4996319
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 10 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG
Expand Up @@ -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.
Expand Down
29 changes: 20 additions & 9 deletions physfs.c
Expand Up @@ -1545,6 +1545,25 @@ char **PHYSFS_enumerateFiles(const char *path)
} /* 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)
Expand All @@ -1564,15 +1583,7 @@ void PHYSFS_enumerateFilesCallback(const char *_fname,
{
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))
{
Expand Down

0 comments on commit 4996319

Please sign in to comment.