libbb:/send_to_from: do not require that "to" should have the same AF. Closes 9146
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 15 Sep 2016 11:20:51 +0000 (13:20 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 15 Sep 2016 11:20:51 +0000 (13:20 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/udp_io.c

index a32af9bd2088fdf8595cc70cb65ee8c90b387f3a..6e3ef484e4a1f4419bdfce8807ba7ec14f922425 100644 (file)
@@ -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;