diff options
author | Vitaly Buka <vitalybuka@google.com> | 2017-09-23 02:47:11 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2017-09-23 02:47:11 +0000 |
commit | c3f431fba3c142c03613feee43d9091fa8a128e1 (patch) | |
tree | 4d6b7fd4bf66ae7451246dd6f5d3b5adb970eb81 | |
parent | 2590edf615da75c18e04ead412f272d4ecc585b3 (diff) | |
download | bcm5719-llvm-c3f431fba3c142c03613feee43d9091fa8a128e1.tar.gz bcm5719-llvm-c3f431fba3c142c03613feee43d9091fa8a128e1.zip |
[ubsan] Support signal specific options in ubsan
Summary:
Part of https://github.com/google/sanitizers/issues/637
Standalone ubsan needs signal and sigaction handlers and interceptors.
Plugin mode should rely on parent tool.
Reviewers: eugenis, alekseyshl
Subscribers: kubamracek, llvm-commits, mgorny
Differential Revision: https://reviews.llvm.org/D37895
llvm-svn: 314052
9 files changed, 99 insertions, 7 deletions
diff --git a/compiler-rt/lib/ubsan/CMakeLists.txt b/compiler-rt/lib/ubsan/CMakeLists.txt index 4a2957c1872..57191c3086d 100644 --- a/compiler-rt/lib/ubsan/CMakeLists.txt +++ b/compiler-rt/lib/ubsan/CMakeLists.txt @@ -11,6 +11,7 @@ set(UBSAN_SOURCES set(UBSAN_STANDALONE_SOURCES ubsan_diag_standalone.cc ubsan_init_standalone.cc + ubsan_signals_standalone.cc ) set(UBSAN_CXXABI_SOURCES @@ -77,6 +78,7 @@ if(APPLE) RTUbsan_standalone RTSanitizerCommon RTSanitizerCommonLibc + RTInterception LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS} PARENT_TARGET ubsan) endif() @@ -144,6 +146,7 @@ else() RTSanitizerCommonLibc RTUbsan RTUbsan_standalone + RTInterception CFLAGS ${UBSAN_CFLAGS} PARENT_TARGET ubsan) @@ -162,6 +165,7 @@ else() RTSanitizerCommonLibc RTUbsan RTUbsan_standalone + RTInterception CFLAGS ${UBSAN_CFLAGS} LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} LINK_LIBS ${UBSAN_DYNAMIC_LIBS} diff --git a/compiler-rt/lib/ubsan/ubsan_init_standalone.cc b/compiler-rt/lib/ubsan/ubsan_init_standalone.cc index 8e999e3aca1..8bd500025cb 100644 --- a/compiler-rt/lib/ubsan/ubsan_init_standalone.cc +++ b/compiler-rt/lib/ubsan/ubsan_init_standalone.cc @@ -18,11 +18,17 @@ #include "sanitizer_common/sanitizer_internal_defs.h" #include "ubsan_init.h" +#include "ubsan_signals_standalone.h" + +namespace __ubsan { class UbsanStandaloneInitializer { public: UbsanStandaloneInitializer() { - __ubsan::InitAsStandalone(); + InitAsStandalone(); + InitializeDeadlySignals(); } }; static UbsanStandaloneInitializer ubsan_standalone_initializer; + +} // namespace __ubsan diff --git a/compiler-rt/lib/ubsan/ubsan_init_standalone_preinit.cc b/compiler-rt/lib/ubsan/ubsan_init_standalone_preinit.cc index 229ecc5c8df..9a8c6884a05 100644 --- a/compiler-rt/lib/ubsan/ubsan_init_standalone_preinit.cc +++ b/compiler-rt/lib/ubsan/ubsan_init_standalone_preinit.cc @@ -19,8 +19,19 @@ #include "sanitizer_common/sanitizer_internal_defs.h" #include "ubsan_init.h" +#include "ubsan_signals_standalone.h" #if SANITIZER_CAN_USE_PREINIT_ARRAY + +namespace __ubsan { + +static void PreInitAsStandalone() { + InitAsStandalone(); + InitializeDeadlySignals(); +} + +} // namespace __ubsan + __attribute__((section(".preinit_array"), used)) void (*__local_ubsan_preinit)( - void) = __ubsan::InitAsStandalone; + void) = __ubsan::PreInitAsStandalone; #endif // SANITIZER_CAN_USE_PREINIT_ARRAY diff --git a/compiler-rt/lib/ubsan/ubsan_signals_standalone.cc b/compiler-rt/lib/ubsan/ubsan_signals_standalone.cc new file mode 100644 index 00000000000..37485726986 --- /dev/null +++ b/compiler-rt/lib/ubsan/ubsan_signals_standalone.cc @@ -0,0 +1,50 @@ +//=-- ubsan_signals_standalone.cc +//------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Installs signal handlers and related interceptors for UBSan standalone. +// +//===----------------------------------------------------------------------===// + +#include "ubsan_platform.h" +#if CAN_SANITIZE_UB +#include "interception/interception.h" +#include "sanitizer_common/sanitizer_stacktrace.h" +#include "ubsan_diag.h" +#include "ubsan_init.h" + +#define COMMON_INTERCEPT_FUNCTION(name) INTERCEPT_FUNCTION(name) +#include "sanitizer_common/sanitizer_signal_interceptors.inc" + +namespace __ubsan { + +static void OnStackUnwind(const SignalContext &sig, const void *, + BufferedStackTrace *stack) { + GetStackTraceWithPcBpAndContext(stack, kStackTraceMax, sig.pc, sig.bp, + sig.context, + common_flags()->fast_unwind_on_fatal); +} + +static void UBsanOnDeadlySignal(int signo, void *siginfo, void *context) { + HandleDeadlySignal(siginfo, context, GetTid(), &OnStackUnwind, nullptr); +} + +static bool is_initialized = false; + +void InitializeDeadlySignals() { + if (is_initialized) + return; + is_initialized = true; + InitializeSignalInterceptors(); + InstallDeadlySignalHandlers(&UBsanOnDeadlySignal); +} + +} // namespace __ubsan + +#endif // CAN_SANITIZE_UB diff --git a/compiler-rt/lib/ubsan/ubsan_signals_standalone.h b/compiler-rt/lib/ubsan/ubsan_signals_standalone.h new file mode 100644 index 00000000000..b29c29482ec --- /dev/null +++ b/compiler-rt/lib/ubsan/ubsan_signals_standalone.h @@ -0,0 +1,25 @@ +//=-- ubsan_signals_standalone.h +//------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Installs signal handlers and related interceptors for UBSan standalone. +// +//===----------------------------------------------------------------------===// + +#ifndef UBSAN_SIGNALS_STANDALONE_H +#define UBSAN_SIGNALS_STANDALONE_H + +namespace __ubsan { + +// Initializes signal handlers and interceptors. +void InitializeDeadlySignals(); + +} // namespace __ubsan + +#endif // UBSAN_SIGNALS_STANDALONE_H diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cc b/compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cc index 7f0a190277b..20140792318 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cc +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cc @@ -20,7 +20,6 @@ // Remove when fixed: https://github.com/google/sanitizers/issues/637 // XFAIL: msan // XFAIL: tsan -// XFAIL: ubsan #include <signal.h> #include <stdio.h> diff --git a/compiler-rt/test/sanitizer_common/TestCases/Posix/dedup_token_length_test.cc b/compiler-rt/test/sanitizer_common/TestCases/Posix/dedup_token_length_test.cc index 86ad40bcbff..7e93af46d1d 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Posix/dedup_token_length_test.cc +++ b/compiler-rt/test/sanitizer_common/TestCases/Posix/dedup_token_length_test.cc @@ -7,10 +7,9 @@ // RUN: env %tool_options='abort_on_error=0, dedup_token_length=3' not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK3 --match-full-lines // REQUIRES: stable-runtime -// FIXME: implement SEGV handler in other sanitizers, not just asan. +// FIXME: implement SEGV handler in other sanitizers. // XFAIL: msan // XFAIL: tsan -// XFAIL: ubsan volatile int *null = 0; diff --git a/compiler-rt/test/sanitizer_common/TestCases/Posix/dump_instruction_bytes.cc b/compiler-rt/test/sanitizer_common/TestCases/Posix/dump_instruction_bytes.cc index 4cb075807a2..25e801a104a 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Posix/dump_instruction_bytes.cc +++ b/compiler-rt/test/sanitizer_common/TestCases/Posix/dump_instruction_bytes.cc @@ -11,7 +11,6 @@ // FIXME: implement in other sanitizers. // XFAIL: msan // XFAIL: tsan -// XFAIL: ubsan int main() { #if defined(__x86_64__) diff --git a/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cc b/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cc index cdccf97bdfa..416944fa6d1 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cc +++ b/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cc @@ -9,7 +9,6 @@ // FIXME: implement SEGV handler in other sanitizers, not just asan. // XFAIL: msan // XFAIL: tsan -// XFAIL: ubsan #include <sanitizer/common_interface_defs.h> #include <stdio.h> |