From owner-svn-src-head@FreeBSD.ORG Sat Mar 12 16:45:15 2011 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DAA0A106566B; Sat, 12 Mar 2011 16:45:15 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B145D8FC1B; Sat, 12 Mar 2011 16:45:15 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2CGjFB6024391; Sat, 12 Mar 2011 16:45:15 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2CGjF3p024387; Sat, 12 Mar 2011 16:45:15 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201103121645.p2CGjF3p024387@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Sat, 12 Mar 2011 16:45:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219570 - head/sys/netinet6 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 12 Mar 2011 16:45:15 -0000 Author: bz Date: Sat Mar 12 16:45:15 2011 New Revision: 219570 URL: http://svn.freebsd.org/changeset/base/219570 Log: 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. MFC after: 2 weeks Modified: head/sys/netinet6/in6_pcb.c head/sys/netinet6/in6_src.c head/sys/netinet6/udp6_usrreq.c Modified: head/sys/netinet6/in6_pcb.c ============================================================================== --- head/sys/netinet6/in6_pcb.c Sat Mar 12 14:57:10 2011 (r219569) +++ head/sys/netinet6/in6_pcb.c Sat Mar 12 16:45:15 2011 (r219570) @@ -256,8 +256,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: head/sys/netinet6/in6_src.c ============================================================================== --- head/sys/netinet6/in6_src.c Sat Mar 12 14:57:10 2011 (r219569) +++ head/sys/netinet6/in6_src.c Sat Mar 12 16:45:15 2011 (r219570) @@ -925,11 +925,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: head/sys/netinet6/udp6_usrreq.c ============================================================================== --- head/sys/netinet6/udp6_usrreq.c Sat Mar 12 14:57:10 2011 (r219569) +++ head/sys/netinet6/udp6_usrreq.c Sat Mar 12 16:45:15 2011 (r219570) @@ -656,8 +656,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;