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-head
mailing list