diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 7ab54c24a002f..76e29a591c993 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -840,6 +840,17 @@ INTERCEPTOR(int, getsockname, int socket, struct sockaddr *sa, #define RTSAN_MAYBE_INTERCEPT_GETSOCKNAME #endif +#if SANITIZER_INTERCEPT_GETPEERNAME +INTERCEPTOR(int, getpeername, int socket, struct sockaddr *sa, + socklen_t *salen) { + __rtsan_notify_intercepted_call("getpeername"); + return REAL(getpeername)(socket, sa, salen); +} +#define RTSAN_MAYBE_INTERCEPT_GETPEERNAME INTERCEPT_FUNCTION(getpeername) +#else +#define RTSAN_MAYBE_INTERCEPT_GETPEERNAME +#endif + INTERCEPTOR(int, bind, int socket, const struct sockaddr *address, socklen_t address_len) { __rtsan_notify_intercepted_call("bind"); @@ -879,6 +890,17 @@ INTERCEPTOR(ssize_t, sendmsg, int socket, const struct msghdr *message, return REAL(sendmsg)(socket, message, flags); } +#if SANITIZER_INTERCEPT_SENDMMSG +INTERCEPTOR(int, sendmmsg, int socket, struct mmsghdr *message, + unsigned int len, int flags) { + __rtsan_notify_intercepted_call("sendmmsg"); + return REAL(sendmmsg)(socket, message, len, flags); +} +#define RTSAN_MAYBE_INTERCEPT_SENDMMSG INTERCEPT_FUNCTION(sendmmsg) +#else +#define RTSAN_MAYBE_INTERCEPT_SENDMMSG +#endif + INTERCEPTOR(ssize_t, sendto, int socket, const void *buffer, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len) { __rtsan_notify_intercepted_call("sendto"); @@ -901,6 +923,17 @@ INTERCEPTOR(ssize_t, recvmsg, int socket, struct msghdr *message, int flags) { return REAL(recvmsg)(socket, message, flags); } +#if SANITIZER_INTERCEPT_RECVMMSG +INTERCEPTOR(int, recvmmsg, int socket, struct mmsghdr *message, + unsigned int len, int flags, struct timespec *timeout) { + __rtsan_notify_intercepted_call("recvmmsg"); + return REAL(recvmmsg)(socket, message, len, flags, timeout); +} +#define RTSAN_MAYBE_INTERCEPT_RECVMMSG INTERCEPT_FUNCTION(recvmmsg) +#else +#define RTSAN_MAYBE_INTERCEPT_RECVMMSG +#endif + INTERCEPTOR(int, shutdown, int socket, int how) { __rtsan_notify_intercepted_call("shutdown"); return REAL(shutdown)(socket, how); @@ -1194,13 +1227,16 @@ void __rtsan::InitializeInterceptors() { INTERCEPT_FUNCTION(recv); INTERCEPT_FUNCTION(recvfrom); INTERCEPT_FUNCTION(recvmsg); + RTSAN_MAYBE_INTERCEPT_RECVMMSG; INTERCEPT_FUNCTION(send); INTERCEPT_FUNCTION(sendmsg); + RTSAN_MAYBE_INTERCEPT_SENDMMSG; INTERCEPT_FUNCTION(sendto); INTERCEPT_FUNCTION(shutdown); INTERCEPT_FUNCTION(socket); RTSAN_MAYBE_INTERCEPT_ACCEPT4; RTSAN_MAYBE_INTERCEPT_GETSOCKNAME; + RTSAN_MAYBE_INTERCEPT_GETPEERNAME; 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 0e03b19e80b6c..0ce1844f05eab 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -1118,6 +1118,15 @@ TEST(TestRtsanInterceptors, SendmsgToASocketDiesWhenRealtime) { ExpectNonRealtimeSurvival(Func); } +#if SANITIZER_INTERCEPT_SENDMMSG +TEST(TestRtsanInterceptors, SendmmsgOnASocketDiesWhenRealtime) { + mmsghdr msg{}; + auto Func = [&]() { sendmmsg(0, &msg, 0, 0); }; + ExpectRealtimeDeath(Func, "sendmmsg"); + ExpectNonRealtimeSurvival(Func); +} +#endif + TEST(TestRtsanInterceptors, SendtoToASocketDiesWhenRealtime) { sockaddr addr{}; socklen_t len{}; @@ -1147,6 +1156,15 @@ TEST(TestRtsanInterceptors, RecvmsgOnASocketDiesWhenRealtime) { ExpectNonRealtimeSurvival(Func); } +#if SANITIZER_INTERCEPT_RECVMMSG +TEST(TestRtsanInterceptors, RecvmmsgOnASocketDiesWhenRealtime) { + mmsghdr msg{}; + auto Func = [&]() { recvmmsg(0, &msg, 0, 0, nullptr); }; + ExpectRealtimeDeath(Func, "recvmmsg"); + ExpectNonRealtimeSurvival(Func); +} +#endif + TEST(TestRtsanInterceptors, ShutdownOnASocketDiesWhenRealtime) { auto Func = [&]() { shutdown(0, 0); }; ExpectRealtimeDeath(Func, "shutdown"); @@ -1163,6 +1181,16 @@ TEST(TestRtsanInterceptors, GetsocknameOnASocketDiesWhenRealtime) { } #endif +#if SANITIZER_INTERCEPT_GETPEERNAME +TEST(TestRtsanInterceptors, GetpeernameOnASocketDiesWhenRealtime) { + sockaddr addr{}; + socklen_t len{}; + auto Func = [&]() { getpeername(0, &addr, &len); }; + ExpectRealtimeDeath(Func, "getpeername"); + ExpectNonRealtimeSurvival(Func); +} +#endif + /* I/O Multiplexing */