From owner-svn-src-head@FreeBSD.ORG Tue Dec 16 02:06:27 2008 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 49A33106564A; Tue, 16 Dec 2008 02:06:27 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3607C8FC08; Tue, 16 Dec 2008 02:06:27 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBG26R60023302; Tue, 16 Dec 2008 02:06:27 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBG26RCX023301; Tue, 16 Dec 2008 02:06:27 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812160206.mBG26RCX023301@svn.freebsd.org> From: Kip Macy Date: Tue, 16 Dec 2008 02:06:27 +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: r186157 - 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: Tue, 16 Dec 2008 02:06:27 -0000 Author: kmacy Date: Tue Dec 16 02:06:26 2008 New Revision: 186157 URL: http://svn.freebsd.org/changeset/base/186157 Log: make sure redirect doesn't return without dropping the lock Modified: head/sys/netinet6/icmp6.c Modified: head/sys/netinet6/icmp6.c ============================================================================== --- head/sys/netinet6/icmp6.c Tue Dec 16 02:05:11 2008 (r186156) +++ head/sys/netinet6/icmp6.c Tue Dec 16 02:06:26 2008 (r186157) @@ -2453,6 +2453,7 @@ icmp6_redirect_output(struct mbuf *m0, s struct mbuf *m = NULL; /* newly allocated one */ struct ip6_hdr *ip6; /* m as struct ip6_hdr */ struct nd_redirect *nd_rd; + struct llentry *ln = NULL; size_t maxlen; u_char *p; struct ifnet *outif = NULL; @@ -2575,20 +2576,19 @@ icmp6_redirect_output(struct mbuf *m0, s { /* target lladdr option */ int len; - struct llentry *ln; struct nd_opt_hdr *nd_opt; char *lladdr; IF_AFDATA_LOCK(ifp); ln = nd6_lookup(router_ll6, 0, ifp); IF_AFDATA_UNLOCK(ifp); - if (!ln) + if (ln == NULL) goto nolladdropt; len = sizeof(*nd_opt) + ifp->if_addrlen; len = (len + 7) & ~7; /* round by 8 */ /* safety check */ - if (len + (p - (u_char *)ip6) > maxlen) + if (len + (p - (u_char *)ip6) > maxlen) goto nolladdropt; if (ln->la_flags & LLE_VALID) { @@ -2599,10 +2599,11 @@ icmp6_redirect_output(struct mbuf *m0, s bcopy(&ln->ll_addr, lladdr, ifp->if_addrlen); p += len; } - LLE_RUNLOCK(ln); } -nolladdropt:; - +nolladdropt: + if (ln != NULL) + LLE_RUNLOCK(ln); + m->m_pkthdr.len = m->m_len = p - (u_char *)ip6; /* just to be safe */