forked from OSchip/llvm-project
[DFSan] Add custom wrapper for getpeername.
The wrapper clears shadow for addr and addrlen when written to. Reviewed By: stephan.yichao.zhao Differential Revision: https://reviews.llvm.org/D93046
This commit is contained in:
parent
ebff66be65
commit
fa4bd4b338
|
@ -966,6 +966,21 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getsockname(
|
|||
return ret;
|
||||
}
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getpeername(
|
||||
int sockfd, struct sockaddr *addr, socklen_t *addrlen,
|
||||
dfsan_label sockfd_label, dfsan_label addr_label, dfsan_label addrlen_label,
|
||||
dfsan_label *ret_label) {
|
||||
socklen_t origlen = addrlen ? *addrlen : 0;
|
||||
int ret = getpeername(sockfd, addr, addrlen);
|
||||
if (ret != -1 && addr && addrlen) {
|
||||
socklen_t written_bytes = origlen < *addrlen ? origlen : *addrlen;
|
||||
dfsan_set_label(0, addrlen, sizeof(*addrlen));
|
||||
dfsan_set_label(0, addr, written_bytes);
|
||||
}
|
||||
*ret_label = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Type of the trampoline function passed to the custom version of
|
||||
// dfsan_set_write_callback.
|
||||
typedef void (*write_trampoline_t)(
|
||||
|
|
|
@ -193,6 +193,7 @@ fun:fstat=custom
|
|||
fun:getcwd=custom
|
||||
fun:get_current_dir_name=custom
|
||||
fun:gethostname=custom
|
||||
fun:getpeername=custom
|
||||
fun:getrlimit=custom
|
||||
fun:getrusage=custom
|
||||
fun:getsockname=custom
|
||||
|
|
|
@ -956,6 +956,28 @@ void test_socketpair() {
|
|||
ASSERT_READ_ZERO_LABEL(fd, sizeof(fd));
|
||||
}
|
||||
|
||||
void test_getpeername() {
|
||||
int sockfds[2];
|
||||
int ret = socketpair(AF_UNIX, SOCK_DGRAM, 0, sockfds);
|
||||
assert(ret != -1);
|
||||
|
||||
struct sockaddr addr = {};
|
||||
socklen_t addrlen = sizeof(addr);
|
||||
dfsan_set_label(i_label, &addr, addrlen);
|
||||
dfsan_set_label(i_label, &addrlen, sizeof(addrlen));
|
||||
|
||||
ret = getpeername(sockfds[0], &addr, &addrlen);
|
||||
assert(ret != -1);
|
||||
ASSERT_ZERO_LABEL(ret);
|
||||
ASSERT_ZERO_LABEL(addrlen);
|
||||
assert(addrlen < sizeof(addr));
|
||||
ASSERT_READ_ZERO_LABEL(&addr, addrlen);
|
||||
ASSERT_READ_LABEL(((char *)&addr) + addrlen, 1, i_label);
|
||||
|
||||
close(sockfds[0]);
|
||||
close(sockfds[1]);
|
||||
}
|
||||
|
||||
void test_getsockname() {
|
||||
int sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
assert(sockfd != -1);
|
||||
|
@ -1177,6 +1199,7 @@ int main(void) {
|
|||
test_get_current_dir_name();
|
||||
test_getcwd();
|
||||
test_gethostname();
|
||||
test_getpeername();
|
||||
test_getpwuid_r();
|
||||
test_getrlimit();
|
||||
test_getrusage();
|
||||
|
|
Loading…
Reference in New Issue