This fixes ntpd when queries are sent to secondary IPv4 IP addresses. See https://bugs.busybox.net/show_bug.cgi?id=9146 Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
		
			
				
	
	
		
			38 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 7cef4817d6d6d61a1166ed7dfc13537b95c65970 Mon Sep 17 00:00:00 2001
 | 
						|
From: Denys Vlasenko <vda.linux@googlemail.com>
 | 
						|
Date: Thu, 15 Sep 2016 13:20:51 +0200
 | 
						|
Subject: [PATCH] libbb:/send_to_from: do not require that "to" should have the
 | 
						|
 same AF. Closes 9146
 | 
						|
 | 
						|
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
 | 
						|
---
 | 
						|
 libbb/udp_io.c | 10 ++++++++--
 | 
						|
 1 file changed, 8 insertions(+), 2 deletions(-)
 | 
						|
 | 
						|
--- a/libbb/udp_io.c
 | 
						|
+++ b/libbb/udp_io.c
 | 
						|
@@ -70,7 +70,13 @@ send_to_from(int fd, void *buf, size_t l
 | 
						|
 	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 l
 | 
						|
 		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;
 |