netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Patrick McHardy <kaber@trash.net>
To: Jon Masters <jonathan@jonmasters.org>
Cc: Alexey Dobriyan <adobriyan@gmail.com>,
	Eric Dumazet <eric.dumazet@gmail.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	netdev <netdev@vger.kernel.org>,
	netfilter-devel <netfilter-devel@vger.kernel.org>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: Re: [PATCH] netfilter: per netns nf_conntrack_cachep
Date: Wed, 03 Feb 2010 13:10:36 +0100	[thread overview]
Message-ID: <4B6967BC.600@trash.net> (raw)
In-Reply-To: <4B6870AF.6060109@trash.net>

[-- Attachment #1: Type: text/plain, Size: 914 bytes --]

Patrick McHardy wrote:
> Jon Masters wrote:
>> On Tue, 2010-02-02 at 19:58 +0200, Alexey Dobriyan wrote:
>>
>>> Yes, moving to init_net-only function is fine.
>> So moving the "setup up fake conntrack" bits to init_init_net from
>> init_net still results in the panic, which means that the use count
>> really is dropping to zero and we really are trying to free it when
>> using multiple namespaces. Per ns is probably an easier way to go.
> 
> Agreed, that will also avoid problems in the future with the
> ct_net pointer pointing to &init_net. I'll take care of this
> tommorrow.

Unfortunately a per-namespace conntrack is not easily possible without
larger changes (most of which are already queued in nf-next-2.6.git
though). So for now I just moved the untrack handling to the init_net
setup and cleanup functions and we can try to fix the remainder in
2.6.34.

Jon, could you give this patch a try please?

[-- Attachment #2: x --]
[-- Type: text/plain, Size: 3006 bytes --]

commit 056ff3e3bd1563969a311697323ff929df94415c
Author: Patrick McHardy <kaber@trash.net>
Date:   Wed Feb 3 12:58:06 2010 +0100

    netfilter: nf_conntrack: fix memory corruption with multiple namespaces
    
    As discovered by Jon Masters <jonathan@jonmasters.org>, the "untracked"
    conntrack, which is located in the data section, might be accidentally
    freed when a new namespace is instantiated while the untracked conntrack
    is attached to a skb because the reference count it re-initialized.
    
    The best fix would be to use a seperate untracked conntrack per
    namespace since it includes a namespace pointer. Unfortunately this is
    not possible without larger changes since the namespace is not easily
    available everywhere we need it. For now move the untracked conntrack
    initialization to the init_net setup function to make sure the reference
    count is not re-initialized and handle cleanup in the init_net cleanup
    function to make sure namespaces can exit properly while the untracked
    conntrack is in use in other namespaces.
    
    Signed-off-by: Patrick McHardy <kaber@trash.net>

diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index 0e98c32..37e2b88 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -1113,6 +1113,10 @@ static void nf_ct_release_dying_list(struct net *net)
 
 static void nf_conntrack_cleanup_init_net(void)
 {
+	/* wait until all references to nf_conntrack_untracked are dropped */
+	while (atomic_read(&nf_conntrack_untracked.ct_general.use) > 1)
+		schedule();
+
 	nf_conntrack_helper_fini();
 	nf_conntrack_proto_fini();
 	kmem_cache_destroy(nf_conntrack_cachep);
@@ -1127,9 +1131,6 @@ static void nf_conntrack_cleanup_net(struct net *net)
 		schedule();
 		goto i_see_dead_people;
 	}
-	/* wait until all references to nf_conntrack_untracked are dropped */
-	while (atomic_read(&nf_conntrack_untracked.ct_general.use) > 1)
-		schedule();
 
 	nf_ct_free_hashtable(net->ct.hash, net->ct.hash_vmalloc,
 			     nf_conntrack_htable_size);
@@ -1288,6 +1289,14 @@ static int nf_conntrack_init_init_net(void)
 	if (ret < 0)
 		goto err_helper;
 
+	/* Set up fake conntrack: to never be deleted, not in any hashes */
+#ifdef CONFIG_NET_NS
+	nf_conntrack_untracked.ct_net = &init_net;
+#endif
+	atomic_set(&nf_conntrack_untracked.ct_general.use, 1);
+	/*  - and look it like as a confirmed connection */
+	set_bit(IPS_CONFIRMED_BIT, &nf_conntrack_untracked.status);
+
 	return 0;
 
 err_helper:
@@ -1333,15 +1342,6 @@ static int nf_conntrack_init_net(struct net *net)
 	if (ret < 0)
 		goto err_ecache;
 
-	/* Set up fake conntrack:
-	    - to never be deleted, not in any hashes */
-#ifdef CONFIG_NET_NS
-	nf_conntrack_untracked.ct_net = &init_net;
-#endif
-	atomic_set(&nf_conntrack_untracked.ct_general.use, 1);
-	/*  - and look it like as a confirmed connection */
-	set_bit(IPS_CONFIRMED_BIT, &nf_conntrack_untracked.status);
-
 	return 0;
 
 err_ecache:

  parent reply	other threads:[~2010-02-03 12:10 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-30  1:10 debug: nt_conntrack and KVM crash Jon Masters
2010-01-30  1:57 ` Jon Masters
2010-01-30  1:59   ` Jon Masters
2010-01-30  6:58     ` Eric Dumazet
2010-01-30  7:36       ` Jon Masters
2010-01-30  7:40         ` Jon Masters
2010-01-30  8:33         ` Eric Dumazet
2010-01-30 10:03           ` Jon Masters
2010-02-01  9:32       ` Jon Masters
2010-02-01  9:36         ` Alexey Dobriyan
2010-02-01 10:12           ` Eric Dumazet
2010-02-01 10:25             ` Alexey Dobriyan
2010-02-01 10:38               ` Jon Masters
2010-02-01 11:23               ` Eric Dumazet
2010-02-01 14:48                 ` Alexey Dobriyan
2010-02-01 14:57                   ` Eric Dumazet
2010-02-01 14:52                 ` [PATCH] netfilter: per netns nf_conntrack_cachep Eric Dumazet
2010-02-01 14:58                   ` Alexey Dobriyan
2010-02-01 15:02                     ` Eric Dumazet
2010-02-02 11:04                       ` Jon Masters
2010-02-02 11:35                         ` Jon Masters
2010-02-02 16:46                           ` Jon Masters
2010-02-02 16:48                             ` Patrick McHardy
2010-02-02 17:07                               ` Jon Masters
2010-02-02 17:58                                 ` Alexey Dobriyan
2010-02-02 18:16                                   ` Jon Masters
2010-02-02 18:34                                     ` Jon Masters
2010-02-02 18:36                                     ` Patrick McHardy
2010-02-02 18:39                                       ` Jon Masters
2010-02-02 18:42                                         ` Jon Masters
2010-02-03 12:10                                       ` Patrick McHardy [this message]
2010-02-03 18:38                                         ` Jon Masters
2010-02-03 19:09                                           ` Alexey Dobriyan
2010-02-03 19:43                                             ` Jon Masters
2010-02-03 19:46                                               ` Jon Masters
2010-02-03 19:53                                                 ` Alexey Dobriyan
2010-02-03 20:04                                                   ` Jon Masters
2010-02-03 19:51                                               ` Alexey Dobriyan
2010-02-03 19:53                                                 ` Jon Masters
2010-02-03 20:01                                                   ` Alexey Dobriyan
2010-02-04 12:25                                               ` Patrick McHardy
2010-02-04 12:27                                                 ` Alexey Dobriyan
2010-02-04 12:30                                                   ` Patrick McHardy
2010-02-04 12:35                                                     ` Alexey Dobriyan
2010-02-04 13:04                                                       ` Patrick McHardy
2010-02-04 13:18                                                         ` Jon Masters
2010-02-04 13:37                                                           ` Patrick McHardy
2010-02-04 13:42                                                             ` Jon Masters
2010-02-03 20:21                                         ` Jon Masters
2010-02-04 12:24                                           ` Patrick McHardy
2010-02-02 16:58                             ` PROBLEM with summary: " Jon Masters
2010-02-02 17:04                               ` Patrick McHardy
2010-02-02 17:16                                 ` Eric Dumazet
2010-02-02 17:23                                   ` Jon Masters
2010-02-02  4:36                   ` Jon Masters
2010-02-02  7:02                     ` Jon Masters
2010-02-02 10:47                   ` Jon Masters
2010-02-04 14:00                   ` Patrick McHardy
2010-02-01 10:35           ` debug: nt_conntrack and KVM crash Jon Masters
2010-02-01 10:44             ` Alexey Dobriyan
2010-02-01 10:47               ` Alexey Dobriyan
2010-02-01 10:49                 ` Alexey Dobriyan
2010-02-01 10:53                   ` Jon Masters

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=4B6967BC.600@trash.net \
    --to=kaber@trash.net \
    --cc=adobriyan@gmail.com \
    --cc=eric.dumazet@gmail.com \
    --cc=jonathan@jonmasters.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    /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;
as well as URLs for NNTP newsgroup(s).