From f0e4f50fd16e920f5efb7f3b8abda670167ccbff Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 2 Nov 2023 15:17:53 -0700 Subject: [PATCH] QProcess/Unix: detect ASan and TSan dynamically Fixes: QTBUG-117533 Fixes: QTBUG-117954 Task-number: QTBUG-104493 Change-Id: I09c3950e719e4b259bc7fffd1793ee472c5d5a9a Reviewed-by: Ahmad Samir (cherry picked from commit 7c4e271fe73f4775d308d5851c07bc21cdd08570) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 9962441bfd0cbb347cb24a685f14a932c0849bd9) --- src/corelib/io/qprocess_unix.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index affebf332c6..db33cb205b6 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -510,6 +510,10 @@ static QString resolveExecutable(const QString &program) return program; } +extern "C" { +__attribute__((weak)) pid_t __interceptor_vfork(); +} + static int useForkFlags(const QProcessPrivate::UnixExtras *unixExtras) { #if defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer) @@ -532,6 +536,12 @@ static int useForkFlags(const QProcessPrivate::UnixExtras *unixExtras) return FFD_USE_FORK; #endif + // Dynamically detect whether libasan or libtsan are loaded into the + // process' memory. We need this because the user's code may be compiled + // with ASan or TSan, but not Qt. + if (__interceptor_vfork != nullptr) + return FFD_USE_FORK; + if (!unixExtras || !unixExtras->childProcessModifier) return 0; // no modifier was supplied