Date: Sat, 9 Apr 2011 12:38:09 +0000 (UTC) From: "Bjoern A. Zeeb" <bz@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org Subject: svn commit: r220490 - stable/7/sys/netinet6 Message-ID: <201104091238.p39Cc9ko014066@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: bz Date: Sat Apr 9 12:38:09 2011 New Revision: 220490 URL: http://svn.freebsd.org/changeset/base/220490 Log: MFC r219570: Push a possible "unbind" in some situation from in6_pcbsetport() to callers. This also fixes a problem when the prison call could set the inp->in6p_laddr (laddr) and a following priv_check_cred() call would return an error and will allow us to merge the IPv4 and IPv6 implementation. Modified: stable/7/sys/netinet6/in6_pcb.c stable/7/sys/netinet6/in6_src.c stable/7/sys/netinet6/udp6_usrreq.c Directory Properties: stable/7/sys/ (props changed) stable/7/sys/cddl/contrib/opensolaris/ (props changed) stable/7/sys/contrib/dev/acpica/ (props changed) stable/7/sys/contrib/pf/ (props changed) Modified: stable/7/sys/netinet6/in6_pcb.c ============================================================================== --- stable/7/sys/netinet6/in6_pcb.c Sat Apr 9 12:35:08 2011 (r220489) +++ stable/7/sys/netinet6/in6_pcb.c Sat Apr 9 12:38:09 2011 (r220490) @@ -252,8 +252,11 @@ in6_pcbbind(register struct inpcb *inp, inp->in6p_laddr = sin6->sin6_addr; } if (lport == 0) { - if ((error = in6_pcbsetport(&inp->in6p_laddr, inp, cred)) != 0) + if ((error = in6_pcbsetport(&inp->in6p_laddr, inp, cred)) != 0) { + /* Undo an address bind that may have occurred. */ + inp->in6p_laddr = in6addr_any; return (error); + } } else { inp->inp_lport = lport; if (in_pcbinshash(inp) != 0) { Modified: stable/7/sys/netinet6/in6_src.c ============================================================================== --- stable/7/sys/netinet6/in6_src.c Sat Apr 9 12:35:08 2011 (r220489) +++ stable/7/sys/netinet6/in6_src.c Sat Apr 9 12:38:09 2011 (r220490) @@ -858,11 +858,8 @@ in6_pcbsetport(struct in6_addr *laddr, s count = last - first; do { - if (count-- < 0) { /* completely used? */ - /* Undo an address bind that may have occurred. */ - inp->in6p_laddr = in6addr_any; + if (count-- < 0) /* completely used? */ return (EADDRNOTAVAIL); - } ++*lastport; if (*lastport < first || *lastport > last) *lastport = first; Modified: stable/7/sys/netinet6/udp6_usrreq.c ============================================================================== --- stable/7/sys/netinet6/udp6_usrreq.c Sat Apr 9 12:35:08 2011 (r220489) +++ stable/7/sys/netinet6/udp6_usrreq.c Sat Apr 9 12:38:09 2011 (r220490) @@ -597,8 +597,11 @@ udp6_output(struct inpcb *inp, struct mb goto release; } if (inp->inp_lport == 0 && - (error = in6_pcbsetport(laddr, inp, td->td_ucred)) != 0) + (error = in6_pcbsetport(laddr, inp, td->td_ucred)) != 0) { + /* Undo an address bind that may have occurred. */ + inp->in6p_laddr = in6addr_any; goto release; + } } else { if (IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) { error = ENOTCONN;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104091238.p39Cc9ko014066>