Skip to content

Conversation

@devnexen
Copy link
Member

No description provided.

@llvmbot
Copy link
Member

llvmbot commented Apr 12, 2025

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: David CARLIER (devnexen)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/135491.diff

2 Files Affected:

  • (modified) compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp (+16)
  • (modified) compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp (+11)
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index e8cea21ddf9aa..fa194c1132502 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -1456,6 +1456,20 @@ INTERCEPTOR(ssize_t, process_vm_writev, pid_t pid, #define RTSAN_MAYBE_INTERCEPT_PROCESS_VM_WRITEV #endif +// Signals + +#if SANITIZER_LINUX +/* same as eventfd, signalfd calls SYS_signalfd4 to support the flags argument + */ +INTERCEPTOR(int, signalfd, const sigset_t *mask, int flags) { + __rtsan_notify_intercepted_call("signalfd"); + return REAL(signalfd)(mask, flags); +} +#define RTSAN_MAYBE_INTERCEPT_SIGNALFD INTERCEPT_FUNCTION(signalfd) +#else +#define RTSAN_MAYBE_INTERCEPT_SIGNALFD +#endif + // TODO: the `wait` family of functions is an oddity. In testing, if you // intercept them, Darwin seemingly ignores them, and linux never returns from // the test. Revisit this in the future, but hopefully intercepting fork/exec is @@ -1676,6 +1690,8 @@ void __rtsan::InitializeInterceptors() { RTSAN_MAYBE_INTERCEPT_PROCESS_VM_READV; RTSAN_MAYBE_INTERCEPT_PROCESS_VM_WRITEV; + RTSAN_MAYBE_INTERCEPT_SIGNALFD; + INTERCEPT_FUNCTION(syscall); } 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 048da5858d665..31f0e58de7538 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -46,6 +46,7 @@ #if SANITIZER_LINUX #include <sys/eventfd.h> #include <sys/inotify.h> +#include <sys/signalfd.h> #include <sys/timerfd.h> #endif #include <sys/ioctl.h> @@ -821,6 +822,16 @@ TEST(TestRtsanInterceptors, ProcessVmWritevDiesWhenRealtime) { } #endif +#if SANITIZER_LINUX +TEST(TestRtsanInterceptors, SignalfdDiesWhenRealtime) { + sigset_t set; + sigemptyset(&set); + auto Func = [&set]() { signalfd(-1, &set, 0); }; + ExpectRealtimeDeath(Func, "signalfd"); + ExpectNonRealtimeSurvival(Func); +} +#endif + class RtsanDirectoryTest : public ::testing::Test { protected: void SetUp() override { 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment