Skip to content

Commit 2ba05fc

Browse files
committed
[compiler-rt][rtsan] getsockopt/setsockopt interception.
1 parent 5ede7b6 commit 2ba05fc

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,25 @@ INTERCEPTOR(int, accept4, int socket, struct sockaddr *address,
995995
#define RTSAN_MAYBE_INTERCEPT_ACCEPT4
996996
#endif
997997

998+
#if SANITIZER_INTERCEPT_GETSOCKOPT
999+
INTERCEPTOR(int, getsockopt, int socket, int level, int option, void *value,
1000+
socklen_t *len) {
1001+
__rtsan_notify_intercepted_call("getsockopt");
1002+
return REAL(getsockopt)(socket, level, option, value, len);
1003+
}
1004+
1005+
INTERCEPTOR(int, setsockopt, int socket, int level, int option,
1006+
const void *value, socklen_t len) {
1007+
__rtsan_notify_intercepted_call("setsockopt");
1008+
return REAL(setsockopt)(socket, level, option, value, len);
1009+
}
1010+
#define RTSAN_MAYBE_INTERCEPT_GETSOCKOPT INTERCEPT_FUNCTION(getsockopt)
1011+
#define RTSAN_MAYBE_INTERCEPT_SETSOCKOPT INTERCEPT_FUNCTION(setsockopt)
1012+
#else
1013+
#define RTSAN_MAYBE_INTERCEPT_GETSOCKOPT
1014+
#define RTSAN_MAYBE_INTERCEPT_SETSOCKOPT
1015+
#endif
1016+
9981017
// I/O Multiplexing
9991018

10001019
INTERCEPTOR(int, poll, struct pollfd *fds, nfds_t nfds, int timeout) {
@@ -1325,6 +1344,8 @@ void __rtsan::InitializeInterceptors() {
13251344
RTSAN_MAYBE_INTERCEPT_ACCEPT4;
13261345
RTSAN_MAYBE_INTERCEPT_GETSOCKNAME;
13271346
RTSAN_MAYBE_INTERCEPT_GETPEERNAME;
1347+
RTSAN_MAYBE_INTERCEPT_GETSOCKOPT;
1348+
RTSAN_MAYBE_INTERCEPT_SETSOCKOPT;
13281349

13291350
RTSAN_MAYBE_INTERCEPT_SELECT;
13301351
INTERCEPT_FUNCTION(pselect);

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,28 @@ TEST(TestRtsanInterceptors, GetpeernameOnASocketDiesWhenRealtime) {
12821282
}
12831283
#endif
12841284

1285+
#if SANITIZER_INTERCEPT_GETSOCKOPT
1286+
TEST(TestRtsanInterceptors, GetsockoptOnASocketDiesWhenRealtime) {
1287+
int val = 0;
1288+
socklen_t len = static_cast<socklen_t>(sizeof(val));
1289+
auto Func = [&val, &len]() {
1290+
getsockopt(0, SOL_SOCKET, SO_REUSEADDR, &val, &len);
1291+
};
1292+
ExpectRealtimeDeath(Func, "getsockopt");
1293+
ExpectNonRealtimeSurvival(Func);
1294+
}
1295+
1296+
TEST(TestRtsanInterceptors, SetsockoptOnASocketDiesWhenRealtime) {
1297+
int val = 0;
1298+
socklen_t len = static_cast<socklen_t>(sizeof(val));
1299+
auto Func = [&val, &len]() {
1300+
setsockopt(0, SOL_SOCKET, SO_REUSEADDR, &val, len);
1301+
};
1302+
ExpectRealtimeDeath(Func, "setsockopt");
1303+
ExpectNonRealtimeSurvival(Func);
1304+
}
1305+
#endif
1306+
12851307
/*
12861308
I/O Multiplexing
12871309
*/

0 commit comments

Comments
 (0)