diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 1b499f2194f21..9932fe07d8522 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -47,6 +47,7 @@ void OSSpinLockLock(volatile OSSpinLock *__lock); #include #include #if SANITIZER_LINUX +#include #include #endif #include @@ -850,6 +851,32 @@ INTERCEPTOR(void *, mmap64, void *addr, size_t length, int prot, int flags, #define RTSAN_MAYBE_INTERCEPT_MMAP64 #endif // SANITIZER_INTERCEPT_MMAP64 +#if SANITIZER_LINUX +// Note that even if rtsan is ported to netbsd, it has a slighty different +// and non-variadic signature +INTERCEPTOR(void *, mremap, void *oaddr, size_t olength, size_t nlength, + int flags, ...) { + __rtsan_notify_intercepted_call("mremap"); + + // the last optional argument is only used in this case + // as the new page region will be assigned to. Is ignored otherwise. + if (flags & MREMAP_FIXED) { + va_list args; + + va_start(args, flags); + void *naddr = va_arg(args, void *); + va_end(args); + + return REAL(mremap)(oaddr, olength, nlength, flags, naddr); + } + + return REAL(mremap)(oaddr, olength, nlength, flags); +} +#define RTSAN_MAYBE_INTERCEPT_MREMAP INTERCEPT_FUNCTION(mremap) +#else +#define RTSAN_MAYBE_INTERCEPT_MREMAP +#endif + INTERCEPTOR(int, munmap, void *addr, size_t length) { __rtsan_notify_intercepted_call("munmap"); return REAL(munmap)(addr, length); @@ -1321,6 +1348,7 @@ void __rtsan::InitializeInterceptors() { INTERCEPT_FUNCTION(posix_memalign); INTERCEPT_FUNCTION(mmap); RTSAN_MAYBE_INTERCEPT_MMAP64; + RTSAN_MAYBE_INTERCEPT_MREMAP; INTERCEPT_FUNCTION(munmap); RTSAN_MAYBE_INTERCEPT_MADVISE; RTSAN_MAYBE_INTERCEPT_POSIX_MADVISE; 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 a4f2b92b7c494..7bff31e561a85 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -197,6 +197,16 @@ TEST(TestRtsanInterceptors, MmapDiesWhenRealtime) { ExpectNonRealtimeSurvival(Func); } +#if SANITIZER_LINUX +TEST(TestRtsanInterceptors, MremapDiesWhenRealtime) { + void *addr = mmap(nullptr, 8, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + auto Func = [addr]() { void *_ = mremap(addr, 8, 16, 0); }; + ExpectRealtimeDeath(Func, "mremap"); + ExpectNonRealtimeSurvival(Func); +} +#endif + TEST(TestRtsanInterceptors, MunmapDiesWhenRealtime) { void *ptr = mmap(nullptr, 8, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);