Skip to content

Commit

Permalink
sanitizer_common: Try looking up symbols with RTLD_DEFAULT if RTLD_NE…
Browse files Browse the repository at this point in the history
…XT does not work.

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.

Differential Revision: https://reviews.llvm.org/D39779

llvm-svn: 317930
  • Loading branch information
pcc committed Nov 10, 2017
1 parent ada45df commit 0f43b92
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 0 deletions.
8 changes: 8 additions & 0 deletions compiler-rt/lib/interception/interception_linux.cc
Expand Up @@ -29,6 +29,14 @@ bool GetRealFunctionAddress(const char *func_name, uptr *func_addr,
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;
}

Expand Down
@@ -0,0 +1,3 @@
int dso_function(int i) {
return i + 1;
}
20 changes: 20 additions & 0 deletions 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);
}
2 changes: 2 additions & 0 deletions compiler-rt/test/ubsan/lit.common.cfg
Expand Up @@ -74,3 +74,5 @@ if config.host_os not in ['Linux', 'Darwin', 'FreeBSD', 'Windows', 'NetBSD']:
config.unsupported = True

config.available_features.add('arch=' + config.target_arch)

config.excludes = ['Inputs']

0 comments on commit 0f43b92

Please sign in to comment.