From 499631936f1f88f95f3da4e5b560d0e6d84d6213 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 18 Sep 2005 22:27:05 +0000 Subject: [PATCH] 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 | 4 +++- physfs.c | 29 ++++++++++++++++++++--------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 45c961a3..b65fbd44 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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. diff --git a/physfs.c b/physfs.c index 8f12f82b..7cfcca9c 100644 --- a/physfs.c +++ b/physfs.c @@ -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) @@ -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)) {