diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 34c2d4cb37fd0..cae2ed01c0590 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -808,6 +808,35 @@ INTERCEPTOR(int, munmap, void *addr, size_t length) { return REAL(munmap)(addr, length); } +INTERCEPTOR(int, madvise, void *addr, size_t length, int flag) { + __rtsan_notify_intercepted_call("madvise"); + return REAL(madvise)(addr, length, flag); +} + +INTERCEPTOR(int, posix_madvise, void *addr, size_t length, int flag) { + __rtsan_notify_intercepted_call("posix_madvise"); + return REAL(posix_madvise)(addr, length, flag); +} + +INTERCEPTOR(int, mprotect, void *addr, size_t length, int prot) { + __rtsan_notify_intercepted_call("mprotect"); + return REAL(mprotect)(addr, length, prot); +} + +INTERCEPTOR(int, msync, void *addr, size_t length, int flag) { + __rtsan_notify_intercepted_call("msync"); + return REAL(msync)(addr, length, flag); +} + +#if SANITIZER_APPLE +INTERCEPTOR(int, mincore, const void *addr, size_t length, char *vec) { +#else +INTERCEPTOR(int, mincore, void *addr, size_t length, unsigned char *vec) { +#endif + __rtsan_notify_intercepted_call("mincore"); + return REAL(mincore)(addr, length, vec); +} + INTERCEPTOR(int, shm_open, const char *name, int oflag, mode_t mode) { __rtsan_notify_intercepted_call("shm_open"); return REAL(shm_open)(name, oflag, mode); @@ -1148,6 +1177,11 @@ void __rtsan::InitializeInterceptors() { INTERCEPT_FUNCTION(mmap); RTSAN_MAYBE_INTERCEPT_MMAP64; INTERCEPT_FUNCTION(munmap); + INTERCEPT_FUNCTION(madvise); + INTERCEPT_FUNCTION(posix_madvise); + INTERCEPT_FUNCTION(mprotect); + INTERCEPT_FUNCTION(msync); + INTERCEPT_FUNCTION(mincore); INTERCEPT_FUNCTION(shm_open); INTERCEPT_FUNCTION(shm_unlink); RTSAN_MAYBE_INTERCEPT_MEMALIGN; 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 c858a5a771fe4..06b89e2f7fb94 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -204,6 +204,75 @@ TEST(TestRtsanInterceptors, MunmapDiesWhenRealtime) { ExpectNonRealtimeSurvival(Func); } +class RtsanOpenedMmapTest : public RtsanFileTest { +protected: + void SetUp() override { + RtsanFileTest::SetUp(); + file = fopen(GetTemporaryFilePath(), "w+"); + ASSERT_THAT(file, Ne(nullptr)); + fd = fileno(file); + ASSERT_THAT(fd, Ne(-1)); + int ret = ftruncate(GetOpenFd(), size); + ASSERT_THAT(ret, Ne(-1)); + addr = + mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, GetOpenFd(), 0); + ASSERT_THAT(addr, Ne(MAP_FAILED)); + ASSERT_THAT(addr, Ne(nullptr)); + } + + void TearDown() override { + if (addr != nullptr && addr != MAP_FAILED) + munmap(addr, size); + RtsanFileTest::TearDown(); + } + + void *GetAddr() { return addr; } + static constexpr size_t GetSize() { return size; } + + int GetOpenFd() { return fd; } + +private: + void *addr = nullptr; + static constexpr size_t size = 4096; + FILE *file = nullptr; + int fd = -1; +}; + +TEST_F(RtsanOpenedMmapTest, MadviseDiesWhenRealtime) { + auto Func = [this]() { madvise(GetAddr(), GetSize(), MADV_NORMAL); }; + ExpectRealtimeDeath(Func, "madvise"); + ExpectNonRealtimeSurvival(Func); +} + +TEST_F(RtsanOpenedMmapTest, PosixMadviseDiesWhenRealtime) { + auto Func = [this]() { posix_madvise(GetAddr(), GetSize(), MADV_NORMAL); }; + ExpectRealtimeDeath(Func, "posix_madvise"); + ExpectNonRealtimeSurvival(Func); +} + +TEST_F(RtsanOpenedMmapTest, MprotectDiesWhenRealtime) { + auto Func = [this]() { mprotect(GetAddr(), GetSize(), PROT_READ); }; + ExpectRealtimeDeath(Func, "mprotect"); + ExpectNonRealtimeSurvival(Func); +} + +TEST_F(RtsanOpenedMmapTest, MsyncDiesWhenRealtime) { + auto Func = [this]() { msync(GetAddr(), GetSize(), MS_INVALIDATE); }; + ExpectRealtimeDeath(Func, "msync"); + ExpectNonRealtimeSurvival(Func); +} + +TEST_F(RtsanOpenedMmapTest, MincoreDiesWhenRealtime) { +#if SANITIZER_APPLE + std::vector vec(GetSize() / 1024); +#else + std::vector vec(GetSize() / 1024); +#endif + auto Func = [this, &vec]() { mincore(GetAddr(), GetSize(), vec.data()); }; + ExpectRealtimeDeath(Func, "mincore"); + ExpectNonRealtimeSurvival(Func); +} + TEST(TestRtsanInterceptors, ShmOpenDiesWhenRealtime) { auto Func = []() { shm_open("/rtsan_test_shm", O_CREAT | O_RDWR, 0); }; ExpectRealtimeDeath(Func, "shm_open");