* Still oopsing in nf_nat_move_storage()
@ 2008-01-29 17:11 Chuck Ebbert
2008-01-29 17:18 ` Patrick McHardy
0 siblings, 1 reply; 7+ messages in thread
From: Chuck Ebbert @ 2008-01-29 17:11 UTC (permalink / raw)
To: Netdev
nf_nat_move_storage():
/usr/src/debug/kernel-2.6.23/linux-2.6.23.i686/net/ipv4/netfilter/nf_nat_core.c:612
87: f7 47 64 80 01 00 00 testl $0x180,0x64(%edi)
8e: 74 39 je c9 <nf_nat_move_storage+0x65>
line 612:
if (!(ct->status & IPS_NAT_DONE_MASK))
return;
ct is NULL
To reproduce, this is the Fedora iptables config file:
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to :21
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp --icmp-type any -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Still oopsing in nf_nat_move_storage()
2008-01-29 17:11 Still oopsing in nf_nat_move_storage() Chuck Ebbert
@ 2008-01-29 17:18 ` Patrick McHardy
2008-01-31 18:03 ` Chuck Ebbert
0 siblings, 1 reply; 7+ messages in thread
From: Patrick McHardy @ 2008-01-29 17:18 UTC (permalink / raw)
To: Chuck Ebbert; +Cc: Netdev, Netfilter Development Mailinglist
Chuck Ebbert wrote:
> nf_nat_move_storage():
> /usr/src/debug/kernel-2.6.23/linux-2.6.23.i686/net/ipv4/netfilter/nf_nat_core.c:612
> 87: f7 47 64 80 01 00 00 testl $0x180,0x64(%edi)
> 8e: 74 39 je c9 <nf_nat_move_storage+0x65>
>
> line 612:
> if (!(ct->status & IPS_NAT_DONE_MASK))
> return;
>
> ct is NULL
The current kernel (and 2.6.23-stable) have:
if (!ct || !(ct->status & IPS_NAT_DONE_MASK))
return;
so it seems you're using an old version.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Still oopsing in nf_nat_move_storage()
2008-01-29 17:18 ` Patrick McHardy
@ 2008-01-31 18:03 ` Chuck Ebbert
2008-02-01 23:41 ` Chuck Ebbert
0 siblings, 1 reply; 7+ messages in thread
From: Chuck Ebbert @ 2008-01-31 18:03 UTC (permalink / raw)
To: Patrick McHardy; +Cc: Netdev, Netfilter Development Mailinglist
On 01/29/2008 12:18 PM, Patrick McHardy wrote:
> Chuck Ebbert wrote:
>> nf_nat_move_storage():
>> /usr/src/debug/kernel-2.6.23/linux-2.6.23.i686/net/ipv4/netfilter/nf_nat_core.c:612
>>
>> 87: f7 47 64 80 01 00 00 testl $0x180,0x64(%edi)
>> 8e: 74 39 je c9
>> <nf_nat_move_storage+0x65>
>>
>> line 612:
>> if (!(ct->status & IPS_NAT_DONE_MASK))
>> return;
>>
>> ct is NULL
>
> The current kernel (and 2.6.23-stable) have:
>
> if (!ct || !(ct->status & IPS_NAT_DONE_MASK))
> return;
>
> so it seems you're using an old version.
Sorry, I re-used the analysis from before that change went in. I now
have an oops report from 2.6.23.14 on x86_64.
It is oopsing there, and only on x86_64 now, because x86_64 refuses to
use a non-canonical address. ct contains what appears to be ASCII data.
i386 might be dereferencing some random address instead of oopsing...
0: 48 f7 45 78 80 01 00 testq $0x180,0x78(%rbp)
7: 00
8: 74 4c je 0x56
a: 48 c7 c7 e0 18 28 88 mov $0xffffffff882818e0,%rdi
%rbp has a bogus (non-canonical) address. On i386 there is no such test possible
so it will just dereference the address if it is mapped.
%rbp contains 8 valid ASCII chars: "salcf x\"
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Still oopsing in nf_nat_move_storage()
2008-01-31 18:03 ` Chuck Ebbert
@ 2008-02-01 23:41 ` Chuck Ebbert
2008-02-02 10:26 ` Patrick McHardy
2008-02-02 11:02 ` Patrick McHardy
0 siblings, 2 replies; 7+ messages in thread
From: Chuck Ebbert @ 2008-02-01 23:41 UTC (permalink / raw)
To: Chuck Ebbert; +Cc: Patrick McHardy, Netdev, Netfilter Development Mailinglist
On 01/31/2008 01:03 PM, Chuck Ebbert wrote:
> On 01/29/2008 12:18 PM, Patrick McHardy wrote:
>> Chuck Ebbert wrote:
>>> nf_nat_move_storage():
>>> /usr/src/debug/kernel-2.6.23/linux-2.6.23.i686/net/ipv4/netfilter/nf_nat_core.c:612
>>>
>>> 87: f7 47 64 80 01 00 00 testl $0x180,0x64(%edi)
>>> 8e: 74 39 je c9
>>> <nf_nat_move_storage+0x65>
>>>
>>> line 612:
>>> if (!(ct->status & IPS_NAT_DONE_MASK))
>>> return;
>>>
>>> ct is NULL
>> The current kernel (and 2.6.23-stable) have:
>>
>> if (!ct || !(ct->status & IPS_NAT_DONE_MASK))
>> return;
>>
>> so it seems you're using an old version.
So, it is now oopsing after the test for NULL and only x86_64 is
catching the invalid address because it is non-canonical. Checking
for NULL is obviously not enough...
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Still oopsing in nf_nat_move_storage()
2008-02-01 23:41 ` Chuck Ebbert
@ 2008-02-02 10:26 ` Patrick McHardy
2008-02-02 11:02 ` Patrick McHardy
1 sibling, 0 replies; 7+ messages in thread
From: Patrick McHardy @ 2008-02-02 10:26 UTC (permalink / raw)
To: Chuck Ebbert; +Cc: Netdev, Netfilter Development Mailinglist
Chuck Ebbert wrote:
> On 01/31/2008 01:03 PM, Chuck Ebbert wrote:
>> On 01/29/2008 12:18 PM, Patrick McHardy wrote:
>>> Chuck Ebbert wrote:
>>>> nf_nat_move_storage():
>>>> /usr/src/debug/kernel-2.6.23/linux-2.6.23.i686/net/ipv4/netfilter/nf_nat_core.c:612
>>>>
>>>> 87: f7 47 64 80 01 00 00 testl $0x180,0x64(%edi)
>>>> 8e: 74 39 je c9
>>>> <nf_nat_move_storage+0x65>
>>>>
>>>> line 612:
>>>> if (!(ct->status & IPS_NAT_DONE_MASK))
>>>> return;
>>>>
>>>> ct is NULL
>>> The current kernel (and 2.6.23-stable) have:
>>>
>>> if (!ct || !(ct->status & IPS_NAT_DONE_MASK))
>>> return;
>>>
>>> so it seems you're using an old version.
>
> So, it is now oopsing after the test for NULL and only x86_64 is
> catching the invalid address because it is non-canonical. Checking
> for NULL is obviously not enough...
The addresses passed to ->move seems to be bogus, we're doing:
t->move(ct, ct->ext + ct->ext->offset[i]);
without assigning the new ct->ext first, which is wrong for
two reasons:
- the new ext hasn't been assigned to the conntrack yet,
so its moving within the same extension
- ct->ext + ct->ext->offset[i] should be (void *)ct->ext + ...
I'll fix it and send a patch after some testing. Still wondering
why this wasn't noticed before.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Still oopsing in nf_nat_move_storage()
2008-02-01 23:41 ` Chuck Ebbert
2008-02-02 10:26 ` Patrick McHardy
@ 2008-02-02 11:02 ` Patrick McHardy
2008-02-05 16:26 ` Thomas Woerner
1 sibling, 1 reply; 7+ messages in thread
From: Patrick McHardy @ 2008-02-02 11:02 UTC (permalink / raw)
To: Chuck Ebbert; +Cc: Netdev, Netfilter Development Mailinglist, Thomas Woerner
[-- Attachment #1: Type: text/plain, Size: 959 bytes --]
Chuck Ebbert wrote:
> On 01/31/2008 01:03 PM, Chuck Ebbert wrote:
>> On 01/29/2008 12:18 PM, Patrick McHardy wrote:
>>> Chuck Ebbert wrote:
>>>> nf_nat_move_storage():
>>>> /usr/src/debug/kernel-2.6.23/linux-2.6.23.i686/net/ipv4/netfilter/nf_nat_core.c:612
>>>>
>>>> 87: f7 47 64 80 01 00 00 testl $0x180,0x64(%edi)
>>>> 8e: 74 39 je c9
>>>> <nf_nat_move_storage+0x65>
>>>>
>>>> line 612:
>>>> if (!(ct->status & IPS_NAT_DONE_MASK))
>>>> return;
>>>>
>>>> ct is NULL
>>> The current kernel (and 2.6.23-stable) have:
>>>
>>> if (!ct || !(ct->status & IPS_NAT_DONE_MASK))
>>> return;
>>>
>>> so it seems you're using an old version.
>
> So, it is now oopsing after the test for NULL and only x86_64 is
> catching the invalid address because it is non-canonical. Checking
> for NULL is obviously not enough...
Could you try whether this patch fixes it please?
[-- Attachment #2: x --]
[-- Type: text/plain, Size: 2518 bytes --]
commit 6953954cc566c19a84b7ca9647c16dabe4646c03
Author: Patrick McHardy <kaber@trash.net>
Date: Sat Feb 2 12:01:03 2008 +0100
[NETFILTER]: nf_conntrack: fix ct_extend ->move operation
The ->move operation has two bugs:
- It is called with the same extension as source and destination,
so it doesn't update the new extension.
- The address of the old extension is calculated incorrectly,
instead of (void *)ct->ext + ct->ext->offset[i] it uses
ct->ext + ct->ext->offset[i].
Should fix a crash on x86_64 reported by Chuck Ebbert <cebbert@redhat.com>
and Thomas Woerner <twoerner@redhat.com>.
Signed-off-by: Patrick McHardy <kaber@trash.net>
diff --git a/include/net/netfilter/nf_conntrack_extend.h b/include/net/netfilter/nf_conntrack_extend.h
index 73b5711..49aac63 100644
--- a/include/net/netfilter/nf_conntrack_extend.h
+++ b/include/net/netfilter/nf_conntrack_extend.h
@@ -67,7 +67,7 @@ struct nf_ct_ext_type
void (*destroy)(struct nf_conn *ct);
/* Called when realloacted (can be NULL).
Contents has already been moved. */
- void (*move)(struct nf_conn *ct, void *old);
+ void (*move)(void *new, void *old);
enum nf_ct_ext_id id;
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c
index dd07362..0d5fa3a 100644
--- a/net/ipv4/netfilter/nf_nat_core.c
+++ b/net/ipv4/netfilter/nf_nat_core.c
@@ -600,10 +600,10 @@ static void nf_nat_cleanup_conntrack(struct nf_conn *ct)
spin_unlock_bh(&nf_nat_lock);
}
-static void nf_nat_move_storage(struct nf_conn *conntrack, void *old)
+static void nf_nat_move_storage(void *new, void *old)
{
- struct nf_conn_nat *new_nat = nf_ct_ext_find(conntrack, NF_CT_EXT_NAT);
- struct nf_conn_nat *old_nat = (struct nf_conn_nat *)old;
+ struct nf_conn_nat *new_nat = new;
+ struct nf_conn_nat *old_nat = old;
struct nf_conn *ct = old_nat->ct;
if (!ct || !(ct->status & IPS_NAT_DONE_MASK))
diff --git a/net/netfilter/nf_conntrack_extend.c b/net/netfilter/nf_conntrack_extend.c
index cf6ba66..8b9be1e 100644
--- a/net/netfilter/nf_conntrack_extend.c
+++ b/net/netfilter/nf_conntrack_extend.c
@@ -109,7 +109,8 @@ void *__nf_ct_ext_add(struct nf_conn *ct, enum nf_ct_ext_id id, gfp_t gfp)
rcu_read_lock();
t = rcu_dereference(nf_ct_ext_types[i]);
if (t && t->move)
- t->move(ct, ct->ext + ct->ext->offset[i]);
+ t->move((void *)new + new->offset[i],
+ (void *)ct->ext + ct->ext->offset[i]);
rcu_read_unlock();
}
kfree(ct->ext);
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: Still oopsing in nf_nat_move_storage()
2008-02-02 11:02 ` Patrick McHardy
@ 2008-02-05 16:26 ` Thomas Woerner
0 siblings, 0 replies; 7+ messages in thread
From: Thomas Woerner @ 2008-02-05 16:26 UTC (permalink / raw)
To: Patrick McHardy; +Cc: Chuck Ebbert, Netdev, Netfilter Development Mailinglist
Patrick McHardy wrote:
> Chuck Ebbert wrote:
>> On 01/31/2008 01:03 PM, Chuck Ebbert wrote:
>>> On 01/29/2008 12:18 PM, Patrick McHardy wrote:
>>>> Chuck Ebbert wrote:
>>>>> nf_nat_move_storage():
>>>>> /usr/src/debug/kernel-2.6.23/linux-2.6.23.i686/net/ipv4/netfilter/nf_nat_core.c:612
>>>>>
>>>>>
>>>>> 87: f7 47 64 80 01 00 00 testl $0x180,0x64(%edi)
>>>>> 8e: 74 39 je c9
>>>>> <nf_nat_move_storage+0x65>
>>>>>
>>>>> line 612:
>>>>> if (!(ct->status & IPS_NAT_DONE_MASK))
>>>>> return;
>>>>>
>>>>> ct is NULL
>>>> The current kernel (and 2.6.23-stable) have:
>>>>
>>>> if (!ct || !(ct->status & IPS_NAT_DONE_MASK))
>>>> return;
>>>>
>>>> so it seems you're using an old version.
>>
>> So, it is now oopsing after the test for NULL and only x86_64 is
>> catching the invalid address because it is non-canonical. Checking
>> for NULL is obviously not enough...
>
>
> Could you try whether this patch fixes it please?
>
Hallo Patrick,
I have tested the patch and the problem seems to be fixed.
Thanks,
Thomas
--
Thomas Woerner
Software Engineer Phone: +49-711-96437-0
Red Hat GmbH Fax : +49-711-96437-111
Hauptstaetterstr. 58 Email: Thomas Woerner <twoerner@redhat.com>
D-70178 Stuttgart Web : http://www.redhat.de/
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-02-05 16:26 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-29 17:11 Still oopsing in nf_nat_move_storage() Chuck Ebbert
2008-01-29 17:18 ` Patrick McHardy
2008-01-31 18:03 ` Chuck Ebbert
2008-02-01 23:41 ` Chuck Ebbert
2008-02-02 10:26 ` Patrick McHardy
2008-02-02 11:02 ` Patrick McHardy
2008-02-05 16:26 ` Thomas Woerner
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).