diff options
author | Vitaly Buka <vitalybuka@google.com> | 2017-05-25 01:43:13 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2017-05-25 01:43:13 +0000 |
commit | bf40f1b6dd61cd84e45903ba1802348ca1b5f962 (patch) | |
tree | 1970be985225741de78073ac96e18d3f6a79f722 /llvm/lib/Fuzzer/FuzzerUtilPosix.cpp | |
parent | a1c532784d358e1840031f727dfc4564fb653f1a (diff) | |
download | bcm5719-llvm-bf40f1b6dd61cd84e45903ba1802348ca1b5f962.tar.gz bcm5719-llvm-bf40f1b6dd61cd84e45903ba1802348ca1b5f962.zip |
[libFuzzer] Don't replace custom signal handlers.
Summary:
This allows to keep handlers installed by sanitizers.
In other cases third-party code can replace handlers after libFuzzer
initialization anyway.
Reviewers: kcc
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D33522
llvm-svn: 303828
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerUtilPosix.cpp')
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerUtilPosix.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerUtilPosix.cpp b/llvm/lib/Fuzzer/FuzzerUtilPosix.cpp index 0161309fbf8..bc85264ac18 100644 --- a/llvm/lib/Fuzzer/FuzzerUtilPosix.cpp +++ b/llvm/lib/Fuzzer/FuzzerUtilPosix.cpp @@ -47,8 +47,21 @@ static void FileSizeExceedHandler(int, siginfo_t *, void *) { static void SetSigaction(int signum, void (*callback)(int, siginfo_t *, void *)) { - struct sigaction sigact; - memset(&sigact, 0, sizeof(sigact)); + struct sigaction sigact = {}; + if (sigaction(signum, nullptr, &sigact)) { + Printf("libFuzzer: sigaction failed with %d\n", errno); + exit(1); + } + if (sigact.sa_flags & SA_SIGINFO) { + if (sigact.sa_sigaction) + return; + } else { + if (sigact.sa_handler != SIG_DFL && sigact.sa_handler != SIG_IGN && + sigact.sa_handler != SIG_ERR) + return; + } + + sigact = {}; sigact.sa_sigaction = callback; if (sigaction(signum, &sigact, 0)) { Printf("libFuzzer: sigaction failed with %d\n", errno); |