[compiler-rt] [rtsan] Add more file descriptor interceptors - dup*, lseek (PR #116853)
Chris Apple via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 19 10:20:45 PST 2024
https://github.com/cjappl created https://github.com/llvm/llvm-project/pull/116853
# Why we think these are real-time unsafe
They correspond directly to system calls in linux and OSX, they are manipulating a shared resource, which likely takes some operating-system synchronization.
>From e6a0c958aa4548b8e3a8bfc14ab9d34ac0bf8b84 Mon Sep 17 00:00:00 2001
From: Chris Apple <cja-private at pm.me>
Date: Tue, 19 Nov 2024 10:14:49 -0800
Subject: [PATCH] [rtsan] Add more file descriptor interceptors - dup*, lseek
---
.../lib/rtsan/rtsan_interceptors_posix.cpp | 29 +++++++++++++++++++
.../tests/rtsan_test_interceptors_posix.cpp | 18 ++++++++++++
.../sanitizer_platform_interceptors.h | 2 ++
3 files changed, 49 insertions(+)
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
index 497db4ecc6ef4c..d18ebb57fc2f75 100644
--- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
@@ -316,6 +316,31 @@ INTERCEPTOR(ssize_t, writev, int fd, const struct iovec *iov, int iovcnt) {
return REAL(writev)(fd, iov, iovcnt);
}
+INTERCEPTOR(off_t, lseek, int fd, off_t offset, int whence) {
+ __rtsan_notify_intercepted_call("lseek");
+ return REAL(lseek)(fd, offset, whence);
+}
+
+#if SANITIZER_INTERCEPT_LSEEK64
+INTERCEPTOR(off64_t, lseek64, int fd, off64_t offset, int whence) {
+ __rtsan_notify_intercepted_call("lseek64");
+ return REAL(lseek64)(fd, offset, whence);
+}
+#define RTSAN_MAYBE_INTERCEPT_LSEEK64 INTERCEPT_FUNCTION(lseek64)
+#else
+#define RTSAN_MAYBE_INTERCEPT_LSEEK64
+#endif // SANITIZER_INTERCEPT_LSEEK64
+
+INTERCEPTOR(int, dup, int oldfd) {
+ __rtsan_notify_intercepted_call("dup");
+ return REAL(dup)(oldfd);
+}
+
+INTERCEPTOR(int, dup2, int oldfd, int newfd) {
+ __rtsan_notify_intercepted_call("dup2");
+ return REAL(dup2)(oldfd, newfd);
+}
+
// Concurrency
#if SANITIZER_APPLE
#pragma clang diagnostic push
@@ -757,6 +782,10 @@ void __rtsan::InitializeInterceptors() {
RTSAN_MAYBE_INTERCEPT_CREAT64;
INTERCEPT_FUNCTION(puts);
INTERCEPT_FUNCTION(fputs);
+ INTERCEPT_FUNCTION(lseek);
+ RTSAN_MAYBE_INTERCEPT_LSEEK64;
+ INTERCEPT_FUNCTION(dup);
+ INTERCEPT_FUNCTION(dup2);
#if SANITIZER_APPLE
INTERCEPT_FUNCTION(OSSpinLockLock);
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 5be62b97906383..ab02b44187d89e 100644
--- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
@@ -367,6 +367,24 @@ class RtsanOpenedFileTest : public RtsanFileTest {
int fd = -1;
};
+TEST_F(RtsanOpenedFileTest, LseekDiesWhenRealtime) {
+ auto Func = [this]() { lseek(GetOpenFd(), 0, SEEK_SET); };
+ ExpectRealtimeDeath(Func, MAYBE_APPEND_64("lseek"));
+ ExpectNonRealtimeSurvival(Func);
+}
+
+TEST_F(RtsanOpenedFileTest, DupDiesWhenRealtime) {
+ auto Func = [this]() { dup(GetOpenFd()); };
+ ExpectRealtimeDeath(Func, "dup");
+ ExpectNonRealtimeSurvival(Func);
+}
+
+TEST_F(RtsanOpenedFileTest, Dup2DiesWhenRealtime) {
+ auto Func = [this]() { dup2(GetOpenFd(), 0); };
+ ExpectRealtimeDeath(Func, "dup2");
+ ExpectNonRealtimeSurvival(Func);
+}
+
TEST_F(RtsanOpenedFileTest, FreadDiesWhenRealtime) {
auto Func = [this]() {
char c{};
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
index 7f9d4998bf757c..9db29cd23458d9 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
@@ -210,6 +210,8 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
#define SANITIZER_INTERCEPT_PREAD64 (SI_GLIBC || SI_SOLARIS32)
#define SANITIZER_INTERCEPT_PWRITE64 (SI_GLIBC || SI_SOLARIS32)
+#define SANITIZER_INTERCEPT_LSEEK64 (SI_GLIBC || SI_SOLARIS32)
+
#define SANITIZER_INTERCEPT_READV SI_POSIX
#define SANITIZER_INTERCEPT_WRITEV SI_POSIX
More information about the llvm-commits
mailing list