[compiler-rt] f3d2e75 - [compiler-rt][rtsan] inotify api for Linux interception. (#124177)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 23 21:07:52 PST 2025
Author: David CARLIER
Date: 2025-01-24T05:07:49Z
New Revision: f3d2e75ead4e9d6e91712945a430cb036a061f3f
URL: https://github.com/llvm/llvm-project/commit/f3d2e75ead4e9d6e91712945a430cb036a061f3f
DIFF: https://github.com/llvm/llvm-project/commit/f3d2e75ead4e9d6e91712945a430cb036a061f3f.diff
LOG: [compiler-rt][rtsan] inotify api for Linux interception. (#124177)
Added:
Modified:
compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
Removed:
################################################################################
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
index 28369c51e1269f..1b499f2194f212 100644
--- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
@@ -46,6 +46,9 @@ void OSSpinLockLock(volatile OSSpinLock *__lock);
#include <pthread.h>
#include <stdarg.h>
#include <stdio.h>
+#if SANITIZER_LINUX
+#include <sys/inotify.h>
+#endif
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/stat.h>
@@ -1174,6 +1177,39 @@ INTERCEPTOR(int, kevent64, int kq, const struct kevent64_s *changelist,
#define RTSAN_MAYBE_INTERCEPT_KEVENT64
#endif // SANITIZER_INTERCEPT_KQUEUE
+#if SANITIZER_LINUX
+INTERCEPTOR(int, inotify_init) {
+ __rtsan_notify_intercepted_call("inotify_init");
+ return REAL(inotify_init)();
+}
+
+INTERCEPTOR(int, inotify_init1, int flags) {
+ __rtsan_notify_intercepted_call("inotify_init1");
+ return REAL(inotify_init1)(flags);
+}
+
+INTERCEPTOR(int, inotify_add_watch, int fd, const char *path, uint32_t mask) {
+ __rtsan_notify_intercepted_call("inotify_add_watch");
+ return REAL(inotify_add_watch)(fd, path, mask);
+}
+
+INTERCEPTOR(int, inotify_rm_watch, int fd, int wd) {
+ __rtsan_notify_intercepted_call("inotify_rm_watch");
+ return REAL(inotify_rm_watch)(fd, wd);
+}
+#define RTSAN_MAYBE_INTERCEPT_INOTIFY_INIT INTERCEPT_FUNCTION(inotify_init)
+#define RTSAN_MAYBE_INTERCEPT_INOTIFY_INIT1 INTERCEPT_FUNCTION(inotify_init1)
+#define RTSAN_MAYBE_INTERCEPT_INOTIFY_ADD_WATCH \
+ INTERCEPT_FUNCTION(inotify_add_watch)
+#define RTSAN_MAYBE_INTERCEPT_INOTIFY_RM_WATCH \
+ INTERCEPT_FUNCTION(inotify_rm_watch)
+#else
+#define RTSAN_MAYBE_INTERCEPT_INOTIFY_INIT
+#define RTSAN_MAYBE_INTERCEPT_INOTIFY_INIT1
+#define RTSAN_MAYBE_INTERCEPT_INOTIFY_ADD_WATCH
+#define RTSAN_MAYBE_INTERCEPT_INOTIFY_RM_WATCH
+#endif
+
INTERCEPTOR(int, pipe, int pipefd[2]) {
__rtsan_notify_intercepted_call("pipe");
return REAL(pipe)(pipefd);
@@ -1415,6 +1451,11 @@ void __rtsan::InitializeInterceptors() {
RTSAN_MAYBE_INTERCEPT_KEVENT;
RTSAN_MAYBE_INTERCEPT_KEVENT64;
+ RTSAN_MAYBE_INTERCEPT_INOTIFY_INIT;
+ RTSAN_MAYBE_INTERCEPT_INOTIFY_INIT1;
+ RTSAN_MAYBE_INTERCEPT_INOTIFY_ADD_WATCH;
+ RTSAN_MAYBE_INTERCEPT_INOTIFY_RM_WATCH;
+
INTERCEPT_FUNCTION(pipe);
INTERCEPT_FUNCTION(mkfifo);
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 cd62a3c57c6f9c..a4f2b92b7c4945 100644
--- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
@@ -43,6 +43,9 @@
#include <poll.h>
#include <pthread.h>
#include <stdio.h>
+#if SANITIZER_LINUX
+#include <sys/inotify.h>
+#endif
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/socket.h>
@@ -1505,6 +1508,38 @@ TEST_F(KqueueTest, Kevent64DiesWhenRealtime) {
}
#endif // SANITIZER_INTERCEPT_KQUEUE
+#if SANITIZER_LINUX
+TEST(TestRtsanInterceptors, InotifyInitDiesWhenRealtime) {
+ auto Func = []() { inotify_init(); };
+ ExpectRealtimeDeath(Func, "inotify_init");
+ ExpectNonRealtimeSurvival(Func);
+}
+
+TEST(TestRtsanInterceptors, InotifyInit1DiesWhenRealtime) {
+ auto Func = []() { inotify_init1(0); };
+ ExpectRealtimeDeath(Func, "inotify_init1");
+ ExpectNonRealtimeSurvival(Func);
+}
+
+TEST(TestRtsanInterceptors, InotifyAddWatchDiesWhenRealtime) {
+ int fd = inotify_init();
+ EXPECT_THAT(fd, Ne(-1));
+ auto Func = [fd]() {
+ inotify_add_watch(fd, "/tmp/rtsan_inotify", IN_CREATE);
+ };
+ ExpectRealtimeDeath(Func, "inotify_add_watch");
+ ExpectNonRealtimeSurvival(Func);
+}
+
+TEST(TestRtsanInterceptors, InotifyRmWatchDiesWhenRealtime) {
+ int fd = inotify_init();
+ EXPECT_THAT(fd, Ne(-1));
+ auto Func = [fd]() { inotify_rm_watch(fd, -1); };
+ ExpectRealtimeDeath(Func, "inotify_rm_watch");
+ ExpectNonRealtimeSurvival(Func);
+}
+#endif
+
TEST(TestRtsanInterceptors, MkfifoDiesWhenRealtime) {
auto Func = []() { mkfifo("/tmp/rtsan_test_fifo", 0); };
ExpectRealtimeDeath(Func, "mkfifo");
More information about the llvm-commits
mailing list