[compiler-rt] 3c8818c - [rtsan] Add more file descriptor interceptors - dup*, lseek (#116853)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 19 14:54:17 PST 2024
Author: Chris Apple
Date: 2024-11-19T14:54:14-08:00
New Revision: 3c8818cf2deaa050817ecec1c99cf939295feced
URL: https://github.com/llvm/llvm-project/commit/3c8818cf2deaa050817ecec1c99cf939295feced
DIFF: https://github.com/llvm/llvm-project/commit/3c8818cf2deaa050817ecec1c99cf939295feced.diff
LOG: [rtsan] Add more file descriptor interceptors - dup*, lseek (#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.
Added:
Modified:
compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
Removed:
################################################################################
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 ecc768d2e543a6..1f78b1af8e2c6f 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