From b0fdbadf9f099e42bd2185ed32211b2d73cb2f58 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Wed, 1 Sep 2021 11:11:45 -0700 Subject: [PATCH] [ubsan] warn inside the sigaction interceptor if static linking is suspected, and continue instead of crashing on null deref [ubsan] warn inside the sigaction interceptor if static linking is suspected, and continue instead of crashing on null deref Reviewed By: kostik Differential Revision: https://reviews.llvm.org/D109081 --- .../lib/sanitizer_common/sanitizer_signal_interceptors.inc | 12 ++++++++++-- compiler-rt/test/ubsan/TestCases/Misc/Linux/static-link.cpp | 13 +++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 compiler-rt/test/ubsan/TestCases/Misc/Linux/static-link.cpp diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_signal_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_signal_interceptors.inc index cefb870..475e577 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_signal_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_signal_interceptors.inc @@ -29,8 +29,16 @@ using namespace __sanitizer; #endif #ifndef SIGNAL_INTERCEPTOR_SIGACTION_IMPL -#define SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact) \ - { return REAL(sigaction_symname)(signum, act, oldact); } +# define SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact) \ + { \ + if (!REAL(sigaction_symname)) { \ + Printf( \ + "Warning: REAL(sigaction_symname) == nullptr. This may happen " \ + "if you link with ubsan statically. Sigaction will not work.\n"); \ + return -1; \ + } \ + return REAL(sigaction_symname)(signum, act, oldact); \ + } #endif #if SANITIZER_INTERCEPT_BSD_SIGNAL diff --git a/compiler-rt/test/ubsan/TestCases/Misc/Linux/static-link.cpp b/compiler-rt/test/ubsan/TestCases/Misc/Linux/static-link.cpp new file mode 100644 index 0000000..6c6b421 --- /dev/null +++ b/compiler-rt/test/ubsan/TestCases/Misc/Linux/static-link.cpp @@ -0,0 +1,13 @@ +// REQUIRES: ubsan-standalone +// REQUIRES: arch=x86_64 +// RUN: %clangxx -fsanitize=bool -static %s -o %t && UBSAN_OPTIONS=handle_segv=0:handle_sigbus=0:handle_sigfpe=0 %run %t 2>&1 | FileCheck %s +#include +#include + +int main() { + struct sigaction old_action; + sigaction(SIGINT, nullptr, &old_action); + // CHECK: Warning: REAL(sigaction_symname) == nullptr. + printf("PASS\n"); + // CHECK: PASS +} -- 2.7.4