From 166fb733c909fb85713ba2e5f6a1d0d244b9ff82 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Mon, 16 Sep 2024 20:52:15 -0700 Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.4 [skip ci] --- compiler-rt/lib/asan/asan_rtl.cpp | 3 - compiler-rt/lib/dfsan/dfsan.cpp | 2 + compiler-rt/lib/hwasan/hwasan.cpp | 4 +- compiler-rt/lib/lsan/lsan.cpp | 2 +- compiler-rt/lib/memprof/memprof_rtl.cpp | 3 - compiler-rt/lib/msan/msan.cpp | 3 +- .../sanitizer_common_nolibc.cpp | 1 + .../sanitizer_common/sanitizer_fuchsia.cpp | 1 - .../lib/sanitizer_common/sanitizer_linux.cpp | 4 +- .../sanitizer_linux_libcdep.cpp | 171 ++++++++++-------- .../lib/sanitizer_common/sanitizer_mac.cpp | 3 - .../lib/sanitizer_common/sanitizer_win.cpp | 3 - .../lib/tsan/rtl/tsan_interceptors_posix.cpp | 56 +++--- .../lib/tsan/rtl/tsan_platform_linux.cpp | 1 - compiler-rt/lib/ubsan/ubsan_init.cpp | 2 +- .../sanitizer_common/TestCases/dlsym_alloc.c | 2 - 16 files changed, 136 insertions(+), 125 deletions(-) diff --git a/compiler-rt/lib/asan/asan_rtl.cpp b/compiler-rt/lib/asan/asan_rtl.cpp index a390802af28d0..19c6c210b564c 100644 --- a/compiler-rt/lib/asan/asan_rtl.cpp +++ b/compiler-rt/lib/asan/asan_rtl.cpp @@ -478,9 +478,6 @@ static bool AsanInitInternal() { if (flags()->start_deactivated) AsanDeactivate(); - // interceptors - InitTlsSize(); - // Create main thread. AsanThread *main_thread = CreateMainThread(); CHECK_EQ(0, main_thread->tid()); diff --git a/compiler-rt/lib/dfsan/dfsan.cpp b/compiler-rt/lib/dfsan/dfsan.cpp index 1972a07d15ac5..886e93e5fa813 100644 --- a/compiler-rt/lib/dfsan/dfsan.cpp +++ b/compiler-rt/lib/dfsan/dfsan.cpp @@ -1262,6 +1262,8 @@ static void DFsanInit(int argc, char **argv, char **envp) { CheckASLR(); + InitializePlatformEarly(); + if (!InitShadowWithReExec(dfsan_get_track_origins())) { Printf("FATAL: DataflowSanitizer can not mmap the shadow memory.\n"); DumpProcessMap(); diff --git a/compiler-rt/lib/hwasan/hwasan.cpp b/compiler-rt/lib/hwasan/hwasan.cpp index ccdc0b4bc21bd..24384d8b4d2cf 100644 --- a/compiler-rt/lib/hwasan/hwasan.cpp +++ b/compiler-rt/lib/hwasan/hwasan.cpp @@ -357,8 +357,6 @@ __attribute__((constructor(0))) void __hwasan_init() { hwasan_init_is_running = 1; SanitizerToolName = "HWAddressSanitizer"; - InitTlsSize(); - CacheBinaryName(); InitializeFlags(); @@ -367,6 +365,8 @@ __attribute__((constructor(0))) void __hwasan_init() { __sanitizer_set_report_path(common_flags()->log_path); + InitializePlatformEarly(); + AndroidTestTlsSlot(); DisableCoreDumperIfNecessary(); diff --git a/compiler-rt/lib/lsan/lsan.cpp b/compiler-rt/lib/lsan/lsan.cpp index 7a27b600f203f..798294b499e2f 100644 --- a/compiler-rt/lib/lsan/lsan.cpp +++ b/compiler-rt/lib/lsan/lsan.cpp @@ -92,10 +92,10 @@ extern "C" void __lsan_init() { CacheBinaryName(); AvoidCVE_2016_2143(); InitializeFlags(); + InitializePlatformEarly(); InitCommonLsan(); InitializeAllocator(); ReplaceSystemMalloc(); - InitTlsSize(); InitializeInterceptors(); InitializeThreads(); InstallDeadlySignalHandlers(LsanOnDeadlySignal); diff --git a/compiler-rt/lib/memprof/memprof_rtl.cpp b/compiler-rt/lib/memprof/memprof_rtl.cpp index cf4bde808bfad..2cc6c2df5a6fe 100644 --- a/compiler-rt/lib/memprof/memprof_rtl.cpp +++ b/compiler-rt/lib/memprof/memprof_rtl.cpp @@ -213,9 +213,6 @@ static void MemprofInitInternal() { InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); - // interceptors - InitTlsSize(); - // Create main thread. MemprofThread *main_thread = CreateMainThread(); CHECK_EQ(0, main_thread->tid()); diff --git a/compiler-rt/lib/msan/msan.cpp b/compiler-rt/lib/msan/msan.cpp index 2ee05f43ec5e5..6c27ab21eeebf 100644 --- a/compiler-rt/lib/msan/msan.cpp +++ b/compiler-rt/lib/msan/msan.cpp @@ -457,10 +457,11 @@ void __msan_init() { __sanitizer_set_report_path(common_flags()->log_path); + InitializePlatformEarly(); + InitializeInterceptors(); InstallAtForkHandler(); CheckASLR(); - InitTlsSize(); InstallDeadlySignalHandlers(MsanOnDeadlySignal); InstallAtExitHandler(); // Needs __cxa_atexit interceptor. diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_nolibc.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_common_nolibc.cpp index 7d88575160c6c..e49285f22dff9 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_nolibc.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_nolibc.cpp @@ -22,6 +22,7 @@ namespace __sanitizer { #if !SANITIZER_WINDOWS # if SANITIZER_LINUX void LogMessageOnPrintf(const char *str) {} +void InitTlsSize() {} # endif void WriteToSyslog(const char *buffer) {} void Abort() { internal__exit(1); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp index a67b2a8725eca..75dcf546729f6 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp @@ -94,7 +94,6 @@ void DisableCoreDumperIfNecessary() {} void InstallDeadlySignalHandlers(SignalHandlerType handler) {} void SetAlternateSignalStack() {} void UnsetAlternateSignalStack() {} -void InitTlsSize() {} bool SignalContext::IsStackOverflow() const { return false; } void SignalContext::DumpAllRegisters(void *context) { UNIMPLEMENTED(); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp index 6359f4348e3c4..1c637d109649b 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp @@ -2672,9 +2672,7 @@ static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) { void SignalContext::InitPcSpBp() { GetPcSpBp(context, &pc, &sp, &bp); } -void InitializePlatformEarly() { - // Do nothing. -} +void InitializePlatformEarly() { InitTlsSize(); } void CheckASLR() { # if SANITIZER_NETBSD diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index a510129190443..6b43fea507a40 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -200,21 +200,6 @@ bool SetEnv(const char *name, const char *value) { } # endif -__attribute__((unused)) static bool GetLibcVersion(int *major, int *minor, - int *patch) { -# if SANITIZER_GLIBC - const char *p = gnu_get_libc_version(); - *major = internal_simple_strtoll(p, &p, 10); - // Caller does not expect anything else. - CHECK_EQ(*major, 2); - *minor = (*p == '.') ? internal_simple_strtoll(p + 1, &p, 10) : 0; - *patch = (*p == '.') ? internal_simple_strtoll(p + 1, &p, 10) : 0; - return true; -# else - return false; -# endif -} - // True if we can use dlpi_tls_data. glibc before 2.25 may leave NULL (BZ // #19826) so dlpi_tls_data cannot be used. // @@ -224,93 +209,98 @@ __attribute__((unused)) static bool GetLibcVersion(int *major, int *minor, __attribute__((unused)) static int g_use_dlpi_tls_data; # if SANITIZER_GLIBC && !SANITIZER_GO -__attribute__((unused)) static size_t g_tls_size; -void InitTlsSize() { - int major, minor, patch; - g_use_dlpi_tls_data = - GetLibcVersion(&major, &minor, &patch) && major == 2 && minor >= 25; - -# if defined(__aarch64__) || defined(__x86_64__) || \ - defined(__powerpc64__) || defined(__loongarch__) - void *get_tls_static_info = dlsym(RTLD_DEFAULT, "_dl_get_tls_static_info"); - size_t tls_align; - ((void (*)(size_t *, size_t *))get_tls_static_info)(&g_tls_size, &tls_align); -# endif +static void GetGLibcVersion(int *major, int *minor, int *patch) { + const char *p = gnu_get_libc_version(); + *major = internal_simple_strtoll(p, &p, 10); + // Caller does not expect anything else. + CHECK_EQ(*major, 2); + *minor = (*p == '.') ? internal_simple_strtoll(p + 1, &p, 10) : 0; + *patch = (*p == '.') ? internal_simple_strtoll(p + 1, &p, 10) : 0; } -# else -void InitTlsSize() {} # endif // SANITIZER_GLIBC && !SANITIZER_GO // On glibc x86_64, ThreadDescriptorSize() needs to be precise due to the usage // of g_tls_size. On other targets, ThreadDescriptorSize() is only used by lsan // to get the pointer to thread-specific data keys in the thread control block. -# if (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_SOLARIS) && \ - !SANITIZER_ANDROID && !SANITIZER_GO +# if (SANITIZER_FREEBSD || SANITIZER_GLIBC) && !SANITIZER_GO // sizeof(struct pthread) from glibc. static atomic_uintptr_t thread_descriptor_size; +// FIXME: Implementation is very GLIBC specific, but it's used by FREEBSD. static uptr ThreadDescriptorSizeFallback() { -# if defined(__x86_64__) || defined(__i386__) || defined(__arm__) +# if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || \ + SANITIZER_RISCV64 +# if SANITIZER_GLIBC int major; int minor; int patch; - if (GetLibcVersion(&major, &minor, &patch) && major == 2) { - /* sizeof(struct pthread) values from various glibc versions. */ - if (SANITIZER_X32) - return 1728; // Assume only one particular version for x32. - // For ARM sizeof(struct pthread) changed in Glibc 2.23. - if (SANITIZER_ARM) - return minor <= 22 ? 1120 : 1216; - if (minor <= 3) - return FIRST_32_SECOND_64(1104, 1696); - if (minor == 4) - return FIRST_32_SECOND_64(1120, 1728); - if (minor == 5) - return FIRST_32_SECOND_64(1136, 1728); - if (minor <= 9) - return FIRST_32_SECOND_64(1136, 1712); - if (minor == 10) - return FIRST_32_SECOND_64(1168, 1776); - if (minor == 11 || (minor == 12 && patch == 1)) - return FIRST_32_SECOND_64(1168, 2288); - if (minor <= 14) - return FIRST_32_SECOND_64(1168, 2304); - if (minor < 32) // Unknown version - return FIRST_32_SECOND_64(1216, 2304); - // minor == 32 - return FIRST_32_SECOND_64(1344, 2496); - } + GetGLibcVersion(&major, &minor, &patch); +# else // SANITIZER_GLIBC return 0; -# elif defined(__s390__) || defined(__sparc__) +# endif // SANITIZER_GLIBC +# endif + +# if defined(__x86_64__) || defined(__i386__) || defined(__arm__) + /* sizeof(struct pthread) values from various glibc versions. */ + if (SANITIZER_X32) + return 1728; // Assume only one particular version for x32. + // For ARM sizeof(struct pthread) changed in Glibc 2.23. + if (SANITIZER_ARM) + return minor <= 22 ? 1120 : 1216; + if (minor <= 3) + return FIRST_32_SECOND_64(1104, 1696); + if (minor == 4) + return FIRST_32_SECOND_64(1120, 1728); + if (minor == 5) + return FIRST_32_SECOND_64(1136, 1728); + if (minor <= 9) + return FIRST_32_SECOND_64(1136, 1712); + if (minor == 10) + return FIRST_32_SECOND_64(1168, 1776); + if (minor == 11 || (minor == 12 && patch == 1)) + return FIRST_32_SECOND_64(1168, 2288); + if (minor <= 14) + return FIRST_32_SECOND_64(1168, 2304); + if (minor < 32) // Unknown version + return FIRST_32_SECOND_64(1216, 2304); + // minor == 32 + return FIRST_32_SECOND_64(1344, 2496); +# endif + +# if SANITIZER_RISCV64 + // TODO: consider adding an optional runtime check for an unknown (untested) + // glibc version + if (minor <= 28) // WARNING: the highest tested version is 2.29 + return 1772; // no guarantees for this one + if (minor <= 31) + return 1772; // tested against glibc 2.29, 2.31 + return 1936; // tested against glibc 2.32 +# endif + +# if defined(__s390__) || defined(__sparc__) // The size of a prefix of TCB including pthread::{specific_1stblock,specific} // suffices. Just return offsetof(struct pthread, specific_used), which hasn't // changed since 2007-05. Technically this applies to i386/x86_64 as well but // we call _dl_get_tls_static_info and need the precise size of struct // pthread. return FIRST_32_SECOND_64(524, 1552); -# elif defined(__mips__) +# endif + +# if defined(__mips__) // TODO(sagarthakur): add more values as per different glibc versions. return FIRST_32_SECOND_64(1152, 1776); -# elif SANITIZER_LOONGARCH64 +# endif + +# if SANITIZER_LOONGARCH64 return 1856; // from glibc 2.36 -# elif SANITIZER_RISCV64 - int major; - int minor; - int patch; - if (GetLibcVersion(&major, &minor, &patch) && major == 2) { - // TODO: consider adding an optional runtime check for an unknown (untested) - // glibc version - if (minor <= 28) // WARNING: the highest tested version is 2.29 - return 1772; // no guarantees for this one - if (minor <= 31) - return 1772; // tested against glibc 2.29, 2.31 - return 1936; // tested against glibc 2.32 - } - return 0; -# elif defined(__aarch64__) +# endif + +# if defined(__aarch64__) // The sizeof (struct pthread) is the same from GLIBC 2.17 to 2.22. return 1776; -# elif defined(__powerpc64__) +# endif + +# if defined(__powerpc64__) return 1776; // from glibc.ppc64le 2.20-8.fc21 # endif } @@ -330,6 +320,28 @@ uptr ThreadDescriptorSize() { return val; } +# if SANITIZER_GLIBC +__attribute__((unused)) static size_t g_tls_size; +# endif + +void InitTlsSize() { +# if SANITIZER_GLIBC + int major, minor, patch; + GetGLibcVersion(&major, &minor, &patch); + g_use_dlpi_tls_data = major == 2 && minor >= 25; + +# if defined(__aarch64__) || defined(__x86_64__) || \ + defined(__powerpc64__) || defined(__loongarch__) + auto *get_tls_static_info = (void (*)(size_t *, size_t *))dlsym( + RTLD_DEFAULT, "_dl_get_tls_static_info"); + size_t tls_align; + // Can be null if static link. + if (get_tls_static_info) + get_tls_static_info(&g_tls_size, &tls_align); +# endif +# endif // SANITIZER_GLIBC +} + # if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64 || \ SANITIZER_LOONGARCH64 // TlsPreTcbSize includes size of struct pthread_descr and size of tcb @@ -350,7 +362,12 @@ static uptr TlsPreTcbSize() { return kTlsPreTcbSize; } # endif +# else // (SANITIZER_FREEBSD || SANITIZER_GLIBC) && !SANITIZER_GO +void InitTlsSize() {} +# endif // (SANITIZER_FREEBSD || SANITIZER_GLIBC) && !SANITIZER_GO +# if (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_SOLARIS) && \ + !SANITIZER_ANDROID && !SANITIZER_GO namespace { struct TlsBlock { uptr begin, end, align; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp index 2a36104e6f9f2..26d2e8d4ed768 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp @@ -545,9 +545,6 @@ uptr GetTlsSize() { return 0; } -void InitTlsSize() { -} - uptr TlsBaseAddr() { uptr segbase = 0; #if defined(__x86_64__) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp index 2c8f8343519ed..7cee571314868 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp @@ -873,9 +873,6 @@ uptr GetTlsSize() { return 0; } -void InitTlsSize() { -} - void GetThreadStackAndTls(bool main, uptr *stk_begin, uptr *stk_end, uptr *tls_begin, uptr *tls_end) { # if SANITIZER_GO diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp index 460cbacf3408c..924339191df13 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp @@ -12,9 +12,11 @@ // sanitizer_common/sanitizer_common_interceptors.inc //===----------------------------------------------------------------------===// +#include "sanitizer_common/sanitizer_allocator_dlsym.h" #include "sanitizer_common/sanitizer_atomic.h" #include "sanitizer_common/sanitizer_errno.h" #include "sanitizer_common/sanitizer_glibc_version.h" +#include "sanitizer_common/sanitizer_internal_defs.h" #include "sanitizer_common/sanitizer_libc.h" #include "sanitizer_common/sanitizer_linux.h" #include "sanitizer_common/sanitizer_platform_limits_netbsd.h" @@ -252,6 +254,12 @@ SANITIZER_WEAK_CXX_DEFAULT_IMPL void OnPotentiallyBlockingRegionBegin() {} SANITIZER_WEAK_CXX_DEFAULT_IMPL void OnPotentiallyBlockingRegionEnd() {} #endif +struct DlsymAlloc : public DlSymAllocator { + static bool UseImpl() { + return in_symbolizer() || (ctx && !ctx->initialized); + } +}; + } // namespace __tsan static ThreadSignalContext *SigCtx(ThreadState *thr) { @@ -659,8 +667,8 @@ TSAN_INTERCEPTOR(void, _longjmp, uptr *env, int val) { #if !SANITIZER_APPLE TSAN_INTERCEPTOR(void*, malloc, uptr size) { - if (in_symbolizer()) - return InternalAlloc(size); + if (DlsymAlloc::Use()) + return DlsymAlloc::Allocate(size); void *p = 0; { SCOPED_INTERCEPTOR_RAW(malloc, size); @@ -678,9 +686,9 @@ TSAN_INTERCEPTOR(void*, __libc_memalign, uptr align, uptr sz) { return user_memalign(thr, pc, align, sz); } -TSAN_INTERCEPTOR(void *, calloc, uptr n, uptr size) { - if (in_symbolizer()) - return InternalCalloc(n, size); +TSAN_INTERCEPTOR(void*, calloc, uptr n, uptr size) { + if (DlsymAlloc::Use()) + return DlsymAlloc::Callocate(n, size); void *p = 0; { SCOPED_INTERCEPTOR_RAW(calloc, n, size); @@ -691,8 +699,8 @@ TSAN_INTERCEPTOR(void *, calloc, uptr n, uptr size) { } TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) { - if (in_symbolizer()) - return InternalRealloc(p, size); + if (DlsymAlloc::Use() || DlsymAlloc::PointerIsMine(p)) + return DlsymAlloc::Realloc(p, size); if (p) invoke_free_hook(p); { @@ -703,9 +711,9 @@ TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) { return p; } -TSAN_INTERCEPTOR(void *, reallocarray, void *p, uptr n, uptr size) { - if (in_symbolizer()) - return InternalReallocArray(p, n, size); +TSAN_INTERCEPTOR(void*, reallocarray, void *p, uptr n, uptr size) { + if (DlsymAlloc::Use() || DlsymAlloc::PointerIsMine(p)) + return DlsymAlloc::ReallocArray(p, n, size); if (p) invoke_free_hook(p); { @@ -717,20 +725,20 @@ TSAN_INTERCEPTOR(void *, reallocarray, void *p, uptr n, uptr size) { } TSAN_INTERCEPTOR(void, free, void *p) { - if (p == 0) + if (UNLIKELY(!p)) return; - if (in_symbolizer()) - return InternalFree(p); + if (DlsymAlloc::PointerIsMine(p)) + return DlsymAlloc::Free(p); invoke_free_hook(p); SCOPED_INTERCEPTOR_RAW(free, p); user_free(thr, pc, p); } TSAN_INTERCEPTOR(void, cfree, void *p) { - if (p == 0) + if (UNLIKELY(!p)) return; - if (in_symbolizer()) - return InternalFree(p); + if (DlsymAlloc::PointerIsMine(p)) + return DlsymAlloc::Free(p); invoke_free_hook(p); SCOPED_INTERCEPTOR_RAW(cfree, p); user_free(thr, pc, p); @@ -818,15 +826,15 @@ TSAN_INTERCEPTOR(void*, memalign, uptr align, uptr sz) { #if !SANITIZER_APPLE TSAN_INTERCEPTOR(void*, aligned_alloc, uptr align, uptr sz) { - if (in_symbolizer()) - return InternalAlloc(sz, nullptr, align); + if (DlsymAlloc::Use()) + return DlsymAlloc::Allocate(sz, align); SCOPED_INTERCEPTOR_RAW(aligned_alloc, align, sz); return user_aligned_alloc(thr, pc, align, sz); } TSAN_INTERCEPTOR(void*, valloc, uptr sz) { - if (in_symbolizer()) - return InternalAlloc(sz, nullptr, GetPageSizeCached()); + if (DlsymAlloc::Use()) + return DlsymAlloc::Allocate(sz, GetPageSizeCached()); SCOPED_INTERCEPTOR_RAW(valloc, sz); return user_valloc(thr, pc, sz); } @@ -834,10 +842,10 @@ TSAN_INTERCEPTOR(void*, valloc, uptr sz) { #if SANITIZER_LINUX TSAN_INTERCEPTOR(void*, pvalloc, uptr sz) { - if (in_symbolizer()) { + if (DlsymAlloc::Use()) { uptr PageSize = GetPageSizeCached(); sz = sz ? RoundUpTo(sz, PageSize) : PageSize; - return InternalAlloc(sz, nullptr, PageSize); + return DlsymAlloc::Allocate(sz, PageSize); } SCOPED_INTERCEPTOR_RAW(pvalloc, sz); return user_pvalloc(thr, pc, sz); @@ -849,8 +857,8 @@ TSAN_INTERCEPTOR(void*, pvalloc, uptr sz) { #if !SANITIZER_APPLE TSAN_INTERCEPTOR(int, posix_memalign, void **memptr, uptr align, uptr sz) { - if (in_symbolizer()) { - void *p = InternalAlloc(sz, nullptr, align); + if (DlsymAlloc::Use()) { + void *p = DlsymAlloc::Allocate(sz, align); if (!p) return errno_ENOMEM; *memptr = p; diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp index 621c679a05db4..3e08a1bece98f 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp @@ -418,7 +418,6 @@ void InitializePlatform() { Die(); } - InitTlsSize(); #endif // !SANITIZER_GO } diff --git a/compiler-rt/lib/ubsan/ubsan_init.cpp b/compiler-rt/lib/ubsan/ubsan_init.cpp index 5802d58896f0f..aea7ca00e3cb3 100644 --- a/compiler-rt/lib/ubsan/ubsan_init.cpp +++ b/compiler-rt/lib/ubsan/ubsan_init.cpp @@ -43,8 +43,8 @@ static void CommonStandaloneInit() { SanitizerToolName = GetSanititizerToolName(); CacheBinaryName(); InitializeFlags(); - __sanitizer::InitializePlatformEarly(); __sanitizer_set_report_path(common_flags()->log_path); + __sanitizer::InitializePlatformEarly(); AndroidLogInit(); InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); CommonInit(); diff --git a/compiler-rt/test/sanitizer_common/TestCases/dlsym_alloc.c b/compiler-rt/test/sanitizer_common/TestCases/dlsym_alloc.c index 7b5b9cf34a90f..4aa87afe47f4e 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/dlsym_alloc.c +++ b/compiler-rt/test/sanitizer_common/TestCases/dlsym_alloc.c @@ -1,7 +1,5 @@ // RUN: %clang -O0 %s -o %t && %run %t -// FIXME: TSAN does not use DlsymAlloc. -// UNSUPPORTED: tsan // FIXME: investigate why this fails on macos // UNSUPPORTED: darwin From f9f45594b0b3afa066a1977c7737f302a621664d Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Mon, 16 Sep 2024 21:35:07 -0700 Subject: [PATCH 2/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20introduced=20through=20rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.4 [skip ci] --- .../lib/tsan/rtl/tsan_interceptors_posix.cpp | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp index 924339191df13..eaa0f6d0de60c 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp @@ -254,9 +254,12 @@ SANITIZER_WEAK_CXX_DEFAULT_IMPL void OnPotentiallyBlockingRegionBegin() {} SANITIZER_WEAK_CXX_DEFAULT_IMPL void OnPotentiallyBlockingRegionEnd() {} #endif +// FIXME: Use for `in_symbolizer()` as well. As-is we can't use +// `DlSymAllocator`, because it uses the primary allocator only. Symbolizer +// requires support of the secondary allocator for larger blocks. struct DlsymAlloc : public DlSymAllocator { static bool UseImpl() { - return in_symbolizer() || (ctx && !ctx->initialized); + return (ctx && !ctx->initialized); } }; @@ -667,6 +670,8 @@ TSAN_INTERCEPTOR(void, _longjmp, uptr *env, int val) { #if !SANITIZER_APPLE TSAN_INTERCEPTOR(void*, malloc, uptr size) { + if (in_symbolizer()) + return InternalAlloc(size); if (DlsymAlloc::Use()) return DlsymAlloc::Allocate(size); void *p = 0; @@ -686,7 +691,9 @@ TSAN_INTERCEPTOR(void*, __libc_memalign, uptr align, uptr sz) { return user_memalign(thr, pc, align, sz); } -TSAN_INTERCEPTOR(void*, calloc, uptr n, uptr size) { +TSAN_INTERCEPTOR(void *, calloc, uptr n, uptr size) { + if (in_symbolizer()) + return InternalCalloc(n, size); if (DlsymAlloc::Use()) return DlsymAlloc::Callocate(n, size); void *p = 0; @@ -699,6 +706,8 @@ TSAN_INTERCEPTOR(void*, calloc, uptr n, uptr size) { } TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) { + if (in_symbolizer()) + return InternalRealloc(p, size); if (DlsymAlloc::Use() || DlsymAlloc::PointerIsMine(p)) return DlsymAlloc::Realloc(p, size); if (p) @@ -711,9 +720,9 @@ TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) { return p; } -TSAN_INTERCEPTOR(void*, reallocarray, void *p, uptr n, uptr size) { - if (DlsymAlloc::Use() || DlsymAlloc::PointerIsMine(p)) - return DlsymAlloc::ReallocArray(p, n, size); +TSAN_INTERCEPTOR(void *, reallocarray, void *p, uptr n, uptr size) { + if (in_symbolizer()) + return InternalReallocArray(p, n, size); if (p) invoke_free_hook(p); { @@ -727,6 +736,8 @@ TSAN_INTERCEPTOR(void*, reallocarray, void *p, uptr n, uptr size) { TSAN_INTERCEPTOR(void, free, void *p) { if (UNLIKELY(!p)) return; + if (in_symbolizer()) + return InternalFree(p); if (DlsymAlloc::PointerIsMine(p)) return DlsymAlloc::Free(p); invoke_free_hook(p); @@ -737,6 +748,8 @@ TSAN_INTERCEPTOR(void, free, void *p) { TSAN_INTERCEPTOR(void, cfree, void *p) { if (UNLIKELY(!p)) return; + if (in_symbolizer()) + return InternalFree(p); if (DlsymAlloc::PointerIsMine(p)) return DlsymAlloc::Free(p); invoke_free_hook(p); @@ -826,15 +839,15 @@ TSAN_INTERCEPTOR(void*, memalign, uptr align, uptr sz) { #if !SANITIZER_APPLE TSAN_INTERCEPTOR(void*, aligned_alloc, uptr align, uptr sz) { - if (DlsymAlloc::Use()) - return DlsymAlloc::Allocate(sz, align); + if (in_symbolizer()) + return InternalAlloc(sz, nullptr, align); SCOPED_INTERCEPTOR_RAW(aligned_alloc, align, sz); return user_aligned_alloc(thr, pc, align, sz); } TSAN_INTERCEPTOR(void*, valloc, uptr sz) { - if (DlsymAlloc::Use()) - return DlsymAlloc::Allocate(sz, GetPageSizeCached()); + if (in_symbolizer()) + return InternalAlloc(sz, nullptr, GetPageSizeCached()); SCOPED_INTERCEPTOR_RAW(valloc, sz); return user_valloc(thr, pc, sz); } @@ -842,10 +855,10 @@ TSAN_INTERCEPTOR(void*, valloc, uptr sz) { #if SANITIZER_LINUX TSAN_INTERCEPTOR(void*, pvalloc, uptr sz) { - if (DlsymAlloc::Use()) { + if (in_symbolizer()) { uptr PageSize = GetPageSizeCached(); sz = sz ? RoundUpTo(sz, PageSize) : PageSize; - return DlsymAlloc::Allocate(sz, PageSize); + return InternalAlloc(sz, nullptr, PageSize); } SCOPED_INTERCEPTOR_RAW(pvalloc, sz); return user_pvalloc(thr, pc, sz); @@ -857,8 +870,8 @@ TSAN_INTERCEPTOR(void*, pvalloc, uptr sz) { #if !SANITIZER_APPLE TSAN_INTERCEPTOR(int, posix_memalign, void **memptr, uptr align, uptr sz) { - if (DlsymAlloc::Use()) { - void *p = DlsymAlloc::Allocate(sz, align); + if (in_symbolizer()) { + void *p = InternalAlloc(sz, nullptr, align); if (!p) return errno_ENOMEM; *memptr = p;