summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2017-05-25 01:43:13 +0000
committerVitaly Buka <vitalybuka@google.com>2017-05-25 01:43:13 +0000
commitbf40f1b6dd61cd84e45903ba1802348ca1b5f962 (patch)
tree1970be985225741de78073ac96e18d3f6a79f722
parenta1c532784d358e1840031f727dfc4564fb653f1a (diff)
downloadbcm5719-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
-rw-r--r--llvm/lib/Fuzzer/FuzzerUtilPosix.cpp17
-rw-r--r--llvm/lib/Fuzzer/test/fuzzer-segv.test2
2 files changed, 17 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);
diff --git a/llvm/lib/Fuzzer/test/fuzzer-segv.test b/llvm/lib/Fuzzer/test/fuzzer-segv.test
index b9a6a5ce44c..90f01932f65 100644
--- a/llvm/lib/Fuzzer/test/fuzzer-segv.test
+++ b/llvm/lib/Fuzzer/test/fuzzer-segv.test
@@ -3,3 +3,5 @@ LIBFUZZER_OWN_SEGV_HANDLER: == ERROR: libFuzzer: deadly signal
LIBFUZZER_OWN_SEGV_HANDLER: SUMMARY: libFuzzer: deadly signal
LIBFUZZER_OWN_SEGV_HANDLER: Test unit written to ./crash-
+RUN: env ASAN_OPTIONS=handle_segv=1 not LLVMFuzzer-NullDerefTest 2>&1 | FileCheck %s --check-prefix=LIBFUZZER_ASAN_SEGV_HANDLER
+LIBFUZZER_ASAN_SEGV_HANDLER: ERROR: AddressSanitizer: {{SEGV|access-violation}} on unknown address
OpenPOWER on IntegriCloud