38 lines · cpp
1// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s2 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 which6// previously crashed in malloc hooks.7 8#include "../test.h"9#include <netdb.h>10 11long X;12 13extern "C" void __sanitizer_malloc_hook(void *ptr, size_t size) {14 __atomic_fetch_add(&X, 1, __ATOMIC_RELAXED);15}16 17extern "C" void __sanitizer_free_hook(void *ptr) {18 __atomic_fetch_sub(&X, 1, __ATOMIC_RELAXED);19}20 21void *Thread(void *x) {22 sethostent(1);23 gethostbyname("llvm.org");24 gethostent();25 endhostent();26 return NULL;27}28 29int 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: DONE38