# HG changeset patch # User rubidium # Date 2010-05-10 09:49:02 # Node ID 17ee0814362ef5436d6e9d6214434453d39c43fe # Parent 8fe9376dd02116ecbf072e69678803a832c19883 (svn r19779) -Change: add a return type to AppendPathSeparator and use that to determine whether we could append the path separator. If not, do not recurse into that directory as the path would exceed the maximum path length diff --git a/src/fileio.cpp b/src/fileio.cpp --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -448,16 +448,21 @@ void FioCreateDirectory(const char *name * It does not add the path separator to zero-sized strings. * @param buf string to append the separator to * @param buflen the length of the buf + * @return true iff the operation succeeded */ -void AppendPathSeparator(char *buf, size_t buflen) +bool AppendPathSeparator(char *buf, size_t buflen) { size_t s = strlen(buf); /* Length of string + path separator + '\0' */ - if (s != 0 && buf[s - 1] != PATHSEPCHAR && s + 2 < buflen) { + if (s != 0 && buf[s - 1] != PATHSEPCHAR) { + if (s + 2 >= buflen) return false; + buf[s] = PATHSEPCHAR; buf[s + 1] = '\0'; } + + return true; } /** @@ -1109,7 +1114,7 @@ static uint ScanPath(FileScanner *fs, co /* Directory */ if (!recursive) continue; if (strcmp(d_name, ".") == 0 || strcmp(d_name, "..") == 0) continue; - AppendPathSeparator(filename, lengthof(filename)); + if (!AppendPathSeparator(filename, lengthof(filename))) continue; num += ScanPath(fs, extension, filename, basepath_length, recursive); } else if (S_ISREG(sb.st_mode)) { /* File */ @@ -1196,6 +1201,6 @@ uint FileScanner::Scan(const char *exten { char path[MAX_PATH]; strecpy(path, directory, lastof(path)); - AppendPathSeparator(path, lengthof(path)); + if (!AppendPathSeparator(path, lengthof(path))) return 0; return ScanPath(this, extension, path, strlen(path), recursive); } diff --git a/src/fileio_func.h b/src/fileio_func.h --- a/src/fileio_func.h +++ b/src/fileio_func.h @@ -57,7 +57,7 @@ char *FioAppendDirectory(char *buf, size char *FioGetDirectory(char *buf, size_t buflen, Subdirectory subdir); void SanitizeFilename(char *filename); -void AppendPathSeparator(char *buf, size_t buflen); +bool AppendPathSeparator(char *buf, size_t buflen); void DeterminePaths(const char *exe); void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize); bool FileExists(const char *filename);