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