[compiler-rt] [compiler-rt][rtsan] adding Linux's clone call interception. (PR #130423)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 8 07:59:03 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-compiler-rt-sanitizer
Author: David CARLIER (devnexen)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/130423.diff
2 Files Affected:
- (modified) compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp (+26)
- (modified) compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp (+14)
``````````diff
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
index cd57107450a47..6848f2c346761 100644
--- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
@@ -1361,6 +1361,31 @@ INTERCEPTOR(int, execve, const char *filename, char *const argv[],
return REAL(execve)(filename, argv, envp);
}
+#if SANITIZER_GLIBC
+INTERCEPTOR(int, clone, int (*f)(void *), void *stack, int flags, void *arg,
+ ...) {
+ __rtsan_notify_intercepted_call("clone");
+
+ if ((flags & CLONE_PIDFD) || (flags & CLONE_SETTLS) ||
+ (flags & CLONE_PARENT_SETTID) || (flags & CLONE_CHILD_SETTID) ||
+ (flags & CLONE_CHILD_CLEARTID)) {
+ va_list args;
+ va_start(args, arg);
+ pid_t *parent = va_arg(args, pid_t *);
+ void *tls = va_arg(args, void *);
+ pid_t *child = va_arg(args, pid_t *);
+ va_end(args);
+
+ return REAL(clone)(f, stack, flags, arg, parent, tls, child);
+ }
+
+ return REAL(clone)(f, stack, flags, arg);
+}
+#define RTSAN_MAYBE_INTERCEPT_CLONE INTERCEPT_FUNCTION(clone)
+#else
+#define RTSAN_MAYBE_INTERCEPT_CLONE
+#endif
+
#if SANITIZER_INTERCEPT_PROCESS_VM_READV
INTERCEPTOR(ssize_t, process_vm_readv, pid_t pid, const struct iovec *local_iov,
unsigned long liovcnt, const struct iovec *remote_iov,
@@ -1595,6 +1620,7 @@ void __rtsan::InitializeInterceptors() {
INTERCEPT_FUNCTION(fork);
INTERCEPT_FUNCTION(execve);
+ RTSAN_MAYBE_INTERCEPT_CLONE;
RTSAN_MAYBE_INTERCEPT_PROCESS_VM_READV;
RTSAN_MAYBE_INTERCEPT_PROCESS_VM_WRITEV;
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 47bcafff51a4d..0fc7b9ae19bb9 100644
--- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
@@ -1245,6 +1245,20 @@ TEST_F(PthreadRwlockTest, PthreadRwlockWrlockSurvivesWhenNonRealtime) {
ExpectNonRealtimeSurvival(Func);
}
+#if SANITIZER_GLIBC
+TEST(TestRtsanInterceptors, CloneDiesWhenRealtime) {
+ std::vector<char> buf;
+ buf.resize(1024 * 1024);
+ auto Call = [](void *a) { return 0; };
+ auto Func = [&buf, &Call]() {
+ clone(Call, buf.data() + buf.size(), 0, nullptr);
+ };
+
+ ExpectRealtimeDeath(Func, "clone");
+ ExpectNonRealtimeSurvival(Func);
+}
+#endif
+
/*
Sockets
*/
``````````
</details>
https://github.com/llvm/llvm-project/pull/130423
More information about the llvm-commits
mailing list