diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 4f7b534ee17a8..f99d68defa613 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -707,6 +707,17 @@ INTERCEPTOR(int, shutdown, int socket, int how) { return REAL(shutdown)(socket, how); } +#if SANITIZER_INTERCEPT_ACCEPT4 +INTERCEPTOR(int, accept4, int socket, struct sockaddr *address, + socklen_t *address_len, int flags) { + __rtsan_notify_intercepted_call("accept4"); + return REAL(accept4)(socket, address, address_len, flags); +} +#define RTSAN_MAYBE_INTERCEPT_ACCEPT4 INTERCEPT_FUNCTION(accept4) +#else +#define RTSAN_MAYBE_INTERCEPT_ACCEPT4 +#endif + // I/O Multiplexing INTERCEPTOR(int, poll, struct pollfd *fds, nfds_t nfds, int timeout) { @@ -956,6 +967,7 @@ void __rtsan::InitializeInterceptors() { INTERCEPT_FUNCTION(sendto); INTERCEPT_FUNCTION(shutdown); INTERCEPT_FUNCTION(socket); + RTSAN_MAYBE_INTERCEPT_ACCEPT4; RTSAN_MAYBE_INTERCEPT_SELECT; INTERCEPT_FUNCTION(pselect); 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 88df8ec46d0a3..6e7cc3b3b3481 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -860,6 +860,16 @@ TEST(TestRtsanInterceptors, AcceptingASocketDiesWhenRealtime) { ExpectNonRealtimeSurvival(Func); } +#if SANITIZER_INTERCEPT_ACCEPT4 +TEST(TestRtsanInterceptors, Accepting4ASocketDiesWhenRealtime) { + auto Func = []() { + EXPECT_LT(accept4(kNotASocketFd, nullptr, nullptr, 0), 0); + }; + ExpectRealtimeDeath(Func, "accept4"); + ExpectNonRealtimeSurvival(Func); +} +#endif + TEST(TestRtsanInterceptors, ConnectingASocketDiesWhenRealtime) { auto Func = []() { EXPECT_NE(connect(kNotASocketFd, nullptr, 0), 0); }; ExpectRealtimeDeath(Func, "connect");