From ff7b8ea2a06fd0ff40d9df03ff9e58cb8d38aa38 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Wed, 21 Jun 2017 01:10:23 +0000 Subject: [PATCH] Revert "[compiler-rt] Don't reset non-default user handler if allow_user_segv_handler is true." Summary: On Android we still need to reset preinstalled handlers and allow use handlers later. This reverts commit r304039. Reviewers: eugenis Subscribers: kubamracek, dberris, llvm-commits Differential Revision: https://reviews.llvm.org/D34434 llvm-svn: 305871 --- .../sanitizer_posix_libcdep.cc | 20 +-------- .../TestCases/Linux/preinstalled_signal.cc | 44 ++++++++++--------- 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc index 5b1d53698707..e113fb1093d4 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc @@ -189,25 +189,7 @@ void UnsetAlternateSignalStack() { static void MaybeInstallSigaction(int signum, SignalHandlerType handler) { - 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; - } + if (GetHandleSignalMode(signum) == kHandleSignalNo) return; struct sigaction sigact; internal_memset(&sigact, 0, sizeof(sigact)); diff --git a/compiler-rt/test/asan/TestCases/Linux/preinstalled_signal.cc b/compiler-rt/test/asan/TestCases/Linux/preinstalled_signal.cc index 40dadf43dc4e..4d466c21f944 100644 --- a/compiler-rt/test/asan/TestCases/Linux/preinstalled_signal.cc +++ b/compiler-rt/test/asan/TestCases/Linux/preinstalled_signal.cc @@ -4,11 +4,13 @@ // RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=2 not %run %t 2>&1 | FileCheck %s // RUN: %clangxx -std=c++11 -DTEST_INSTALL_SIG_HANDLER %s -o %t -// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=1 not %run %t 2>&1 | FileCheck --check-prefix=CHECK-HANDLER %s +// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-HANDLER +// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=1 not %run %t 2>&1 | FileCheck %s // RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=2 not %run %t 2>&1 | FileCheck %s // RUN: %clangxx -std=c++11 -DTEST_INSTALL_SIG_ACTION %s -o %t -// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=1 not %run %t 2>&1 | FileCheck --check-prefix=CHECK-ACTION %s +// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-ACTION +// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=1 not %run %t 2>&1 | FileCheck %s // RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=2 not %run %t 2>&1 | FileCheck %s // REQUIRES: asan-dynamic-runtime @@ -51,22 +53,22 @@ int InternalSigaction(int sig, KernelSigaction *act, KernelSigaction *oact) { return syscall(__NR_rt_sigaction, sig, act, oact, NSIG / 8); } -struct KernelSigaction sigact = {}; +struct KernelSigaction pre_asan = {}; static void Init() { - int res = InternalSigaction(SIGSEGV, nullptr, &sigact); + int res = InternalSigaction(SIGSEGV, nullptr, &pre_asan); assert(res >= 0); - assert(sigact.handler == SIG_DFL || sigact.handler == SIG_IGN); + assert(pre_asan.handler == SIG_DFL || pre_asan.handler == SIG_IGN); #if defined(TEST_INSTALL_SIG_HANDLER) - sigact = {}; - sigact.handler = &SigHandler; - res = InternalSigaction(SIGSEGV, &sigact, nullptr); + pre_asan = {}; + pre_asan.handler = &SigHandler; + res = InternalSigaction(SIGSEGV, &pre_asan, nullptr); assert(res >= 0); #elif defined(TEST_INSTALL_SIG_ACTION) - sigact = {}; - sigact.flags = SA_SIGINFO | SA_NODEFER; - sigact.handler = (__sighandler_t)&SigAction; - res = InternalSigaction(SIGSEGV, &sigact, nullptr); + pre_asan = {}; + pre_asan.flags = SA_SIGINFO | SA_NODEFER; + pre_asan.handler = (__sighandler_t)&SigAction; + res = InternalSigaction(SIGSEGV, &pre_asan, nullptr); assert(res >= 0); #endif } @@ -74,21 +76,21 @@ static void Init() { __attribute__((section(".preinit_array"), used)) void (*__local_test_preinit)(void) = Init; -bool ShouldAsanInstallHandlers() { +bool ExpectUserHandler() { #if defined(TEST_INSTALL_SIG_HANDLER) || defined(TEST_INSTALL_SIG_ACTION) - return !strcmp(getenv("ASAN_OPTIONS"), "handle_segv=2"); + return !strcmp(getenv("ASAN_OPTIONS"), "handle_segv=0"); #endif - return true; + return false; } int main(int argc, char *argv[]) { - KernelSigaction sigact_asan = {}; - InternalSigaction(SIGSEGV, nullptr, &sigact_asan); + KernelSigaction post_asan = {}; + InternalSigaction(SIGSEGV, nullptr, &post_asan); - assert(sigact_asan.handler != SIG_DFL); - assert(sigact_asan.handler != SIG_IGN); - assert(ShouldAsanInstallHandlers() == - (sigact_asan.handler != sigact.handler)); + assert(post_asan.handler != SIG_DFL); + assert(post_asan.handler != SIG_IGN); + assert(ExpectUserHandler() == + (post_asan.handler == pre_asan.handler)); raise(SIGSEGV); printf("%s\n", handler);