https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/156196
Backport 8f317c1 Requested by: @cjappl >From 95ef59003047ab5ed8d65498baa9e12521de5d30 Mon Sep 17 00:00:00 2001 From: Chris Apple <cja-priv...@pm.me> Date: Fri, 29 Aug 2025 11:06:31 -0700 Subject: [PATCH] [rtsan] Add versioned pthread_cond interceptors (#155970) This fixes #146120, confirmed by the original reporter Previously reviewed as #155181, but re-submitting for better book-keeping. Adds versioned pthread_cond interceptors, and the pthread_cond_init/_destroy interceptors (cherry picked from commit 8f317c1a37903fea68590dce5b6cde7de6048b8f) --- .../lib/rtsan/rtsan_interceptors_posix.cpp | 28 +++++++++++++++++++ .../tests/rtsan_test_interceptors_posix.cpp | 18 ++++++++++++ 2 files changed, 46 insertions(+) diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index a9d864e9fe926..1b1ff9b211733 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -15,6 +15,7 @@ #include "interception/interception.h" #include "sanitizer_common/sanitizer_allocator_dlsym.h" +#include "sanitizer_common/sanitizer_glibc_version.h" #include "sanitizer_common/sanitizer_platform_interceptors.h" #include "interception/interception.h" @@ -766,6 +767,12 @@ INTERCEPTOR(int, pthread_join, pthread_t thread, void **value_ptr) { return REAL(pthread_join)(thread, value_ptr); } +INTERCEPTOR(int, pthread_cond_init, pthread_cond_t *cond, + const pthread_condattr_t *a) { + __rtsan_notify_intercepted_call("pthread_cond_init"); + return REAL(pthread_cond_init)(cond, a); +} + INTERCEPTOR(int, pthread_cond_signal, pthread_cond_t *cond) { __rtsan_notify_intercepted_call("pthread_cond_signal"); return REAL(pthread_cond_signal)(cond); @@ -788,6 +795,11 @@ INTERCEPTOR(int, pthread_cond_timedwait, pthread_cond_t *cond, return REAL(pthread_cond_timedwait)(cond, mutex, ts); } +INTERCEPTOR(int, pthread_cond_destroy, pthread_cond_t *cond) { + __rtsan_notify_intercepted_call("pthread_cond_destroy"); + return REAL(pthread_cond_destroy)(cond); +} + INTERCEPTOR(int, pthread_rwlock_rdlock, pthread_rwlock_t *lock) { __rtsan_notify_intercepted_call("pthread_rwlock_rdlock"); return REAL(pthread_rwlock_rdlock)(lock); @@ -1641,10 +1653,26 @@ void __rtsan::InitializeInterceptors() { INTERCEPT_FUNCTION(pthread_mutex_lock); INTERCEPT_FUNCTION(pthread_mutex_unlock); INTERCEPT_FUNCTION(pthread_join); + + // See the comment in tsan_interceptors_posix.cpp. +#if SANITIZER_GLIBC && !__GLIBC_PREREQ(2, 36) && \ + (defined(__x86_64__) || defined(__mips__) || SANITIZER_PPC64V1 || \ + defined(__s390x__)) + INTERCEPT_FUNCTION_VER(pthread_cond_init, "GLIBC_2.3.2"); + INTERCEPT_FUNCTION_VER(pthread_cond_signal, "GLIBC_2.3.2"); + INTERCEPT_FUNCTION_VER(pthread_cond_broadcast, "GLIBC_2.3.2"); + INTERCEPT_FUNCTION_VER(pthread_cond_wait, "GLIBC_2.3.2"); + INTERCEPT_FUNCTION_VER(pthread_cond_timedwait, "GLIBC_2.3.2"); + INTERCEPT_FUNCTION_VER(pthread_cond_destroy, "GLIBC_2.3.2"); +#else + INTERCEPT_FUNCTION(pthread_cond_init); INTERCEPT_FUNCTION(pthread_cond_signal); INTERCEPT_FUNCTION(pthread_cond_broadcast); INTERCEPT_FUNCTION(pthread_cond_wait); INTERCEPT_FUNCTION(pthread_cond_timedwait); + INTERCEPT_FUNCTION(pthread_cond_destroy); +#endif + INTERCEPT_FUNCTION(pthread_rwlock_rdlock); INTERCEPT_FUNCTION(pthread_rwlock_unlock); INTERCEPT_FUNCTION(pthread_rwlock_wrlock); diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp index 26a3b252d3b6b..124c4f5b54ce9 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -1232,6 +1232,24 @@ TEST(TestRtsanInterceptors, SpinLockLockDiesWhenRealtime) { } #endif +TEST(TestRtsanInterceptors, PthreadCondInitDiesWhenRealtime) { + pthread_cond_t cond{}; + auto Func = [&cond]() { pthread_cond_init(&cond, nullptr); }; + ExpectRealtimeDeath(Func, "pthread_cond_init"); + ExpectNonRealtimeSurvival(Func); +} + +TEST(TestRtsanInterceptors, PthreadCondDestroyDiesWhenRealtime) { + pthread_cond_t cond{}; + ASSERT_EQ(0, pthread_cond_init(&cond, nullptr)); + + auto Func = [&cond]() { pthread_cond_destroy(&cond); }; + ExpectRealtimeDeath(Func, "pthread_cond_destroy"); + ExpectNonRealtimeSurvival(Func); + + pthread_cond_destroy(&cond); +} + TEST(TestRtsanInterceptors, PthreadCondSignalDiesWhenRealtime) { pthread_cond_t cond{}; ASSERT_EQ(0, pthread_cond_init(&cond, nullptr)); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits