Date: Mon, 2 Dec 2013 05:57:09 +0000 (UTC) From: "Andrey V. Elsukov" <ae@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r258834 - user/ae/inet6/sys/netinet6 Message-ID: <201312020557.rB25v9C6056916@svn.freebsd.org>
index | next in thread | raw e-mail
Author: ae Date: Mon Dec 2 05:57:09 2013 New Revision: 258834 URL: http://svnweb.freebsd.org/changeset/base/258834 Log: Use sa6_checkzone_pcb() function when inpcb is known. Modified: user/ae/inet6/sys/netinet6/in6_pcb.c user/ae/inet6/sys/netinet6/raw_ip6.c user/ae/inet6/sys/netinet6/scope6.c user/ae/inet6/sys/netinet6/udp6_usrreq.c Modified: user/ae/inet6/sys/netinet6/in6_pcb.c ============================================================================== --- user/ae/inet6/sys/netinet6/in6_pcb.c Mon Dec 2 05:45:11 2013 (r258833) +++ user/ae/inet6/sys/netinet6/in6_pcb.c Mon Dec 2 05:57:09 2013 (r258834) @@ -138,7 +138,7 @@ in6_pcbbind(struct inpcb *inp, struct so if (nam->sa_family != AF_INET6) return (EAFNOSUPPORT); /* Check sin6_scope_id. The caller must set it properly. */ - if ((error = sa6_checkzone(sin6)) != 0) + if ((error = sa6_checkzone_pcb(inp, sin6)) != 0) return (error); if ((error = prison_local_ip6(cred, &sin6->sin6_addr, @@ -323,7 +323,7 @@ in6_pcbconnect_mbuf(register struct inpc /* * Check sin6_scope_id and automatically fill it, if possible. */ - error = sa6_checkzone(sin6); + error = sa6_checkzone_pcb(inp, sin6); if (error != 0) return (error); if ((error = prison_remote_ip6(inp->inp_cred, &sin6->sin6_addr)) != 0) Modified: user/ae/inet6/sys/netinet6/raw_ip6.c ============================================================================== --- user/ae/inet6/sys/netinet6/raw_ip6.c Mon Dec 2 05:45:11 2013 (r258833) +++ user/ae/inet6/sys/netinet6/raw_ip6.c Mon Dec 2 05:57:09 2013 (r258834) @@ -734,7 +734,10 @@ rip6_bind(struct socket *so, struct sock return (error); if (TAILQ_EMPTY(&V_ifnet) || addr->sin6_family != AF_INET6) return (EADDRNOTAVAIL); - if ((error = sa6_checkzone(addr)) != 0) + INP_RLOCK(inp); + error = sa6_checkzone_pcb(inp, addr); + INP_RUNLOCK(inp); + if (error != 0) return (error); if (!IN6_IS_ADDR_UNSPECIFIED(&addr->sin6_addr)) { ifa = in6ifa_ifwithaddr(&addr->sin6_addr, addr->sin6_scope_id); @@ -775,7 +778,9 @@ rip6_connect(struct socket *so, struct s return (EADDRNOTAVAIL); if (addr->sin6_family != AF_INET6) return (EAFNOSUPPORT); - error = sa6_checkzone(addr); + INP_RLOCK(inp); + error = sa6_checkzone_pcb(inp, addr); + INP_RUNLOCK(inp); if (error != 0) return (error); @@ -873,7 +878,9 @@ rip6_send(struct socket *so, int flags, * Application must provide a proper zone ID or the use of * default zone IDs should be enabled. */ - ret = sa6_checkzone(dst); + INP_RLOCK(inp); + ret = sa6_checkzone_pcb(inp, dst); + INP_RUNLOCK(inp); if (ret != 0) { m_freem(m); return (ret); Modified: user/ae/inet6/sys/netinet6/scope6.c ============================================================================== --- user/ae/inet6/sys/netinet6/scope6.c Mon Dec 2 05:45:11 2013 (r258833) +++ user/ae/inet6/sys/netinet6/scope6.c Mon Dec 2 05:57:09 2013 (r258834) @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #include <net/vnet.h> #include <netinet/in.h> - +#include <netinet/in_pcb.h> #include <netinet/ip6.h> #include <netinet6/in6_var.h> #include <netinet6/ip6_var.h> Modified: user/ae/inet6/sys/netinet6/udp6_usrreq.c ============================================================================== --- user/ae/inet6/sys/netinet6/udp6_usrreq.c Mon Dec 2 05:45:11 2013 (r258833) +++ user/ae/inet6/sys/netinet6/udp6_usrreq.c Mon Dec 2 05:57:09 2013 (r258834) @@ -1073,6 +1073,7 @@ static int udp6_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, struct thread *td) { + struct sockaddr_in6 tmp; struct inpcb *inp; int error = 0; @@ -1093,7 +1094,9 @@ udp6_send(struct socket *so, int flags, * Application must provide a proper zone ID or the use of * default zone IDs should be enabled. */ - error = sa6_checkzone((struct sockaddr_in6*)addr); + tmp = *(struct sockaddr_in6 *)addr; + addr = (struct sockaddr *)&tmp; + error = sa6_checkzone_pcb(inp, &tmp); if (error != 0) goto bad; }help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312020557.rB25v9C6056916>
