diff options
author | Chris Apple <cja-private@pm.me> | 2024-11-19 14:54:14 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-19 14:54:14 -0800 |
commit | 3c8818cf2deaa050817ecec1c99cf939295feced (patch) | |
tree | 3b920fc3d59d1d5854cb905ed594d3c0b96ec77e | |
parent | 7c41b5ccdcf0f5de1b9b254693635283faff3658 (diff) | |
download | llvm-3c8818cf2deaa050817ecec1c99cf939295feced.zip llvm-3c8818cf2deaa050817ecec1c99cf939295feced.tar.gz llvm-3c8818cf2deaa050817ecec1c99cf939295feced.tar.bz2 |
[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.
3 files changed, 49 insertions, 0 deletions
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 497db4ec..d18ebb5 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 5be62b9..ab02b44 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 @@ private: 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 ecc768d..1f78b1a 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 |