changeset 15151:48875bb4f103 draft

(svn r19780) -Fix [FS#3807]: make sure that when checking whether a path + filename are valid the whole string can be constructed within an array of length MAX_PATH. If not, the name is too long and is deemed invalid
author rubidium <rubidium@openttd.org>
date Mon, 10 May 2010 09:50:49 +0000
parents 12944c945d4c
children 1d73b4a8c4a8
files src/os/unix/unix.cpp
diffstat 1 files changed, 6 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/os/unix/unix.cpp
+++ b/src/os/unix/unix.cpp
@@ -92,17 +92,20 @@
 bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb)
 {
 	char filename[MAX_PATH];
-
+	int res;
 #if defined(__MORPHOS__) || defined(__AMIGAOS__)
 	/* On MorphOS or AmigaOS paths look like: "Volume:directory/subdirectory" */
 	if (FiosIsRoot(path)) {
-		snprintf(filename, lengthof(filename), "%s:%s", path, ent->d_name);
+		res = snprintf(filename, lengthof(filename), "%s:%s", path, ent->d_name);
 	} else // XXX - only next line!
 #else
 	assert(path[strlen(path) - 1] == PATHSEPCHAR);
 	if (strlen(path) > 2) assert(path[strlen(path) - 2] != PATHSEPCHAR);
 #endif
-	snprintf(filename, lengthof(filename), "%s%s", path, ent->d_name);
+	res = snprintf(filename, lengthof(filename), "%s%s", path, ent->d_name);
+
+	/* Could we fully concatenate the path and filename? */
+	if (res >= (int)lengthof(filename) || res < 0) return false;
 
 	return stat(filename, sb) == 0;
 }