[compiler-rt] [compiler-rt][rtsan] (PR #128430)
David CARLIER via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 23 10:19:28 PST 2025
https://github.com/devnexen created https://github.com/llvm/llvm-project/pull/128430
None
>From 4287bf3903f7b6cab532ef8220e8ce96d6378d6d Mon Sep 17 00:00:00 2001
From: David Carlier <devnexen at gmail.com>
Date: Sun, 23 Feb 2025 18:02:37 +0000
Subject: [PATCH] [compiler-rt][rtsan]
---
.../lib/rtsan/rtsan_interceptors_posix.cpp | 36 +++++++++++++++++++
.../tests/rtsan_test_interceptors_posix.cpp | 31 ++++++++++++++--
2 files changed, 65 insertions(+), 2 deletions(-)
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
index 5b9e992639f55..ee602bcad68f9 100644
--- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
@@ -285,6 +285,36 @@ INTERCEPTOR(int, unlinkat, int fd, const char *pathname, int flag) {
return REAL(unlinkat)(fd, pathname, flag);
}
+INTERCEPTOR(int, stat, const char *pathname, struct stat *s) {
+ __rtsan_notify_intercepted_call("stat");
+ return REAL(stat)(pathname, s);
+}
+
+INTERCEPTOR(int, lstat, const char *pathname, struct stat *s) {
+ __rtsan_notify_intercepted_call("lstat");
+ return REAL(lstat)(pathname, s);
+}
+
+INTERCEPTOR(int, fstat, int fd, struct stat *s) {
+ __rtsan_notify_intercepted_call("fstat");
+ return REAL(fstat)(fd, s);
+}
+
+INTERCEPTOR(int, stat64, const char *pathname, struct stat64 *s) {
+ __rtsan_notify_intercepted_call("stat64");
+ return REAL(stat64)(pathname, s);
+}
+
+INTERCEPTOR(int, lstat64, const char *pathname, struct stat64 *s) {
+ __rtsan_notify_intercepted_call("lstat64");
+ return REAL(lstat64)(pathname, s);
+}
+
+INTERCEPTOR(int, fstat64, int fd, struct stat64 *s) {
+ __rtsan_notify_intercepted_call("fstat64");
+ return REAL(fstat64)(fd, s);
+}
+
// Streams
INTERCEPTOR(FILE *, fopen, const char *path, const char *mode) {
@@ -1437,6 +1467,12 @@ void __rtsan::InitializeInterceptors() {
RTSAN_MAYBE_INTERCEPT_READLINKAT;
INTERCEPT_FUNCTION(unlink);
INTERCEPT_FUNCTION(unlinkat);
+ INTERCEPT_FUNCTION(stat);
+ INTERCEPT_FUNCTION(lstat);
+ INTERCEPT_FUNCTION(fstat);
+ INTERCEPT_FUNCTION(stat64);
+ INTERCEPT_FUNCTION(lstat64);
+ INTERCEPT_FUNCTION(fstat64);
INTERCEPT_FUNCTION(fopen);
RTSAN_MAYBE_INTERCEPT_FOPEN64;
RTSAN_MAYBE_INTERCEPT_FREOPEN64;
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 d1c5a94c12213..301f4e2694962 100644
--- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
@@ -401,7 +401,7 @@ TEST_F(RtsanFileTest, FcntlFlockDiesWhenRealtime) {
ASSERT_THAT(fd, Ne(-1));
auto Func = [fd]() {
- struct flock lock {};
+ struct flock lock{};
lock.l_type = F_RDLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
@@ -735,7 +735,7 @@ TEST(TestRtsanInterceptors, IoctlBehavesWithOutputPointer) {
GTEST_SKIP();
}
- struct ifreq ifr {};
+ struct ifreq ifr{};
strncpy(ifr.ifr_name, ifaddr->ifa_name, IFNAMSIZ - 1);
int retval = ioctl(sock, SIOCGIFADDR, &ifr);
@@ -875,6 +875,33 @@ TEST_F(RtsanOpenedFileTest, UnlinkatDiesWhenRealtime) {
ExpectNonRealtimeSurvival(Func);
}
+TEST_F(RtsanOpenedFileTest, StatDiesWhenRealtime) {
+ auto Func = [&]() {
+ struct stat s{};
+ stat(GetTemporaryFilePath(), &s);
+ };
+ ExpectRealtimeDeath(Func, MAYBE_APPEND_64("stat"));
+ ExpectNonRealtimeSurvival(Func);
+}
+
+TEST_F(RtsanOpenedFileTest, LtatDiesWhenRealtime) {
+ auto Func = [&]() {
+ struct stat s{};
+ lstat(GetTemporaryFilePath(), &s);
+ };
+ ExpectRealtimeDeath(Func, MAYBE_APPEND_64("lstat"));
+ ExpectNonRealtimeSurvival(Func);
+}
+
+TEST_F(RtsanOpenedFileTest, FstatDiesWhenRealtime) {
+ auto Func = [&]() {
+ struct stat s{};
+ fstat(GetOpenFd(), &s);
+ };
+ ExpectRealtimeDeath(Func, MAYBE_APPEND_64("fstat"));
+ ExpectNonRealtimeSurvival(Func);
+}
+
TEST_F(RtsanFileTest, FcloseDiesWhenRealtime) {
FILE *f = fopen(GetTemporaryFilePath(), "w");
EXPECT_THAT(f, Ne(nullptr));
More information about the llvm-commits
mailing list