[compiler-rt] r318303 - libfuzzer: Fix file listing on some filesystems
Kostya Serebryany via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 15 08:45:17 PST 2017
Author: kcc
Date: Wed Nov 15 08:45:17 2017
New Revision: 318303
URL: http://llvm.org/viewvc/llvm-project?rev=318303&view=rev
Log:
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
Modified:
compiler-rt/trunk/lib/fuzzer/FuzzerIOPosix.cpp
Modified: compiler-rt/trunk/lib/fuzzer/FuzzerIOPosix.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/fuzzer/FuzzerIOPosix.cpp?rev=318303&r1=318302&r2=318303&view=diff
==============================================================================
--- compiler-rt/trunk/lib/fuzzer/FuzzerIOPosix.cpp (original)
+++ compiler-rt/trunk/lib/fuzzer/FuzzerIOPosix.cpp Wed Nov 15 08:45:17 2017
@@ -32,6 +32,13 @@ bool IsFile(const std::string &Path) {
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) {
struct stat St;
if (stat(Path.c_str(), &St))
@@ -52,9 +59,12 @@ void ListFilesInDirRecursive(const std::
}
while (auto E = readdir(D)) {
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);
- 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);
}
closedir(D);
More information about the llvm-commits
mailing list