From 1a665efb6ab9c822c502f413e5a76c234c4432b9 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sat, 8 Jun 2002 06:19:27 +0000 Subject: [PATCH] Enumerate files code: cleaned up memory leak, Doesn't throw away file entry from FindFirstFile(), and handles paths more robustly. --- platform/win32.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/platform/win32.c b/platform/win32.c index 0bce9f25..f9edc2fa 100644 --- a/platform/win32.c +++ b/platform/win32.c @@ -349,18 +349,27 @@ LinkedStringList *__PHYSFS_platformEnumerateFiles(const char *dirname, HANDLE dir; WIN32_FIND_DATA ent; char *SearchPath; + size_t len = strlen(dirname); - /* Allocate a new string for path, "*", and NULL terminator */ - SearchPath = malloc(strlen(dirname) + 2); + /* Allocate a new string for path, maybe '\\', "*", and NULL terminator */ + SearchPath = alloca(len + 3); /* Copy current dirname */ strcpy(SearchPath, dirname); + + /* if there's no '\\' at the end of the path, stick one in there. */ + if (dirname[len - 1] != '\\') + { + dirname[len++] = '\\'; + dirname[len] = '\0'; + } /* if */ + /* Append the "*" to the end of the string */ strcat(SearchPath, "*"); dir = FindFirstFile(SearchPath, &ent); BAIL_IF_MACRO(dir == INVALID_HANDLE_VALUE, win32strerror(), NULL); - while (FindNextFile(dir, &ent) != 0) + do { if (strcmp(ent.cFileName, ".") == 0) continue; @@ -388,7 +397,7 @@ LinkedStringList *__PHYSFS_platformEnumerateFiles(const char *dirname, prev = l; l->next = NULL; - } /* while */ + } while (FindNextFile(dir, &ent) != 0); FindClose(dir); return(retval);