(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

This commit is contained in:
rubidium 2010-05-10 09:50:49 +00:00
parent c03844c22a
commit fb84d465ed

View File

@ -92,17 +92,20 @@ bool FiosGetDiskFreeSpace(const char *path, uint64 *tot)
bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb) bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb)
{ {
char filename[MAX_PATH]; char filename[MAX_PATH];
int res;
#if defined(__MORPHOS__) || defined(__AMIGAOS__) #if defined(__MORPHOS__) || defined(__AMIGAOS__)
/* On MorphOS or AmigaOS paths look like: "Volume:directory/subdirectory" */ /* On MorphOS or AmigaOS paths look like: "Volume:directory/subdirectory" */
if (FiosIsRoot(path)) { 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 // XXX - only next line!
#else #else
assert(path[strlen(path) - 1] == PATHSEPCHAR); assert(path[strlen(path) - 1] == PATHSEPCHAR);
if (strlen(path) > 2) assert(path[strlen(path) - 2] != PATHSEPCHAR); if (strlen(path) > 2) assert(path[strlen(path) - 2] != PATHSEPCHAR);
#endif #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; return stat(filename, sb) == 0;
} }