Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Sep 2014 14:32:08 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r271396 - head/sys/netinet6
Message-ID:  <201409101432.s8AEW8Am097180@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409101432.s8AEW8Am097180>