-
Notifications
You must be signed in to change notification settings - Fork 12.5k
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
[compiler-rt][rtsan] page regions api interception update. #123601
Open
devnexen
wants to merge
1
commit into
llvm:main
Choose a base branch
from
devnexen:rtsan_mem_upd
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@llvm/pr-subscribers-compiler-rt-sanitizer Author: David CARLIER (devnexen) Changesmadvise/mprotect/msync/mincore calls with care for signature difference for the latter. Full diff: https://github.com/llvm/llvm-project/pull/123601.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 34c2d4cb37fd0c..e69c75216daa84 100644
--- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
@@ -808,6 +808,30 @@ 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, 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 +1172,10 @@ void __rtsan::InitializeInterceptors() {
INTERCEPT_FUNCTION(mmap);
RTSAN_MAYBE_INTERCEPT_MMAP64;
INTERCEPT_FUNCTION(munmap);
+ INTERCEPT_FUNCTION(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 c858a5a771fe45..633465cdb7ec7a 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,84 @@ TEST(TestRtsanInterceptors, MunmapDiesWhenRealtime) {
ExpectNonRealtimeSurvival(Func);
}
+class RtsanOpenedFileTest : 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));
+ }
+
+ void TearDown() override {
+ if (file != nullptr)
+ fclose(file);
+ RtsanFileTest::TearDown();
+ }
+
+ FILE *GetOpenFile() { return file; }
+
+ int GetOpenFd() { return fd; }
+
+private:
+ FILE *file = nullptr;
+ int fd = -1;
+};
+
+class RtsanOpenedMmapTest : public RtsanOpenedFileTest {
+protected:
+ void SetUp() override {
+ RtsanOpenedFileTest::SetUp();
+ addr =
+ mmap(nullptr, size, PROT_READ, MAP_PRIVATE | MAP_ANON, 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);
+ RtsanOpenedFileTest::TearDown();
+ }
+
+ void *GetAddr() { return addr; }
+ static constexpr size_t GetSize() { return size; }
+
+private:
+ void *addr = nullptr;
+ static constexpr size_t size = 4096;
+};
+
+TEST_F(RtsanOpenedMmapTest, MadviseDiesWhenRealtime) {
+ auto Func = [this]() { madvise(GetAddr(), GetSize(), MADV_NORMAL); };
+ ExpectRealtimeDeath(Func, "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
+ char vec[GetSize() / 1024];
+#else
+ unsigned char vec[GetSize() / 1024];
+#endif
+ auto Func = [this, &vec]() { mincore(GetAddr(), GetSize(), vec); };
+ ExpectRealtimeDeath(Func, "mincore");
+ ExpectNonRealtimeSurvival(Func);
+}
+
TEST(TestRtsanInterceptors, ShmOpenDiesWhenRealtime) {
auto Func = []() { shm_open("/rtsan_test_shm", O_CREAT | O_RDWR, 0); };
ExpectRealtimeDeath(Func, "shm_open");
@@ -453,31 +531,6 @@ TEST_F(RtsanFileTest, SetbufferDieWhenRealtime) {
}
#endif
-class RtsanOpenedFileTest : 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));
- }
-
- void TearDown() override {
- if (file != nullptr)
- fclose(file);
- RtsanFileTest::TearDown();
- }
-
- FILE *GetOpenFile() { return file; }
-
- int GetOpenFd() { return fd; }
-
-private:
- FILE *file = nullptr;
- int fd = -1;
-};
-
#if SANITIZER_INTERCEPT_FSEEK
TEST_F(RtsanOpenedFileTest, FgetposDieWhenRealtime) {
auto Func = [this]() {
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
madvise/mprotect/msync/mincore calls with care for signature difference for the latter.
devnexen
force-pushed
the
rtsan_mem_upd
branch
from
January 20, 2025 12:42
7783cbb
to
856c382
Compare
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
madvise/mprotect/msync/mincore calls with care for signature difference for the latter.