diff --git a/src/libsystemd-network/fuzz-ndisc-rs.c b/src/libsystemd-network/fuzz-ndisc-rs.c index 7a5c45a2f97..5493538fec0 100644 --- a/src/libsystemd-network/fuzz-ndisc-rs.c +++ b/src/libsystemd-network/fuzz-ndisc-rs.c @@ -24,12 +24,17 @@ int icmp6_bind_router_advertisement(int index) { return -ENOSYS; } -int icmp6_receive(int fd, void *iov_base, size_t iov_len, - struct in6_addr *dst, triple_timestamp *timestamp) { +int icmp6_receive( + int fd, + void *iov_base, + size_t iov_len, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp) { + assert_se(read(fd, iov_base, iov_len) == (ssize_t) iov_len); - if (timestamp) - triple_timestamp_get(timestamp); + if (ret_timestamp) + triple_timestamp_get(ret_timestamp); return 0; } diff --git a/src/libsystemd-network/icmp6-util.c b/src/libsystemd-network/icmp6-util.c index ecddab61e42..46318505bae 100644 --- a/src/libsystemd-network/icmp6-util.c +++ b/src/libsystemd-network/icmp6-util.c @@ -144,8 +144,12 @@ int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) { return 0; } -int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *ret_dst, - triple_timestamp *ret_timestamp) { +int icmp6_receive( + int fd, + void *buffer, + size_t size, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp) { /* This needs to be initialized with zero. See #20741. */ CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(int)) + /* ttl */ @@ -206,10 +210,14 @@ int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *ret_dst, } } - if (!triple_timestamp_is_set(&t)) - triple_timestamp_get(&t); + if (ret_timestamp) { + if (triple_timestamp_is_set(&t)) + *ret_timestamp = t; + else + triple_timestamp_get(ret_timestamp); + } - *ret_dst = addr; - *ret_timestamp = t; + if (ret_sender) + *ret_sender = addr; return 0; } diff --git a/src/libsystemd-network/icmp6-util.h b/src/libsystemd-network/icmp6-util.h index f7ad26b5e61..0a9ecb4c44d 100644 --- a/src/libsystemd-network/icmp6-util.h +++ b/src/libsystemd-network/icmp6-util.h @@ -20,5 +20,9 @@ int icmp6_bind_router_solicitation(int ifindex); int icmp6_bind_router_advertisement(int ifindex); int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr); -int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *ret_dst, - triple_timestamp *ret_timestamp); +int icmp6_receive( + int fd, + void *buffer, + size_t size, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp); diff --git a/src/libsystemd-network/test-ndisc-ra.c b/src/libsystemd-network/test-ndisc-ra.c index bd8c0fd426a..d3d96e776c1 100644 --- a/src/libsystemd-network/test-ndisc-ra.c +++ b/src/libsystemd-network/test-ndisc-ra.c @@ -223,12 +223,17 @@ int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) { return 0; } -int icmp6_receive(int fd, void *iov_base, size_t iov_len, - struct in6_addr *dst, triple_timestamp *timestamp) { +int icmp6_receive( + int fd, + void *iov_base, + size_t iov_len, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp) { + assert_se(read (fd, iov_base, iov_len) == (ssize_t)iov_len); - if (timestamp) - triple_timestamp_get(timestamp); + if (ret_timestamp) + triple_timestamp_get(ret_timestamp); return 0; } diff --git a/src/libsystemd-network/test-ndisc-rs.c b/src/libsystemd-network/test-ndisc-rs.c index e501b643774..e7bf3fab589 100644 --- a/src/libsystemd-network/test-ndisc-rs.c +++ b/src/libsystemd-network/test-ndisc-rs.c @@ -176,12 +176,17 @@ int icmp6_bind_router_advertisement(int ifindex) { return -ENOSYS; } -int icmp6_receive(int fd, void *iov_base, size_t iov_len, - struct in6_addr *dst, triple_timestamp *timestamp) { +int icmp6_receive( + int fd, + void *iov_base, + size_t iov_len, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp) { + assert_se(read (fd, iov_base, iov_len) == (ssize_t)iov_len); - if (timestamp) - triple_timestamp_get(timestamp); + if (ret_timestamp) + triple_timestamp_get(ret_timestamp); return 0; }