libfuzzer: Fix file listing on some filesystems
Summary: For some filesystems, readdir will not populate dirent::d_type with valuable information. This causes libfuzzer to proceed with an empty corpus, instead of the file it contains. This has been tested on a server using XFS. It should fix https://bugs.llvm.org//show_bug.cgi?id=25991 Reviewers: kcc Reviewed By: kcc Differential Revision: https://reviews.llvm.org/D40028 llvm-svn: 318303
This commit is contained in:
parent
8eb9ca2580
commit
cb74c65f5e
|
@ -32,6 +32,13 @@ bool IsFile(const std::string &Path) {
|
||||||
return S_ISREG(St.st_mode);
|
return S_ISREG(St.st_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool IsDirectory(const std::string &Path) {
|
||||||
|
struct stat St;
|
||||||
|
if (stat(Path.c_str(), &St))
|
||||||
|
return false;
|
||||||
|
return S_ISDIR(St.st_mode);
|
||||||
|
}
|
||||||
|
|
||||||
size_t FileSize(const std::string &Path) {
|
size_t FileSize(const std::string &Path) {
|
||||||
struct stat St;
|
struct stat St;
|
||||||
if (stat(Path.c_str(), &St))
|
if (stat(Path.c_str(), &St))
|
||||||
|
@ -52,9 +59,12 @@ void ListFilesInDirRecursive(const std::string &Dir, long *Epoch,
|
||||||
}
|
}
|
||||||
while (auto E = readdir(D)) {
|
while (auto E = readdir(D)) {
|
||||||
std::string Path = DirPlusFile(Dir, E->d_name);
|
std::string Path = DirPlusFile(Dir, E->d_name);
|
||||||
if (E->d_type == DT_REG || E->d_type == DT_LNK)
|
if (E->d_type == DT_REG || E->d_type == DT_LNK ||
|
||||||
|
(E->d_type == DT_UNKNOWN && IsFile(Path)))
|
||||||
V->push_back(Path);
|
V->push_back(Path);
|
||||||
else if (E->d_type == DT_DIR && *E->d_name != '.')
|
else if ((E->d_type == DT_DIR ||
|
||||||
|
(E->d_type == DT_UNKNOWN && IsDirectory(Path))) &&
|
||||||
|
*E->d_name != '.')
|
||||||
ListFilesInDirRecursive(Path, Epoch, V, false);
|
ListFilesInDirRecursive(Path, Epoch, V, false);
|
||||||
}
|
}
|
||||||
closedir(D);
|
closedir(D);
|
||||||
|
|
Loading…
Reference in New Issue