mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Chris Wright <chrisw@sous-sol.org>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
	Zwane Mwaikambo <zwane@arm.linux.org.uk>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Randy Dunlap <rdunlap@xenotime.net>,
	Dave Jones <davej@redhat.com>,
	Chuck Wolber <chuckw@quantumlinux.com>,
	Chris Wedgwood <reviews@ml.cw.f00f.org>,
	Michael Krufky <mkrufky@linuxtv.org>,
	torvalds@osdl.org, akpm@osdl.org, alan@lxorguk.ukuu.org.uk,
	Patrick McHardy <kaber@trash.net>,
	davem@davemloft.net, Dmitry Mishin <dim@openvz.org>,
	Vasily Averin <vvs@openvz.org>, Kirill Korotaev <dev@openvz.org>
Subject: [patch 04/23] NETFILTER: ip_tables: fix module refcount leaks in compat error paths
Date: Wed, 29 Nov 2006 14:00:15 -0800	[thread overview]
Message-ID: <20061129220336.447826000@sous-sol.org> (raw)
In-Reply-To: <20061129220111.137430000@sous-sol.org>

[-- Attachment #1: netfilter-ip_tables-fix-module-refcount-leaks-in-compat-error-paths.patch --]
[-- Type: text/plain, Size: 4637 bytes --]

-stable review patch.  If anyone has any objections, please let us know.
------------------

From: Patrick McHardy <kaber@trash.net>

Based on patch by myself with additional fixes from Dmitry Mishin <dim@openvz.org>.

Signed-off-by: Dmitry Mishin <dim@openvz.org>
Acked-by: Vasily Averin <vvs@openvz.org>
Acked-by: Kirill Korotaev <dev@openvz.org>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>

---
commit 94a3d63f9ca6cb404f62ee4186d20fec3e8bdc97
tree 86873a5eff586598eceabdbe4c042c55f62d4fbc
parent efb1447a67abac93048ad7af0c59cd9b5a9177a6
author Patrick McHardy <kaber@trash.net> Fri, 17 Nov 2006 06:23:20 +0100
committer Patrick McHardy <kaber@trash.net> Fri, 17 Nov 2006 06:23:20 +0100

 net/ipv4/netfilter/ip_tables.c |   36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

--- linux-2.6.18.4.orig/net/ipv4/netfilter/ip_tables.c
+++ linux-2.6.18.4/net/ipv4/netfilter/ip_tables.c
@@ -1537,7 +1537,7 @@ check_compat_entry_size_and_hooks(struct
 	ret = IPT_MATCH_ITERATE(e, compat_check_calc_match, name, &e->ip,
 			e->comefrom, &off, &j);
 	if (ret != 0)
-		goto out;
+		goto cleanup_matches;
 
 	t = ipt_get_target(e);
 	target = try_then_request_module(xt_find_target(AF_INET,
@@ -1547,7 +1547,7 @@ check_compat_entry_size_and_hooks(struct
 	if (IS_ERR(target) || !target) {
 		duprintf("check_entry: `%s' not found\n", t->u.user.name);
 		ret = target ? PTR_ERR(target) : -ENOENT;
-		goto out;
+		goto cleanup_matches;
 	}
 	t->u.kernel.target = target;
 
@@ -1574,7 +1574,10 @@ check_compat_entry_size_and_hooks(struct
 
 	(*i)++;
 	return 0;
+
 out:
+	module_put(t->u.kernel.target->me);
+cleanup_matches:
 	IPT_MATCH_ITERATE(e, cleanup_match, &j);
 	return ret;
 }
@@ -1597,18 +1600,16 @@ static inline int compat_copy_match_from
 	ret = xt_check_match(match, AF_INET, dm->u.match_size - sizeof(*dm),
 			     name, hookmask, ip->proto,
 			     ip->invflags & IPT_INV_PROTO);
-	if (ret)
-		return ret;
 
-	if (m->u.kernel.match->checkentry
+	if (!ret && m->u.kernel.match->checkentry
 	    && !m->u.kernel.match->checkentry(name, ip, match, dm->data,
 					      dm->u.match_size - sizeof(*dm),
 					      hookmask)) {
 		duprintf("ip_tables: check failed for `%s'.\n",
 			 m->u.kernel.match->name);
-		return -EINVAL;
+		ret = -EINVAL;
 	}
-	return 0;
+	return ret;
 }
 
 static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr,
@@ -1630,7 +1631,7 @@ static int compat_copy_entry_from_user(s
 	ret = IPT_MATCH_ITERATE(e, compat_copy_match_from_user, dstptr, size,
 			name, &de->ip, de->comefrom);
 	if (ret)
-		goto out;
+		goto err;
 	de->target_offset = e->target_offset - (origsize - *size);
 	t = ipt_get_target(e);
 	target = t->u.kernel.target;
@@ -1653,22 +1654,22 @@ static int compat_copy_entry_from_user(s
 			      name, e->comefrom, e->ip.proto,
 			      e->ip.invflags & IPT_INV_PROTO);
 	if (ret)
-		goto out;
+		goto err;
 
 	ret = -EINVAL;
 	if (t->u.kernel.target == &ipt_standard_target) {
 		if (!standard_check(t, *size))
-			goto out;
+			goto err;
 	} else if (t->u.kernel.target->checkentry
 		   && !t->u.kernel.target->checkentry(name, de, target,
 				t->data, t->u.target_size - sizeof(*t),
 				de->comefrom)) {
 		duprintf("ip_tables: compat: check failed for `%s'.\n",
 			 t->u.kernel.target->name);
-		goto out;
+		goto err;
 	}
 	ret = 0;
-out:
+ err:
 	return ret;
 }
 
@@ -1682,7 +1683,7 @@ translate_compat_table(const char *name,
 		unsigned int *hook_entries,
 		unsigned int *underflows)
 {
-	unsigned int i;
+	unsigned int i, j;
 	struct xt_table_info *newinfo, *info;
 	void *pos, *entry0, *entry1;
 	unsigned int size;
@@ -1700,21 +1701,21 @@ translate_compat_table(const char *name,
 	}
 
 	duprintf("translate_compat_table: size %u\n", info->size);
-	i = 0;
+	j = 0;
 	xt_compat_lock(AF_INET);
 	/* Walk through entries, checking offsets. */
 	ret = IPT_ENTRY_ITERATE(entry0, total_size,
 				check_compat_entry_size_and_hooks,
 				info, &size, entry0,
 				entry0 + total_size,
-				hook_entries, underflows, &i, name);
+				hook_entries, underflows, &j, name);
 	if (ret != 0)
 		goto out_unlock;
 
 	ret = -EINVAL;
-	if (i != number) {
+	if (j != number) {
 		duprintf("translate_compat_table: %u not %u entries\n",
-			 i, number);
+			 j, number);
 		goto out_unlock;
 	}
 
@@ -1773,6 +1774,7 @@ translate_compat_table(const char *name,
 free_newinfo:
 	xt_free_table_info(newinfo);
 out:
+	IPT_ENTRY_ITERATE(entry0, total_size, cleanup_entry, &j);
 	return ret;
 out_unlock:
 	compat_flush_offsets();

--

  parent reply	other threads:[~2006-11-29 22:01 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-29 22:00 [patch 00/23] -stable review Chris Wright
2006-11-29 22:00 ` [patch 01/23] scsi: clear garbage after CDBs on SG_IO Chris Wright
2006-11-29 22:00 ` [patch 02/23] NETFILTER: Missing check for CAP_NET_ADMIN in iptables compat layer Chris Wright
2006-11-29 22:00 ` [patch 03/23] NETFILTER: ip_tables: compat error way cleanup Chris Wright
2006-11-29 22:00 ` Chris Wright [this message]
2006-11-29 22:00 ` [patch 05/23] NETFILTER: Missed and reordered checks in {arp,ip,ip6}_tables Chris Wright
2006-11-29 22:00 ` [patch 06/23] NETFILTER: arp_tables: missing unregistration on module unload Chris Wright
2006-11-29 22:00 ` [patch 07/23] NETFILTER: Honour source routing for LVS-NAT Chris Wright
2006-11-29 22:00 ` [patch 08/23] NETFILTER: Kconfig: fix xt_physdev dependencies Chris Wright
2006-11-29 22:00 ` [patch 09/23] NETFILTER: xt_CONNSECMARK: fix Kconfig dependencies Chris Wright
2006-11-29 22:00 ` [patch 10/23] bcm43xx: Drain TX status before starting IRQs Chris Wright
2006-11-29 22:00 ` [patch 11/23] NETFILTER: H.323 conntrack: fix crash with CONFIG_IP_NF_CT_ACCT Chris Wright
2006-11-29 22:00 ` [patch 12/23] pcmcia: fix rmmod pcmcia with unbound devices Chris Wright
2006-11-29 22:00 ` [patch 13/23] V4L: Do not enable VIDEO_V4L2 unconditionally Chris Wright
2006-11-29 22:00 ` [patch 14/23] x86 microcode: dont check the size Chris Wright
2006-12-02  6:44   ` Willy Tarreau
2006-12-03  1:28     ` Bill Davidsen
2006-12-04  1:04     ` Shaohua Li
2006-12-04  1:31       ` Willy Tarreau
2006-11-29 22:00 ` [patch 15/23] alpha: Fix ALPHA_EV56 dependencies typo Chris Wright
2006-11-29 22:00 ` [patch 16/23] softmac: fix a slab corruption in WEP restricted key association Chris Wright
2006-11-29 22:00 ` [patch 17/23] TG3: Add missing unlock in tg3_open() error path Chris Wright
2006-11-29 22:00 ` [patch 18/23] IPV6: Fix address/interface handling in UDP and DCCP, according to the scoping architecture Chris Wright
2006-11-29 22:00 ` [patch 19/23] IA64: bte_unaligned_copy() transfers one extra cache line Chris Wright
2006-11-29 22:00 ` [patch 20/23] BLUETOOTH: Fix unaligned access in hci_send_to_sock Chris Wright
2006-11-29 22:00 ` [patch 21/23] AGP: Allocate AGP pages with GFP_DMA32 by default Chris Wright
2006-11-29 22:00 ` [patch 22/23] fuse: fix Oops in lookup Chris Wright
2006-11-29 22:00 ` [patch 23/23] UDP: Make udp_encap_rcv use pskb_may_pull Chris Wright
2006-11-29 22:40 ` [patch 00/23] -stable review Dave Jones
2006-11-29 23:24   ` [stable] " Chris Wright

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20061129220336.447826000@sous-sol.org \
    --to=chrisw@sous-sol.org \
    --cc=akpm@osdl.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=chuckw@quantumlinux.com \
    --cc=davej@redhat.com \
    --cc=davem@davemloft.net \
    --cc=dev@openvz.org \
    --cc=dim@openvz.org \
    --cc=jmforbes@linuxtx.org \
    --cc=kaber@trash.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mkrufky@linuxtv.org \
    --cc=rdunlap@xenotime.net \
    --cc=reviews@ml.cw.f00f.org \
    --cc=stable@kernel.org \
    --cc=torvalds@osdl.org \
    --cc=tytso@mit.edu \
    --cc=vvs@openvz.org \
    --cc=zwane@arm.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®