summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_posix_libcdep.cc
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2017-05-26 21:51:26 +0000
committerVitaly Buka <vitalybuka@google.com>2017-05-26 21:51:26 +0000
commitf9198fc26c8e502bffa758b451b8ded20bb9a7f4 (patch)
treee2257c7f1b579790554c7ec7be3dbaeaa4449faa /lib/sanitizer_common/sanitizer_posix_libcdep.cc
parent0338f3e77f7589bc43a1a9b38e7324334da1939c (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.cc20
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));