-
Notifications
You must be signed in to change notification settings - Fork 14.6k
[compiler-rt][rtsan] mremap for Linux interception. #124234
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-compiler-rt-sanitizer Author: David CARLIER (devnexen) ChangesFull diff: https://github.com/llvm/llvm-project/pull/124234.diff 2 Files Affected:
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
index 1b499f2194f212..79fb46bf603976 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 <stdarg.h>
#include <stdio.h>
#if SANITIZER_LINUX
+#include <linux/mman.h>
#include <sys/inotify.h>
#endif
#include <sys/select.h>
@@ -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 different signature
+// still
+INTERCEPTOR(void *, mremap, void *oaddr, size_t olength, size_t nlength,
+ int flags, ...) {
+ __rtsan_notify_intercepted_call("mremap");
+
+ void *naddr = nullptr;
+
+ // 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);
+ naddr = va_arg(args, void *);
+ va_end(args);
+ }
+
+ return REAL(mremap)(oaddr, olength, nlength, flags, naddr);
+}
+#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 a4f2b92b7c4945..7bff31e561a85d 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);
|
@@ -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 different signature | |||
// still |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm unclear on what this comment means, could you rephrase it?
|
||
va_start(args, flags); | ||
naddr = va_arg(args, void *); | ||
va_end(args); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For this will you follow the pattern set forth in our open
/openat
interceptor? that is, call REAL in two places so we don't have to pass in nullptr on 873?
843a342
to
e133bee
Compare
No description provided.