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
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(name: "llvm.org");
24 gethostent();
25 endhostent();
26 return NULL;
27}
28
29int main() {
30 pthread_t th;
31 pthread_create(newthread: &th, NULL, start_routine: Thread, NULL);
32 pthread_join(th: th, NULL);
33 fprintf(stderr, format: "DONE\n");
34 return 0;
35}
36
37// CHECK: DONE
38

source code of compiler-rt/test/tsan/Linux/sethostent.cpp