changeset 15150:12944c945d4c draft

(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
author rubidium <rubidium@openttd.org>
date Mon, 10 May 2010 09:49:02 +0000
parents 705c7db7523c
children 48875bb4f103
files src/fileio.cpp src/fileio_func.h
diffstat 2 files changed, 10 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.cpp
+++ b/src/fileio.cpp
@@ -448,16 +448,21 @@
  * 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 @@
 			/* 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 @@
 {
 	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);
 }
--- a/src/fileio_func.h
+++ b/src/fileio_func.h
@@ -57,7 +57,7 @@
 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);