sanitizer_common: Try looking up symbols with RTLD_DEFAULT if RTLD_NEXT 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
This commit is contained in:
Peter Collingbourne 2017-11-10 22:09:37 +00:00
parent ada45dfde7
commit 0f43b92980
4 changed files with 33 additions and 0 deletions

View File

@ -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;
}

View File

@ -0,0 +1,3 @@
int dso_function(int i) {
return i + 1;
}

View File

@ -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);
}

View File

@ -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']