[PATCH] D39779: sanitizer_common: Try looking up symbols with RTLD_DEFAULT if RTLD_NEXT does not work.

Peter Collingbourne via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 8 16:30:08 PST 2017


pcc updated this revision to Diff 122179.
pcc added a comment.

- Fix test case


https://reviews.llvm.org/D39779

Files:
  compiler-rt/lib/interception/interception_linux.cc
  compiler-rt/test/ubsan/TestCases/Misc/Inputs/no-interception-dso.c
  compiler-rt/test/ubsan/TestCases/Misc/no-interception.cpp
  compiler-rt/test/ubsan/lit.common.cfg


Index: compiler-rt/test/ubsan/lit.common.cfg
===================================================================
--- compiler-rt/test/ubsan/lit.common.cfg
+++ compiler-rt/test/ubsan/lit.common.cfg
@@ -74,3 +74,5 @@
   config.unsupported = True
 
 config.available_features.add('arch=' + config.target_arch)
+
+config.excludes = ['Inputs']
Index: compiler-rt/test/ubsan/TestCases/Misc/no-interception.cpp
===================================================================
--- /dev/null
+++ compiler-rt/test/ubsan/TestCases/Misc/no-interception.cpp
@@ -0,0 +1,20 @@
+// REQUIRES: android
+
+// Tests that ubsan can detect errors on Android if libc appears before the
+// runtime in the library search order, which means that we cannot intercept
+// symbols.
+
+// RUN: %clangxx %p/Inputs/no-interception-dso.c -fsanitize=undefined -fPIC -shared -o %dynamiclib %ld_flags_rpath_so
+
+// Make sure that libc is first in DT_NEEDED.
+// RUN: %clangxx %s -lc -o %t %ld_flags_rpath_exe
+// RUN: %run %t 2>&1 | FileCheck %s
+
+#include <limits.h>
+
+int dso_function(int);
+
+int main(int argc, char **argv) {
+  // CHECK: signed integer overflow
+  dso_function(INT_MAX);
+}
Index: compiler-rt/test/ubsan/TestCases/Misc/Inputs/no-interception-dso.c
===================================================================
--- /dev/null
+++ compiler-rt/test/ubsan/TestCases/Misc/Inputs/no-interception-dso.c
@@ -0,0 +1,3 @@
+int dso_function(int i) {
+  return i + 1;
+}
Index: compiler-rt/lib/interception/interception_linux.cc
===================================================================
--- compiler-rt/lib/interception/interception_linux.cc
+++ compiler-rt/lib/interception/interception_linux.cc
@@ -29,6 +29,14 @@
   if (internal_strcmp(func_name, "sigaction") == 0) func_name = "__sigaction14";
 #endif
   *func_addr = (uptr)dlsym(RTLD_NEXT, func_name);
+  if (!*func_addr) {
+    // If the lookup using RTLD_NEXT failed, the sanitizer runtime library is
+    // later in the library search order than the DSO that we are trying to
+    // intercept, which means that we cannot intercept this function. We still
+    // want the address of the real definition, though, so look it up using
+    // RTLD_DEFAULT.
+    *func_addr = (uptr)dlsym(RTLD_DEFAULT, func_name);
+  }
   return real == wrapper;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39779.122179.patch
Type: text/x-patch
Size: 2303 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171109/d710d908/attachment.bin>


More information about the llvm-commits mailing list