Loading compiler-rt/lib/interception/interception_linux.cc +7 −2 Original line number Diff line number Diff line Loading @@ -33,7 +33,7 @@ static int StrCmp(const char *s1, const char *s2) { } #endif static void *GetFuncAddr(const char *name) { static void *GetFuncAddr(const char *name, uptr wrapper_addr) { #if SANITIZER_NETBSD // FIXME: Find a better way to handle renames if (StrCmp(name, "sigaction")) Loading @@ -47,13 +47,18 @@ static void *GetFuncAddr(const char *name) { // want the address of the real definition, though, so look it up using // RTLD_DEFAULT. addr = dlsym(RTLD_DEFAULT, name); // In case `name' is not loaded, dlsym ends up finding the actual wrapper. // We don't want to intercept the wrapper and have it point to itself. if ((uptr)addr == wrapper_addr) addr = nullptr; } return addr; } bool InterceptFunction(const char *name, uptr *ptr_to_real, uptr func, uptr wrapper) { void *addr = GetFuncAddr(name); void *addr = GetFuncAddr(name, wrapper); *ptr_to_real = (uptr)addr; return addr && (func == wrapper); } Loading compiler-rt/test/asan/TestCases/Linux/dlopen-mixed-c-cxx.c 0 → 100644 +42 −0 Original line number Diff line number Diff line // RUN: %clangxx_asan -xc++ -shared -fPIC -o %t.so - < %s // RUN: %clang_asan %s -o %t.out -ldl // RUN: ASAN_OPTIONS=verbosity=1 not %t.out %t.so 2>&1 | FileCheck %s // // CHECK: AddressSanitizer: failed to intercept '__cxa_throw' // // dlopen() can not be intercepted on Android // UNSUPPORTED: android #ifdef __cplusplus static void foo(void) { int i = 0; throw(i); } extern "C" { int bar(void); }; int bar(void) { try { foo(); } catch (int i) { return i; } return -1; } #else #include <assert.h> #include <dlfcn.h> int main(int argc, char **argv) { int (*bar)(void); void *handle = dlopen(argv[1], RTLD_LAZY); assert(handle); bar = dlsym(handle, "bar"); assert(bar); return bar(); } #endif Loading
compiler-rt/lib/interception/interception_linux.cc +7 −2 Original line number Diff line number Diff line Loading @@ -33,7 +33,7 @@ static int StrCmp(const char *s1, const char *s2) { } #endif static void *GetFuncAddr(const char *name) { static void *GetFuncAddr(const char *name, uptr wrapper_addr) { #if SANITIZER_NETBSD // FIXME: Find a better way to handle renames if (StrCmp(name, "sigaction")) Loading @@ -47,13 +47,18 @@ static void *GetFuncAddr(const char *name) { // want the address of the real definition, though, so look it up using // RTLD_DEFAULT. addr = dlsym(RTLD_DEFAULT, name); // In case `name' is not loaded, dlsym ends up finding the actual wrapper. // We don't want to intercept the wrapper and have it point to itself. if ((uptr)addr == wrapper_addr) addr = nullptr; } return addr; } bool InterceptFunction(const char *name, uptr *ptr_to_real, uptr func, uptr wrapper) { void *addr = GetFuncAddr(name); void *addr = GetFuncAddr(name, wrapper); *ptr_to_real = (uptr)addr; return addr && (func == wrapper); } Loading
compiler-rt/test/asan/TestCases/Linux/dlopen-mixed-c-cxx.c 0 → 100644 +42 −0 Original line number Diff line number Diff line // RUN: %clangxx_asan -xc++ -shared -fPIC -o %t.so - < %s // RUN: %clang_asan %s -o %t.out -ldl // RUN: ASAN_OPTIONS=verbosity=1 not %t.out %t.so 2>&1 | FileCheck %s // // CHECK: AddressSanitizer: failed to intercept '__cxa_throw' // // dlopen() can not be intercepted on Android // UNSUPPORTED: android #ifdef __cplusplus static void foo(void) { int i = 0; throw(i); } extern "C" { int bar(void); }; int bar(void) { try { foo(); } catch (int i) { return i; } return -1; } #else #include <assert.h> #include <dlfcn.h> int main(int argc, char **argv) { int (*bar)(void); void *handle = dlopen(argv[1], RTLD_LAZY); assert(handle); bar = dlsym(handle, "bar"); assert(bar); return bar(); } #endif