[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
This commit is contained in:
Matt Morehouse 2019-04-26 00:17:41 +00:00
parent df5d2b3846
commit 1b76063a5e
2 changed files with 19 additions and 1 deletions

View File

@ -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);

View File

@ -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