1 // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 2 3 // Use of gethostent provokes caching of some resources inside of libc. 4 // They are freed in __libc_thread_freeres very late in thread lifetime, 5 // after our ThreadFinish. __libc_thread_freeres calls free which 6 // previously crashed in malloc hooks. 7 8 #include "../test.h" 9 #include <netdb.h> 10 11 long X; 12 13 extern "C" void __sanitizer_malloc_hook(void *ptr, size_t size) { 14 __atomic_fetch_add(&X, 1, __ATOMIC_RELAXED); 15 } 16 17 extern "C" void __sanitizer_free_hook(void *ptr) { 18 __atomic_fetch_sub(&X, 1, __ATOMIC_RELAXED); 19 } 20 21 void *Thread(void *x) { 22 sethostent(1); 23 gethostbyname("llvm.org"); 24 gethostent(); 25 endhostent(); 26 return NULL; 27 } 28 29 int main() { 30 pthread_t th; 31 pthread_create(&th, NULL, Thread, NULL); 32 pthread_join(th, NULL); 33 fprintf(stderr, "DONE\n"); 34 return 0; 35 } 36 37 // CHECK: DONE 38