Skip to content

Commit b1af5f1

Browse files
committed
[TSan] Make more TSan interceptors symbolizer-aware.
Summary: Switching the rest of intercepted allocs to InternalAlloc (well, except __libc_memalign) when current thread is 'in_symbolizer'. Symbolizer might (and does) use allocation functions other than malloc/calloc/realloc. posix_memalign is the one actually used, others switched just in case (since the failure is obscure and not obvious to diagnose). Reviewers: dvyukov Subscribers: llvm-commits, kubamracek Differential Revision: https://reviews.llvm.org/D40877 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@319929 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 230e720 commit b1af5f1

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

lib/tsan/rtl/tsan_interceptors.cc

+25-9
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ static int setup_at_exit_wrapper(ThreadState *thr, uptr pc, void(*f)(),
392392

393393
#if !SANITIZER_ANDROID
394394
TSAN_INTERCEPTOR(int, atexit, void (*f)()) {
395-
if (cur_thread()->in_symbolizer)
395+
if (UNLIKELY(cur_thread()->in_symbolizer))
396396
return 0;
397397
// We want to setup the atexit callback even if we are in ignored lib
398398
// or after fork.
@@ -402,7 +402,7 @@ TSAN_INTERCEPTOR(int, atexit, void (*f)()) {
402402
#endif
403403

404404
TSAN_INTERCEPTOR(int, __cxa_atexit, void (*f)(void *a), void *arg, void *dso) {
405-
if (cur_thread()->in_symbolizer)
405+
if (UNLIKELY(cur_thread()->in_symbolizer))
406406
return 0;
407407
SCOPED_TSAN_INTERCEPTOR(__cxa_atexit, f, arg, dso);
408408
return setup_at_exit_wrapper(thr, pc, (void(*)())f, arg, dso);
@@ -448,7 +448,7 @@ static void on_exit_wrapper(int status, void *arg) {
448448
}
449449

450450
TSAN_INTERCEPTOR(int, on_exit, void(*f)(int, void*), void *arg) {
451-
if (cur_thread()->in_symbolizer)
451+
if (UNLIKELY(cur_thread()->in_symbolizer))
452452
return 0;
453453
SCOPED_TSAN_INTERCEPTOR(on_exit, f, arg);
454454
AtExitCtx *ctx = (AtExitCtx*)InternalAlloc(sizeof(AtExitCtx));
@@ -659,7 +659,7 @@ TSAN_INTERCEPTOR(void, _longjmp, uptr *env, int val) {
659659

660660
#if !SANITIZER_MAC
661661
TSAN_INTERCEPTOR(void*, malloc, uptr size) {
662-
if (cur_thread()->in_symbolizer)
662+
if (UNLIKELY(cur_thread()->in_symbolizer))
663663
return InternalAlloc(size);
664664
void *p = 0;
665665
{
@@ -676,7 +676,7 @@ TSAN_INTERCEPTOR(void*, __libc_memalign, uptr align, uptr sz) {
676676
}
677677

678678
TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) {
679-
if (cur_thread()->in_symbolizer)
679+
if (UNLIKELY(cur_thread()->in_symbolizer))
680680
return InternalCalloc(size, n);
681681
void *p = 0;
682682
{
@@ -688,7 +688,7 @@ TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) {
688688
}
689689

690690
TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) {
691-
if (cur_thread()->in_symbolizer)
691+
if (UNLIKELY(cur_thread()->in_symbolizer))
692692
return InternalRealloc(p, size);
693693
if (p)
694694
invoke_free_hook(p);
@@ -703,7 +703,7 @@ TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) {
703703
TSAN_INTERCEPTOR(void, free, void *p) {
704704
if (p == 0)
705705
return;
706-
if (cur_thread()->in_symbolizer)
706+
if (UNLIKELY(cur_thread()->in_symbolizer))
707707
return InternalFree(p);
708708
invoke_free_hook(p);
709709
SCOPED_INTERCEPTOR_RAW(free, p);
@@ -713,7 +713,7 @@ TSAN_INTERCEPTOR(void, free, void *p) {
713713
TSAN_INTERCEPTOR(void, cfree, void *p) {
714714
if (p == 0)
715715
return;
716-
if (cur_thread()->in_symbolizer)
716+
if (UNLIKELY(cur_thread()->in_symbolizer))
717717
return InternalFree(p);
718718
invoke_free_hook(p);
719719
SCOPED_INTERCEPTOR_RAW(cfree, p);
@@ -827,18 +827,27 @@ TSAN_INTERCEPTOR(void*, memalign, uptr align, uptr sz) {
827827

828828
#if !SANITIZER_MAC
829829
TSAN_INTERCEPTOR(void*, aligned_alloc, uptr align, uptr sz) {
830+
if (UNLIKELY(cur_thread()->in_symbolizer))
831+
return InternalAlloc(sz, nullptr, align);
830832
SCOPED_INTERCEPTOR_RAW(aligned_alloc, align, sz);
831833
return user_aligned_alloc(thr, pc, align, sz);
832834
}
833835

834836
TSAN_INTERCEPTOR(void*, valloc, uptr sz) {
837+
if (UNLIKELY(cur_thread()->in_symbolizer))
838+
return InternalAlloc(sz, nullptr, GetPageSizeCached());
835839
SCOPED_INTERCEPTOR_RAW(valloc, sz);
836840
return user_valloc(thr, pc, sz);
837841
}
838842
#endif
839843

840844
#if SANITIZER_LINUX
841845
TSAN_INTERCEPTOR(void*, pvalloc, uptr sz) {
846+
if (UNLIKELY(cur_thread()->in_symbolizer)) {
847+
uptr PageSize = GetPageSizeCached();
848+
sz = sz ? RoundUpTo(sz, PageSize) : PageSize;
849+
return InternalAlloc(sz, nullptr, PageSize);
850+
}
842851
SCOPED_INTERCEPTOR_RAW(pvalloc, sz);
843852
return user_pvalloc(thr, pc, sz);
844853
}
@@ -849,6 +858,13 @@ TSAN_INTERCEPTOR(void*, pvalloc, uptr sz) {
849858

850859
#if !SANITIZER_MAC
851860
TSAN_INTERCEPTOR(int, posix_memalign, void **memptr, uptr align, uptr sz) {
861+
if (UNLIKELY(cur_thread()->in_symbolizer)) {
862+
void *p = InternalAlloc(sz, nullptr, align);
863+
if (!p)
864+
return errno_ENOMEM;
865+
*memptr = p;
866+
return 0;
867+
}
852868
SCOPED_INTERCEPTOR_RAW(posix_memalign, memptr, align, sz);
853869
return user_posix_memalign(thr, pc, memptr, align, sz);
854870
}
@@ -2069,7 +2085,7 @@ TSAN_INTERCEPTOR(int, getaddrinfo, void *node, void *service,
20692085
}
20702086

20712087
TSAN_INTERCEPTOR(int, fork, int fake) {
2072-
if (cur_thread()->in_symbolizer)
2088+
if (UNLIKELY(cur_thread()->in_symbolizer))
20732089
return REAL(fork)(fake);
20742090
SCOPED_INTERCEPTOR_RAW(fork, fake);
20752091
ForkBefore(thr, pc);

0 commit comments

Comments
 (0)