diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 497db4ecc6ef4..d18ebb57fc2f7 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 5be62b9790638..ab02b44187d89 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 7f9d4998bf757..9db29cd23458d 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