diff options
author | Vitaly Buka <vitalybuka@google.com> | 2017-05-26 21:51:26 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2017-05-26 21:51:26 +0000 |
commit | f9198fc26c8e502bffa758b451b8ded20bb9a7f4 (patch) | |
tree | e2257c7f1b579790554c7ec7be3dbaeaa4449faa /lib/sanitizer_common/sanitizer_posix_libcdep.cc | |
parent | 0338f3e77f7589bc43a1a9b38e7324334da1939c (diff) |
[compiler-rt] Don't reset non-default user handler if allow_user_segv_handler is true.
Reviewers: eugenis, kcc
Subscribers: kubamracek, llvm-commits
Differential Revision: https://reviews.llvm.org/D32457
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@304039 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_posix_libcdep.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_posix_libcdep.cc | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/sanitizer_common/sanitizer_posix_libcdep.cc b/lib/sanitizer_common/sanitizer_posix_libcdep.cc index 21178c46a..791ff4481 100644 --- a/lib/sanitizer_common/sanitizer_posix_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_posix_libcdep.cc @@ -189,7 +189,25 @@ void UnsetAlternateSignalStack() { static void MaybeInstallSigaction(int signum, SignalHandlerType handler) { - if (GetHandleSignalMode(signum) == kHandleSignalNo) return; + switch (GetHandleSignalMode(signum)) { + case kHandleSignalNo: + return; + case kHandleSignalYes: { + struct sigaction sigact; + internal_memset(&sigact, 0, sizeof(sigact)); + CHECK_EQ(0, internal_sigaction(signum, nullptr, &sigact)); + 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; + } + break; + } + case kHandleSignalExclusive: + break; + } struct sigaction sigact; internal_memset(&sigact, 0, sizeof(sigact)); |