[ubsan] warn inside the sigaction interceptor if static linking is suspected, and...
authorKostya Serebryany <kcc@google.com>
Wed, 1 Sep 2021 18:11:45 +0000 (11:11 -0700)
committerKostya Serebryany <kcc@google.com>
Wed, 1 Sep 2021 19:36:48 +0000 (12:36 -0700)
[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

compiler-rt/lib/sanitizer_common/sanitizer_signal_interceptors.inc
compiler-rt/test/ubsan/TestCases/Misc/Linux/static-link.cpp [new file with mode: 0644]

index cefb870..475e577 100644 (file)
@@ -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 (file)
index 0000000..6c6b421
--- /dev/null
@@ -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 <signal.h>
+#include <stdio.h>
+
+int main() {
+  struct sigaction old_action;
+  sigaction(SIGINT, nullptr, &old_action);
+  // CHECK: Warning: REAL(sigaction_symname) == nullptr.
+  printf("PASS\n");
+  // CHECK: PASS
+}