Skip to content

Commit 18d5d84

Browse files
authored
[compiler-rt][rtsan] intercept getpeername/recvmmsg/sendmmsg (#123484)
1 parent 84220ec commit 18d5d84

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,17 @@ INTERCEPTOR(int, getsockname, int socket, struct sockaddr *sa,
843843
#define RTSAN_MAYBE_INTERCEPT_GETSOCKNAME
844844
#endif
845845

846+
#if SANITIZER_INTERCEPT_GETPEERNAME
847+
INTERCEPTOR(int, getpeername, int socket, struct sockaddr *sa,
848+
socklen_t *salen) {
849+
__rtsan_notify_intercepted_call("getpeername");
850+
return REAL(getpeername)(socket, sa, salen);
851+
}
852+
#define RTSAN_MAYBE_INTERCEPT_GETPEERNAME INTERCEPT_FUNCTION(getpeername)
853+
#else
854+
#define RTSAN_MAYBE_INTERCEPT_GETPEERNAME
855+
#endif
856+
846857
INTERCEPTOR(int, bind, int socket, const struct sockaddr *address,
847858
socklen_t address_len) {
848859
__rtsan_notify_intercepted_call("bind");
@@ -882,6 +893,17 @@ INTERCEPTOR(ssize_t, sendmsg, int socket, const struct msghdr *message,
882893
return REAL(sendmsg)(socket, message, flags);
883894
}
884895

896+
#if SANITIZER_INTERCEPT_SENDMMSG
897+
INTERCEPTOR(int, sendmmsg, int socket, struct mmsghdr *message,
898+
unsigned int len, int flags) {
899+
__rtsan_notify_intercepted_call("sendmmsg");
900+
return REAL(sendmmsg)(socket, message, len, flags);
901+
}
902+
#define RTSAN_MAYBE_INTERCEPT_SENDMMSG INTERCEPT_FUNCTION(sendmmsg)
903+
#else
904+
#define RTSAN_MAYBE_INTERCEPT_SENDMMSG
905+
#endif
906+
885907
INTERCEPTOR(ssize_t, sendto, int socket, const void *buffer, size_t length,
886908
int flags, const struct sockaddr *dest_addr, socklen_t dest_len) {
887909
__rtsan_notify_intercepted_call("sendto");
@@ -904,6 +926,17 @@ INTERCEPTOR(ssize_t, recvmsg, int socket, struct msghdr *message, int flags) {
904926
return REAL(recvmsg)(socket, message, flags);
905927
}
906928

929+
#if SANITIZER_INTERCEPT_RECVMMSG
930+
INTERCEPTOR(int, recvmmsg, int socket, struct mmsghdr *message,
931+
unsigned int len, int flags, struct timespec *timeout) {
932+
__rtsan_notify_intercepted_call("recvmmsg");
933+
return REAL(recvmmsg)(socket, message, len, flags, timeout);
934+
}
935+
#define RTSAN_MAYBE_INTERCEPT_RECVMMSG INTERCEPT_FUNCTION(recvmmsg)
936+
#else
937+
#define RTSAN_MAYBE_INTERCEPT_RECVMMSG
938+
#endif
939+
907940
INTERCEPTOR(int, shutdown, int socket, int how) {
908941
__rtsan_notify_intercepted_call("shutdown");
909942
return REAL(shutdown)(socket, how);
@@ -1209,13 +1242,16 @@ void __rtsan::InitializeInterceptors() {
12091242
INTERCEPT_FUNCTION(recv);
12101243
INTERCEPT_FUNCTION(recvfrom);
12111244
INTERCEPT_FUNCTION(recvmsg);
1245+
RTSAN_MAYBE_INTERCEPT_RECVMMSG;
12121246
INTERCEPT_FUNCTION(send);
12131247
INTERCEPT_FUNCTION(sendmsg);
1248+
RTSAN_MAYBE_INTERCEPT_SENDMMSG;
12141249
INTERCEPT_FUNCTION(sendto);
12151250
INTERCEPT_FUNCTION(shutdown);
12161251
INTERCEPT_FUNCTION(socket);
12171252
RTSAN_MAYBE_INTERCEPT_ACCEPT4;
12181253
RTSAN_MAYBE_INTERCEPT_GETSOCKNAME;
1254+
RTSAN_MAYBE_INTERCEPT_GETPEERNAME;
12191255

12201256
RTSAN_MAYBE_INTERCEPT_SELECT;
12211257
INTERCEPT_FUNCTION(pselect);

compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,6 +1118,15 @@ TEST(TestRtsanInterceptors, SendmsgToASocketDiesWhenRealtime) {
11181118
ExpectNonRealtimeSurvival(Func);
11191119
}
11201120

1121+
#if SANITIZER_INTERCEPT_SENDMMSG
1122+
TEST(TestRtsanInterceptors, SendmmsgOnASocketDiesWhenRealtime) {
1123+
mmsghdr msg{};
1124+
auto Func = [&]() { sendmmsg(0, &msg, 0, 0); };
1125+
ExpectRealtimeDeath(Func, "sendmmsg");
1126+
ExpectNonRealtimeSurvival(Func);
1127+
}
1128+
#endif
1129+
11211130
TEST(TestRtsanInterceptors, SendtoToASocketDiesWhenRealtime) {
11221131
sockaddr addr{};
11231132
socklen_t len{};
@@ -1147,6 +1156,15 @@ TEST(TestRtsanInterceptors, RecvmsgOnASocketDiesWhenRealtime) {
11471156
ExpectNonRealtimeSurvival(Func);
11481157
}
11491158

1159+
#if SANITIZER_INTERCEPT_RECVMMSG
1160+
TEST(TestRtsanInterceptors, RecvmmsgOnASocketDiesWhenRealtime) {
1161+
mmsghdr msg{};
1162+
auto Func = [&]() { recvmmsg(0, &msg, 0, 0, nullptr); };
1163+
ExpectRealtimeDeath(Func, "recvmmsg");
1164+
ExpectNonRealtimeSurvival(Func);
1165+
}
1166+
#endif
1167+
11501168
TEST(TestRtsanInterceptors, ShutdownOnASocketDiesWhenRealtime) {
11511169
auto Func = [&]() { shutdown(0, 0); };
11521170
ExpectRealtimeDeath(Func, "shutdown");
@@ -1163,6 +1181,16 @@ TEST(TestRtsanInterceptors, GetsocknameOnASocketDiesWhenRealtime) {
11631181
}
11641182
#endif
11651183

1184+
#if SANITIZER_INTERCEPT_GETPEERNAME
1185+
TEST(TestRtsanInterceptors, GetpeernameOnASocketDiesWhenRealtime) {
1186+
sockaddr addr{};
1187+
socklen_t len{};
1188+
auto Func = [&]() { getpeername(0, &addr, &len); };
1189+
ExpectRealtimeDeath(Func, "getpeername");
1190+
ExpectNonRealtimeSurvival(Func);
1191+
}
1192+
#endif
1193+
11661194
/*
11671195
I/O Multiplexing
11681196
*/

0 commit comments

Comments
 (0)