[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