From: Matt Morehouse Date: Fri, 26 Apr 2019 00:17:41 +0000 (+0000) Subject: [libFuzzer] Disable MSan interceptors in SIGINT handler. X-Git-Tag: llvmorg-10-init~6971 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1b76063a5e023b39b4a395d7fc68fd5fe1e6aba3;p=platform%2Fupstream%2Fllvm.git [libFuzzer] Disable MSan interceptors in SIGINT handler. Summary: Avoids an MSan false positive if the SIGINT comes while the user callback is running. The false positive happens when the interrupt handler calls opendir() to remove some temporary files, which is intercepted by MSan. Fixes https://github.com/google/oss-fuzz/issues/2332. Reviewers: kcc Reviewed By: kcc Subscribers: llvm-commits, Dor1s, metzman Tags: #llvm Differential Revision: https://reviews.llvm.org/D61163 llvm-svn: 359254 --- diff --git a/compiler-rt/lib/fuzzer/FuzzerLoop.cpp b/compiler-rt/lib/fuzzer/FuzzerLoop.cpp index a323a7a..fd5b226 100644 --- a/compiler-rt/lib/fuzzer/FuzzerLoop.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerLoop.cpp @@ -266,6 +266,7 @@ void Fuzzer::MaybeExitGracefully() { void Fuzzer::InterruptCallback() { Printf("==%lu== libFuzzer: run interrupted; exiting\n", GetPid()); PrintFinalStats(); + ScopedDisableMsanInterceptorChecks S; // RmDirRecursive may call opendir(). RmDirRecursive(TempPath(".dir")); // Stop right now, don't perform any at-exit actions. _Exit(Options.InterruptExitCode); @@ -681,7 +682,7 @@ void Fuzzer::MutateAndTestOne() { Size <= CurrentMaxMutationLen) NewSize = MD.MutateWithMask(CurrentUnitData, Size, Size, II.DataFlowTraceForFocusFunction); - + // If MutateWithMask either failed or wasn't called, call default Mutate. if (!NewSize) NewSize = MD.Mutate(CurrentUnitData, Size, CurrentMaxMutationLen); diff --git a/compiler-rt/test/fuzzer/sigint.test b/compiler-rt/test/fuzzer/sigint.test new file mode 100644 index 0000000..7242668 --- /dev/null +++ b/compiler-rt/test/fuzzer/sigint.test @@ -0,0 +1,17 @@ +# FIXME: Disabled on Windows for now because of reliance on posix only features +# (eg: export, "&", pkill). +UNSUPPORTED: darwin, windows + +# Check that libFuzzer exits gracefully under SIGINT with MSan. +RUN: rm -rf %t +RUN: mkdir -p %t +RUN: %msan_compiler %S/SleepOneSecondTest.cpp -o %t/LFSIGINT + +RUN: %run %t/LFSIGINT 2> %t/log & export PID=$! +RUN: sleep 2 +RUN: kill -SIGINT $PID +RUN: sleep 3 +RUN: cat %t/log | FileCheck %s + +CHECK: libFuzzer: run interrupted; exiting +CHECK-NOT: WARNING: MemorySanitizer