[compiler-rt] [tsan] Intercept __tls_get_addr_earlier (PR #83886)
Alexander Richardson via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 8 22:08:46 PST 2024
https://github.com/arichardson updated https://github.com/llvm/llvm-project/pull/83886
>From 289f4be8b0f58bb61dab37703d9834a3c3d20cbf Mon Sep 17 00:00:00 2001
From: Alex Richardson <alexrichardson at google.com>
Date: Mon, 4 Mar 2024 10:32:30 -0800
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.6-beta.1
---
.../lib/tsan/rtl/tsan_interceptors_posix.cpp | 23 +++++++++++--------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
index a9f6673ac44e90..b8bfaf500c2769 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
@@ -2863,6 +2863,20 @@ void InitializeInterceptors() {
new(interceptor_ctx()) InterceptorContext();
+ // Interpose __tls_get_addr before the common interposers. This is needed
+ // because dlsym() may call malloc on failure. And then ___interceptor_malloc
+ // can end up calling ___interceptor___tls_get_addr, which would not be
+ // initialized yet and therefore results in a crash when calling
+ // REAL(__tls_get_addr). For example, this can happen when looking up
+ // __isoc23_scanf which might not exist in some libcs.
+#ifdef NEED_TLS_GET_ADDR
+# if !SANITIZER_S390
+ TSAN_INTERCEPT(__tls_get_addr);
+# else
+ TSAN_INTERCEPT(__tls_get_addr_internal);
+ TSAN_INTERCEPT(__tls_get_offset);
+# endif
+#endif
InitializeCommonInterceptors();
InitializeSignalInterceptors();
InitializeLibdispatchInterceptors();
@@ -3010,15 +3024,6 @@ void InitializeInterceptors() {
TSAN_INTERCEPT(__cxa_atexit);
TSAN_INTERCEPT(_exit);
-#ifdef NEED_TLS_GET_ADDR
-#if !SANITIZER_S390
- TSAN_INTERCEPT(__tls_get_addr);
-#else
- TSAN_INTERCEPT(__tls_get_addr_internal);
- TSAN_INTERCEPT(__tls_get_offset);
-#endif
-#endif
-
TSAN_MAYBE_INTERCEPT__LWP_EXIT;
TSAN_MAYBE_INTERCEPT_THR_EXIT;
More information about the llvm-commits
mailing list