* Re: [netfilter-core] Cannot unload nf_conntrack
[not found] ` <4DDF7152.3030405@netfilter.org>
@ 2011-05-27 11:26 ` Pablo Neira Ayuso
2011-05-30 15:01 ` Menyhart Zoltan
0 siblings, 1 reply; 4+ messages in thread
From: Pablo Neira Ayuso @ 2011-05-27 11:26 UTC (permalink / raw)
To: Zoltan.Menyhart, Netfilter Development Mailinglist; +Cc: netfilter-core
[-- Attachment #1: Type: text/plain, Size: 1379 bytes --]
On 27/05/11 11:39, Pablo Neira Ayuso wrote:
> On 03/05/11 18:45, Menyhart Zoltan wrote:
>> Hi,
>>
>> I cannot unload nf_conntrack because
>> nf_conntrack_untracked.ct_general.use.counter == 7.
>>
>> The last_unloaded_module is "nf_conntrack_ipv6".
>>
>> Probably the following has happend:
>>
>> nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum,
>> struct sk_buff *skb):
>>
>> ret = l4proto->error(net, skb, dataoff, &ctinfo, pf, hooknum):
>> /* e.g. */ icmpv6_error(struct net *net, struct sk_buff *skb,
>> unsigned int dataoff,
>> enum ip_conntrack_info *ctinfo, u_int8_t pf, unsigned
>> int hooknum):
>> if (type >= 0 && type < sizeof(noct_valid_new) &&
>> noct_valid_new[type]) {
>> skb->nfct = &nf_conntrack_untracked.ct_general;
>> skb->nfctinfo = IP_CT_NEW;
>> nf_conntrack_get(skb->nfct);
>> return NF_ACCEPT;
>> }
>>
>> ct = resolve_normal_ct(net, skb, dataoff, pf, protonum, l3proto,
>> l4proto, &set_reply, &ctinfo);
>> skb->nfct = &ct->ct_general;
>> skb->nfctinfo = *ctinfo;
>>
>> Is it normal for resolve_normal_ct() to overwrite skb->nfct without
>> putting the previous conntrack?
>
> Indeed, this looks quite suspicious. Let me check this with more attention.
Please, would you give a try to this patch?
Thanks!
[-- Attachment #2: fix.patch --]
[-- Type: text/x-patch, Size: 2086 bytes --]
netfilter: nf_conntrack: fix ct refcount leak in l4proto->error()
This patch fixes a refcount leak of ct objects that may occur if
l4proto->error() assigns one conntrack object to one skbuff. In
that case, we have to skip further processing in nf_conntrack_in().
With this patch, we can also fix wrong return values (-NF_ACCEPT)
for special cases in ICMP[v6] that should not bump the invalid/error
statistic counters.
Reported-by: Zoltan Menyhart <Zoltan.Menyhart@bull.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
diff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c
index 7404bde..ab5b27a 100644
--- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c
+++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c
@@ -160,7 +160,7 @@ icmp_error_message(struct net *net, struct nf_conn *tmpl, struct sk_buff *skb,
/* Update skb to refer to this connection */
skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general;
skb->nfctinfo = *ctinfo;
- return -NF_ACCEPT;
+ return NF_ACCEPT;
}
/* Small and modified version of icmp_rcv */
diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
index 1df3c8b..7c05e7e 100644
--- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
+++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
@@ -177,7 +177,7 @@ icmpv6_error_message(struct net *net, struct nf_conn *tmpl,
/* Update skb to refer to this connection */
skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general;
skb->nfctinfo = *ctinfo;
- return -NF_ACCEPT;
+ return NF_ACCEPT;
}
static int
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index 2e1c11f..9421fe4 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -922,6 +922,9 @@ nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum,
ret = -ret;
goto out;
}
+ /* ICMP[v6] protocol trackers may assign one conntrack. */
+ if (skb->nfct)
+ goto out;
}
ct = resolve_normal_ct(net, tmpl, skb, dataoff, pf, protonum,
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [netfilter-core] Cannot unload nf_conntrack
2011-05-27 11:26 ` [netfilter-core] Cannot unload nf_conntrack Pablo Neira Ayuso
@ 2011-05-30 15:01 ` Menyhart Zoltan
2011-05-30 16:43 ` Pablo Neira Ayuso
0 siblings, 1 reply; 4+ messages in thread
From: Menyhart Zoltan @ 2011-05-30 15:01 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: Netfilter Development Mailinglist, netfilter-core
Pablo Neira Ayuso wrote:
> Please, would you give a try to this patch?
>
> Thanks!
Have you got a patch for the 2.6.32, please, because this section does not apply:
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index 2e1c11f..9421fe4 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -922,6 +922,9 @@ nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum,
ret = -ret;
goto out;
}
+ /* ICMP[v6] protocol trackers may assign one conntrack. */
+ if (skb->nfct)
+ goto out;
}
ct = resolve_normal_ct(net, tmpl, skb, dataoff, pf, protonum,
Thanks,
Zoltan
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [netfilter-core] Cannot unload nf_conntrack
2011-05-30 15:01 ` Menyhart Zoltan
@ 2011-05-30 16:43 ` Pablo Neira Ayuso
2011-05-31 7:27 ` Menyhart Zoltan
0 siblings, 1 reply; 4+ messages in thread
From: Pablo Neira Ayuso @ 2011-05-30 16:43 UTC (permalink / raw)
To: Menyhart Zoltan; +Cc: Netfilter Development Mailinglist, netfilter-core
On 30/05/11 17:01, Menyhart Zoltan wrote:
> Pablo Neira Ayuso wrote:
>
>> Please, would you give a try to this patch?
>>
>> Thanks!
>
> Have you got a patch for the 2.6.32, please, because this section does
> not apply:
>
> diff --git a/net/netfilter/nf_conntrack_core.c
> b/net/netfilter/nf_conntrack_core.c
> index 2e1c11f..9421fe4 100644
> --- a/net/netfilter/nf_conntrack_core.c
> +++ b/net/netfilter/nf_conntrack_core.c
> @@ -922,6 +922,9 @@ nf_conntrack_in(struct net *net, u_int8_t pf,
> unsigned int hooknum,
> ret = -ret;
> goto out;
> }
> + /* ICMP[v6] protocol trackers may assign one conntrack. */
> + if (skb->nfct)
> + goto out;
> }
>
> ct = resolve_normal_ct(net, tmpl, skb, dataoff, pf, protonum,
>
> Thanks,
Sorry, no patch for 2.6.32. But I appreciate if you can add that chuck
by yourself, it's quite easy:
785 if (l4proto->error != NULL) {
786 ret = l4proto->error(net, skb, dataoff, &ctinfo, pf,
hooknum);
787 if (ret <= 0) {
788 NF_CT_STAT_INC_ATOMIC(net, error);
789 NF_CT_STAT_INC_ATOMIC(net, invalid);
790 return -ret;
791 }
add it here.
792 }
And test it, of course.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [netfilter-core] Cannot unload nf_conntrack
2011-05-30 16:43 ` Pablo Neira Ayuso
@ 2011-05-31 7:27 ` Menyhart Zoltan
0 siblings, 0 replies; 4+ messages in thread
From: Menyhart Zoltan @ 2011-05-31 7:27 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: Netfilter Development Mailinglist, netfilter-core
Pablo Neira Ayuso wrote:
> Sorry, no patch for 2.6.32. But I appreciate if you can add that chuck
> by yourself, it's quite easy:
>
> 785 if (l4proto->error != NULL) {
> 786 ret = l4proto->error(net, skb, dataoff,&ctinfo, pf, hooknum);
> 787 if (ret<= 0) {
> 788 NF_CT_STAT_INC_ATOMIC(net, error);
> 789 NF_CT_STAT_INC_ATOMIC(net, invalid);
> 790 return -ret;
> 791 }
>
> add it here.
>
> 792 }
>
> And test it, of course.
I *did* try it before I asked for the patch for 2.6.32.
My problem is: there is no "out:" branch in the 2.6.32.
out:
if (tmpl) {
/* Special case: we have to repeat this hook, assign the
* template again to this packet. We assume that this packet
* has no conntrack assigned. This is used by nf_ct_tcp. */
if (ret == NF_REPEAT)
skb->nfct = (struct nf_conntrack *)tmpl;
else
nf_ct_put(tmpl);
}
There is no "struct nf_conn *tmpl;" either.
What shall I do instead of "goto out;"?
Thanks,
Zoltan
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-05-31 7:28 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <4DC0310F.3070004@bull.net>
[not found] ` <4DDF7152.3030405@netfilter.org>
2011-05-27 11:26 ` [netfilter-core] Cannot unload nf_conntrack Pablo Neira Ayuso
2011-05-30 15:01 ` Menyhart Zoltan
2011-05-30 16:43 ` Pablo Neira Ayuso
2011-05-31 7:27 ` Menyhart Zoltan
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).