← Commit list

7cef4817d

Denys Vlasenko
Denys Vlasenko
2016-09-15
SUCCESS Duration: 206s

Subject

libbb:/send_to_from: do not require that "to" should have the same AF. Closes 9146

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

libbb/udp_io.c+8 -2
@@ -70,7 +70,13 @@ send_to_from(int fd, void *buf, size_t len, int flags,
msg.msg_flags = flags;
cmsgptr = CMSG_FIRSTHDR(&msg);
- if (to->sa_family == AF_INET && from->sa_family == AF_INET) {
+ /*
+ * Users report that to->sa_family can be AF_INET6 too,
+ * if "to" was acquired by recv_from_to(). IOW: recv_from_to()
+ * was seen showing IPv6 "from" even when the destination
+ * of received packet (our local address) was IPv4.
+ */
+ if (/* to->sa_family == AF_INET && */ from->sa_family == AF_INET) {
struct in_pktinfo *pktptr;
cmsgptr->cmsg_level = IPPROTO_IP;
cmsgptr->cmsg_type = IP_PKTINFO;
@@ -86,7 +92,7 @@ send_to_from(int fd, void *buf, size_t len, int flags,
pktptr->ipi_spec_dst = ((struct sockaddr_in*)from)->sin_addr;
}
# if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
- else if (to->sa_family == AF_INET6 && from->sa_family == AF_INET6) {
+ else if (/* to->sa_family == AF_INET6 && */ from->sa_family == AF_INET6) {
struct in6_pktinfo *pktptr;
cmsgptr->cmsg_level = IPPROTO_IPV6;
cmsgptr->cmsg_type = IPV6_PKTINFO;