1*673dc3d4SNico Weber // FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316 2*673dc3d4SNico Weber // XFAIL: android 3*673dc3d4SNico Weber // 4*673dc3d4SNico Weber // RUN: rm -rf %t-dir 5*673dc3d4SNico Weber // RUN: mkdir -p %t-dir 6*673dc3d4SNico Weber // RUN: %clangxx_asan -DSHARED %s -shared -o %t-dir/stack_trace_dlclose.so -fPIC 7*673dc3d4SNico Weber // RUN: %clangxx_asan -DSO_DIR=\"%t-dir\" %s %libdl -o %t 8*673dc3d4SNico Weber // RUN: %env_asan_opts=exitcode=0 %run %t 2>&1 | FileCheck %s 9*673dc3d4SNico Weber // REQUIRES: stable-runtime 10*673dc3d4SNico Weber 11*673dc3d4SNico Weber #include <assert.h> 12*673dc3d4SNico Weber #include <dlfcn.h> 13*673dc3d4SNico Weber #include <stdlib.h> 14*673dc3d4SNico Weber #include <stdio.h> 15*673dc3d4SNico Weber #include <unistd.h> 16*673dc3d4SNico Weber 17*673dc3d4SNico Weber #include <sanitizer/common_interface_defs.h> 18*673dc3d4SNico Weber 19*673dc3d4SNico Weber #ifdef SHARED 20*673dc3d4SNico Weber extern "C" { foo()21*673dc3d4SNico Webervoid *foo() { 22*673dc3d4SNico Weber return malloc(1); 23*673dc3d4SNico Weber } 24*673dc3d4SNico Weber } 25*673dc3d4SNico Weber #else 26*673dc3d4SNico Weber void *handle; 27*673dc3d4SNico Weber main(int argc,char ** argv)28*673dc3d4SNico Weberint main(int argc, char **argv) { 29*673dc3d4SNico Weber void *handle = dlopen(SO_DIR "/stack_trace_dlclose.so", RTLD_LAZY); 30*673dc3d4SNico Weber assert(handle); 31*673dc3d4SNico Weber void *(*foo)() = (void *(*)())dlsym(handle, "foo"); 32*673dc3d4SNico Weber assert(foo); 33*673dc3d4SNico Weber void *p = foo(); 34*673dc3d4SNico Weber assert(p); 35*673dc3d4SNico Weber dlclose(handle); 36*673dc3d4SNico Weber 37*673dc3d4SNico Weber free(p); 38*673dc3d4SNico Weber free(p); // double-free 39*673dc3d4SNico Weber 40*673dc3d4SNico Weber return 0; 41*673dc3d4SNico Weber } 42*673dc3d4SNico Weber #endif 43*673dc3d4SNico Weber 44*673dc3d4SNico Weber // CHECK: {{ #0 0x.* in (__interceptor_)?malloc}} 45*673dc3d4SNico Weber // CHECK: {{ #1 0x.* \(<unknown module>\)}} 46*673dc3d4SNico Weber // CHECK: {{ #2 0x.* in main}} 47