svn commit: r271396 - head/sys/netinet6

Andrey V. Elsukov ae at FreeBSD.org
Wed Sep 10 14:32:08 UTC 2014


Author: ae
Date: Wed Sep 10 14:32:07 2014
New Revision: 271396
URL: http://svnweb.freebsd.org/changeset/base/271396

Log:
  Add additional checks for IPV6_PKTINFO handling (RFC 3542):
  
  * Return ENETDOWN when interface specified by ipi6_ifindex is not
    enabled for IPv6 use.
  * Return EADDRNOTAVAIL when ipi6_ifindex specifies an interface, but the
    address ipi6_addr is not available for use on that interface.
  * Return EINVAL when ipi6_addr is multicast address.
  
  Obtained from:	Yandex LLC
  Sponsored by:	Yandex LLC

Modified:
  head/sys/netinet6/ip6_output.c

Modified: head/sys/netinet6/ip6_output.c
==============================================================================
--- head/sys/netinet6/ip6_output.c	Wed Sep 10 14:04:10 2014	(r271395)
+++ head/sys/netinet6/ip6_output.c	Wed Sep 10 14:32:07 2014	(r271396)
@@ -2559,7 +2559,8 @@ ip6_setpktopt(int optname, u_char *buf, 
 		    sticky && !IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr)) {
 			return (EINVAL);
 		}
-
+		if (IN6_IS_ADDR_MULTICAST(&pktinfo->ipi6_addr))
+			return (EINVAL);
 		/* validate the interface index if specified. */
 		if (pktinfo->ipi6_ifindex > V_if_index)
 			 return (ENXIO);
@@ -2568,7 +2569,19 @@ ip6_setpktopt(int optname, u_char *buf, 
 			if (ifp == NULL)
 				return (ENXIO);
 		}
-
+		if (ifp != NULL && (
+		    ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED))
+			return (ENETDOWN);
+
+		if (ifp != NULL &&
+		    !IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr)) {
+			struct in6_ifaddr *ia;
+
+			ia = in6ifa_ifpwithaddr(ifp, &pktinfo->ipi6_addr);
+			if (ia == NULL)
+				return (EADDRNOTAVAIL);
+			ifa_free(&ia->ia_ifa);
+		}
 		/*
 		 * We store the address anyway, and let in6_selectsrc()
 		 * validate the specified address.  This is because ipi6_addr


More information about the svn-src-all mailing list