summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Fuzzer/FuzzerLoop.cpp
diff options
context:
space:
mode:
authorMarcos Pividori <mpividori@google.com>2016-12-13 17:46:25 +0000
committerMarcos Pividori <mpividori@google.com>2016-12-13 17:46:25 +0000
commit64d41473965d0e8d39f0c13fa38966ff0d365d8e (patch)
tree3f1b68865c418c70a7f22bd5432b7dad21834487 /llvm/lib/Fuzzer/FuzzerLoop.cpp
parent178fe587454a4decec0b2c9c05f71fcb44cd9311 (diff)
downloadbcm5719-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.cpp4
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);
OpenPOWER on IntegriCloud