[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