diff options
| author | 2017-01-14 19:55:43 +0000 | |
|---|---|---|
| committer | 2017-01-14 19:55:43 +0000 | |
| commit | bd3306aecb3a15e8967143b8cdbbccf2b1b19b74 (patch) | |
| tree | 309a8132b44564b9e634c0da6815187ce8eab27c /gnu/llvm/lib/Fuzzer/FuzzerIO.cpp | |
| parent | killp -a should not kill the window if only one pane. (diff) | |
| download | wireguard-openbsd-bd3306aecb3a15e8967143b8cdbbccf2b1b19b74.tar.xz wireguard-openbsd-bd3306aecb3a15e8967143b8cdbbccf2b1b19b74.zip | |
Import LLVM 3.9.1 including clang and lld.
Diffstat (limited to 'gnu/llvm/lib/Fuzzer/FuzzerIO.cpp')
| -rw-r--r-- | gnu/llvm/lib/Fuzzer/FuzzerIO.cpp | 80 |
1 files changed, 61 insertions, 19 deletions
diff --git a/gnu/llvm/lib/Fuzzer/FuzzerIO.cpp b/gnu/llvm/lib/Fuzzer/FuzzerIO.cpp index 043fad396d5..0e0c4e989cc 100644 --- a/gnu/llvm/lib/Fuzzer/FuzzerIO.cpp +++ b/gnu/llvm/lib/Fuzzer/FuzzerIO.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// // IO functions. //===----------------------------------------------------------------------===// +#include "FuzzerExtFunctions.h" #include "FuzzerInternal.h" #include <iterator> #include <fstream> @@ -20,6 +21,15 @@ namespace fuzzer { +static FILE *OutputFile = stderr; + +bool IsFile(const std::string &Path) { + struct stat St; + if (stat(Path.c_str(), &St)) + return false; + return S_ISREG(St.st_mode); +} + static long GetEpoch(const std::string &Path) { struct stat St; if (stat(Path.c_str(), &St)) @@ -27,35 +37,45 @@ static long GetEpoch(const std::string &Path) { return St.st_mtime; } -static std::vector<std::string> ListFilesInDir(const std::string &Dir, - long *Epoch) { - std::vector<std::string> V; - if (Epoch) { - auto E = GetEpoch(Dir); - if (*Epoch >= E) return V; - *Epoch = E; - } +static void ListFilesInDirRecursive(const std::string &Dir, long *Epoch, + std::vector<std::string> *V, bool TopDir) { + auto E = GetEpoch(Dir); + if (Epoch) + if (E && *Epoch >= E) return; + DIR *D = opendir(Dir.c_str()); if (!D) { Printf("No such directory: %s; exiting\n", Dir.c_str()); exit(1); } while (auto E = readdir(D)) { + std::string Path = DirPlusFile(Dir, E->d_name); if (E->d_type == DT_REG || E->d_type == DT_LNK) - V.push_back(E->d_name); + V->push_back(Path); + else if (E->d_type == DT_DIR && *E->d_name != '.') + ListFilesInDirRecursive(Path, Epoch, V, false); } closedir(D); - return V; + if (Epoch && TopDir) + *Epoch = E; } -Unit FileToVector(const std::string &Path) { +Unit FileToVector(const std::string &Path, size_t MaxSize) { std::ifstream T(Path); if (!T) { Printf("No such directory: %s; exiting\n", Path.c_str()); exit(1); } - return Unit((std::istreambuf_iterator<char>(T)), - std::istreambuf_iterator<char>()); + + T.seekg(0, T.end); + size_t FileLen = T.tellg(); + if (MaxSize) + FileLen = std::min(FileLen, MaxSize); + + T.seekg(0, T.beg); + Unit Res(FileLen); + T.read(reinterpret_cast<char *>(Res.data()), FileLen); + return Res; } std::string FileToString(const std::string &Path) { @@ -77,12 +97,18 @@ void WriteToFile(const Unit &U, const std::string &Path) { } void ReadDirToVectorOfUnits(const char *Path, std::vector<Unit> *V, - long *Epoch) { + long *Epoch, size_t MaxSize) { long E = Epoch ? *Epoch : 0; - for (auto &X : ListFilesInDir(Path, Epoch)) { - auto FilePath = DirPlusFile(Path, X); - if (Epoch && GetEpoch(FilePath) < E) continue; - V->push_back(FileToVector(FilePath)); + std::vector<std::string> Files; + ListFilesInDirRecursive(Path, Epoch, &Files, /*TopDir*/true); + size_t NumLoaded = 0; + for (size_t i = 0; i < Files.size(); i++) { + auto &X = Files[i]; + if (Epoch && GetEpoch(X) < E) continue; + NumLoaded++; + if ((NumLoaded & (NumLoaded - 1)) == 0 && NumLoaded >= 1024) + Printf("Loaded %zd/%zd files from %s\n", NumLoaded, Files.size(), Path); + V->push_back(FileToVector(X, MaxSize)); } } @@ -91,11 +117,27 @@ std::string DirPlusFile(const std::string &DirPath, return DirPath + "/" + FileName; } +void DupAndCloseStderr() { + int OutputFd = dup(2); + if (OutputFd > 0) { + FILE *NewOutputFile = fdopen(OutputFd, "w"); + if (NewOutputFile) { + OutputFile = NewOutputFile; + if (EF->__sanitizer_set_report_fd) + EF->__sanitizer_set_report_fd(reinterpret_cast<void *>(OutputFd)); + close(2); + } + } +} + +void CloseStdout() { close(1); } + void Printf(const char *Fmt, ...) { va_list ap; va_start(ap, Fmt); - vfprintf(stderr, Fmt, ap); + vfprintf(OutputFile, Fmt, ap); va_end(ap); + fflush(OutputFile); } } // namespace fuzzer |
