xref: /llvm-project/compiler-rt/test/tsan/Linux/sethostent.cpp (revision c7081b5b4cb57f27e6a075e1b5a63b7951cd8a7a)
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 
__sanitizer_malloc_hook(void * ptr,size_t size)13 extern "C" void __sanitizer_malloc_hook(void *ptr, size_t size) {
14   __atomic_fetch_add(&X, 1, __ATOMIC_RELAXED);
15 }
16 
__sanitizer_free_hook(void * ptr)17 extern "C" void __sanitizer_free_hook(void *ptr) {
18   __atomic_fetch_sub(&X, 1, __ATOMIC_RELAXED);
19 }
20 
Thread(void * x)21 void *Thread(void *x) {
22   sethostent(1);
23   gethostbyname("llvm.org");
24   gethostent();
25   endhostent();
26   return NULL;
27 }
28 
main()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