diff options
author | Marcos Pividori <mpividori@google.com> | 2016-12-13 17:46:25 +0000 |
---|---|---|
committer | Marcos Pividori <mpividori@google.com> | 2016-12-13 17:46:25 +0000 |
commit | 64d41473965d0e8d39f0c13fa38966ff0d365d8e (patch) | |
tree | 3f1b68865c418c70a7f22bd5432b7dad21834487 /llvm/lib/Fuzzer/FuzzerLoop.cpp | |
parent | 178fe587454a4decec0b2c9c05f71fcb44cd9311 (diff) | |
download | bcm5719-llvm-64d41473965d0e8d39f0c13fa38966ff0d365d8e.tar.gz bcm5719-llvm-64d41473965d0e8d39f0c13fa38966ff0d365d8e.zip |
[libFuzzer] Fix bug in detecting timeouts when input string is empty.
I added a new flag RunningCB to know if the Fuzzer's main thread is
running the CB function, instead of using (!CurrentUnitSize).
(!CurrentUnitSize) doesn't work properly. For example, in FuzzerLoop.cpp,
inside ShuffleAndMinimize() function, we execute the callback with an
empty string (size=0). Previous implementation failed to detect timeouts
in that execution.
Also, I add a regression test for that case.
Differential Revision: https://reviews.llvm.org/D27433
llvm-svn: 289561
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerLoop.cpp')
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerLoop.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerLoop.cpp b/llvm/lib/Fuzzer/FuzzerLoop.cpp index 93db6179e3d..f161cc7cda6 100644 --- a/llvm/lib/Fuzzer/FuzzerLoop.cpp +++ b/llvm/lib/Fuzzer/FuzzerLoop.cpp @@ -286,7 +286,7 @@ NO_SANITIZE_MEMORY void Fuzzer::AlarmCallback() { assert(Options.UnitTimeoutSec > 0); if (!InFuzzingThread()) return; - if (!CurrentUnitSize) + if (!RunningCB) return; // We have not started running units yet. size_t Seconds = duration_cast<seconds>(system_clock::now() - UnitStartTime).count(); @@ -532,7 +532,9 @@ void Fuzzer::ExecuteCallback(const uint8_t *Data, size_t Size) { UnitStartTime = system_clock::now(); ResetCounters(); // Reset coverage right before the callback. TPC.ResetMaps(); + RunningCB = true; int Res = CB(DataCopy, Size); + RunningCB = false; UnitStopTime = system_clock::now(); (void)Res; assert(Res == 0); |