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
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to