diff options
author | Jonathan Metzman <metzman@chromium.org> | 2019-04-30 20:56:18 +0000 |
---|---|---|
committer | Jonathan Metzman <metzman@chromium.org> | 2019-04-30 20:56:18 +0000 |
commit | f3ee97731eb524e9c7bc6911c205a38e643dfff4 (patch) | |
tree | 4e2bb339020d1c0221c5d798cf91f01ab906108f /compiler-rt/lib/fuzzer/FuzzerDriver.cpp | |
parent | eeae45dc77d227d0376e381708e5ece4760ededb (diff) | |
download | bcm5719-llvm-f3ee97731eb524e9c7bc6911c205a38e643dfff4.tar.gz bcm5719-llvm-f3ee97731eb524e9c7bc6911c205a38e643dfff4.zip |
[libFuzzer] Replace -seed_corpus to better support fork mode on Win
Summary:
Pass seed corpus list in a file to get around argument length limits on Windows.
This limit was preventing many uses of fork mode on Windows.
Reviewers: kcc, morehouse
Reviewed By: kcc
Subscribers: #sanitizers, llvm-commits
Tags: #sanitizers, #llvm
Differential Revision: https://reviews.llvm.org/D60980
llvm-svn: 359610
Diffstat (limited to 'compiler-rt/lib/fuzzer/FuzzerDriver.cpp')
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerDriver.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/compiler-rt/lib/fuzzer/FuzzerDriver.cpp b/compiler-rt/lib/fuzzer/FuzzerDriver.cpp index a51ac9310fa..b9c89274703 100644 --- a/compiler-rt/lib/fuzzer/FuzzerDriver.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerDriver.cpp @@ -763,16 +763,25 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { exit(0); } - // Parse -seed_inputs=file1,file2,... + // Parse -seed_inputs=file1,file2,... or -seed_inputs=@seed_inputs_file Vector<std::string> ExtraSeedFiles; if (Flags.seed_inputs) { - std::string s = Flags.seed_inputs; - size_t comma_pos; - while ((comma_pos = s.find_last_of(',')) != std::string::npos) { - ExtraSeedFiles.push_back(s.substr(comma_pos + 1)); - s = s.substr(0, comma_pos); + std::string SeedInputs; + if (Flags.seed_inputs[0] == '@') + SeedInputs = FileToString(Flags.seed_inputs + 1); // File contains list. + else + SeedInputs = Flags.seed_inputs; // seed_inputs contains the list. + if (SeedInputs.empty()) { + Printf("seed_inputs is empty or @file does not exist.\n"); + exit(1); + } + // Parse SeedInputs. + size_t comma_pos = 0; + while ((comma_pos = SeedInputs.find_last_of(',')) != std::string::npos) { + ExtraSeedFiles.push_back(SeedInputs.substr(comma_pos + 1)); + SeedInputs = SeedInputs.substr(0, comma_pos); } - ExtraSeedFiles.push_back(s); + ExtraSeedFiles.push_back(SeedInputs); } F->Loop(*Inputs, ExtraSeedFiles); |