From owner-svn-src-all@FreeBSD.ORG  Thu Jul  8 12:21:26 2010
Return-Path: <owner-svn-src-all@FreeBSD.ORG>
Delivered-To: svn-src-all@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 08F38106566B;
	Thu,  8 Jul 2010 12:21:26 +0000 (UTC)
	(envelope-from glebius@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id EC44A8FC23;
	Thu,  8 Jul 2010 12:21:25 +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 o68CLPun008818;
	Thu, 8 Jul 2010 12:21:25 GMT (envelope-from glebius@svn.freebsd.org)
Received: (from glebius@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o68CLPOc008816;
	Thu, 8 Jul 2010 12:21:25 GMT (envelope-from glebius@svn.freebsd.org)
Message-Id: <201007081221.o68CLPOc008816@svn.freebsd.org>
From: Gleb Smirnoff <glebius@FreeBSD.org>
Date: Thu, 8 Jul 2010 12:21:25 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-all@freebsd.org,
	svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
X-SVN-Group: stable-8
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r209796 - stable/8/sys/netgraph
X-BeenThere: svn-src-all@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the entire src tree \(except for &quot;
	user&quot; and &quot; projects&quot; \)" <svn-src-all.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-all>,
	<mailto:svn-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-all>
List-Post: <mailto:svn-src-all@freebsd.org>
List-Help: <mailto:svn-src-all-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-all>,
	<mailto:svn-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 08 Jul 2010 12:21:26 -0000

Author: glebius
Date: Thu Jul  8 12:21:25 2010
New Revision: 209796
URL: http://svn.freebsd.org/changeset/base/209796

Log:
  Merge 209633, 209722 from head:
  
    The struct ipfw_rule_ref follows the struct m_tag. Deal with this
    correctly. This fixes breakage of ng_ipfw(4) in r201527.
  
  Submitted by:	Alexander Zagrebin <alexz visp.ru>
  
    Avoid double-free. In error cases ipfw(4) frees the mbuf(4), we don't
    need to.
  
  PR:		kern/145462

Modified:
  stable/8/sys/netgraph/ng_ipfw.c

Modified: stable/8/sys/netgraph/ng_ipfw.c
==============================================================================
--- stable/8/sys/netgraph/ng_ipfw.c	Thu Jul  8 12:20:15 2010	(r209795)
+++ stable/8/sys/netgraph/ng_ipfw.c	Thu Jul  8 12:21:25 2010	(r209796)
@@ -221,20 +221,21 @@ ng_ipfw_findhook1(node_p node, u_int16_t
 static int
 ng_ipfw_rcvdata(hook_p hook, item_p item)
 {
-	struct ipfw_rule_ref	*tag;
+	struct m_tag *tag;
+	struct ipfw_rule_ref *r;
 	struct mbuf *m;
 
 	NGI_GET_M(item, m);
 	NG_FREE_ITEM(item);
 
-	tag = (struct ipfw_rule_ref *)
-		m_tag_locate(m, MTAG_IPFW_RULE, 0, NULL);
+	tag = m_tag_locate(m, MTAG_IPFW_RULE, 0, NULL);
 	if (tag == NULL) {
 		NG_FREE_M(m);
 		return (EINVAL);	/* XXX: find smth better */
 	};
 
-	if (tag->info & IPFW_INFO_IN) {
+	r = (struct ipfw_rule_ref *)(tag + 1);
+	if (r->info & IPFW_INFO_IN) {
 		ip_input(m);
 		return (0);
 	} else {
@@ -264,11 +265,8 @@ ng_ipfw_input(struct mbuf **m0, int dir,
 	 * Node must be loaded and corresponding hook must be present.
 	 */
 	if (fw_node == NULL || 
-	   (hook = ng_ipfw_findhook1(fw_node, fwa->rule.info)) == NULL) {
-		if (tee == 0)
-			m_freem(*m0);
+	   (hook = ng_ipfw_findhook1(fw_node, fwa->rule.info)) == NULL)
 		return (ESRCH);		/* no hook associated with this rule */
-	}
 
 	/*
 	 * We have two modes: in normal mode we add a tag to packet, which is