[DFSan] Add custom wrapper for getsockname.

The wrapper clears shadow for any bytes written to addr or addrlen.

Reviewed By: stephan.yichao.zhao

Differential Revision: https://reviews.llvm.org/D92964
This commit is contained in:
Matt Morehouse 2020-12-10 07:42:11 -08:00
parent 4ce242a163
commit 8a874a4277
3 changed files with 37 additions and 0 deletions

View File

@ -927,6 +927,21 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getsockopt(
return ret;
}
SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getsockname(
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 = getsockname(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)(

View File

@ -194,6 +194,7 @@ fun:get_current_dir_name=custom
fun:gethostname=custom
fun:getrlimit=custom
fun:getrusage=custom
fun:getsockname=custom
fun:getsockopt=custom
fun:nanosleep=custom
fun:pread=custom

View File

@ -931,6 +931,26 @@ void test_socketpair() {
ASSERT_READ_ZERO_LABEL(fd, sizeof(fd));
}
void test_getsockname() {
int sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);
assert(sockfd != -1);
struct sockaddr addr = {};
socklen_t addrlen = sizeof(addr);
dfsan_set_label(i_label, &addr, addrlen);
dfsan_set_label(i_label, &addrlen, sizeof(addrlen));
int ret = getsockname(sockfd, &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(sockfd);
}
void test_getsockopt() {
int sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);
assert(sockfd != -1);
@ -1134,6 +1154,7 @@ int main(void) {
test_getpwuid_r();
test_getrlimit();
test_getrusage();
test_getsockname();
test_getsockopt();
test_gettimeofday();
test_inet_pton();