diff options
author | Patrick McHardy <kaber@trash.net> | 2009-12-15 10:59:59 -0500 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2009-12-15 10:59:59 -0500 |
commit | 8fa9ff6849bb86c59cc2ea9faadf3cb2d5223497 (patch) | |
tree | 42c1cc382a9cfbb2907ab1471418404f874d53f2 /net/ipv6 | |
parent | 0b5ccb2ee250136dd7385b1c7da28417d0d4d32d (diff) |
netfilter: fix crashes in bridge netfilter caused by fragment jumps
When fragments from bridge netfilter are passed to IPv4 or IPv6 conntrack
and a reassembly queue with the same fragment key already exists from
reassembling a similar packet received on a different device (f.i. with
multicasted fragments), the reassembled packet might continue on a different
codepath than where the head fragment originated. This can cause crashes
in bridge netfilter when a fragment received on a non-bridge device (and
thus with skb->nf_bridge == NULL) continues through the bridge netfilter
code.
Add a new reassembly identifier for packets originating from bridge
netfilter and use it to put those packets in insolated queues.
Fixes http://bugzilla.kernel.org/show_bug.cgi?id=14805
Reported-and-Tested-by: Chong Qiao <qiaochong@loongson.cn>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index c0a82fe78321..0956ebabbff2 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <net/ipv6.h> | 20 | #include <net/ipv6.h> |
21 | #include <net/inet_frag.h> | 21 | #include <net/inet_frag.h> |
22 | 22 | ||
23 | #include <linux/netfilter_bridge.h> | ||
23 | #include <linux/netfilter_ipv6.h> | 24 | #include <linux/netfilter_ipv6.h> |
24 | #include <net/netfilter/nf_conntrack.h> | 25 | #include <net/netfilter/nf_conntrack.h> |
25 | #include <net/netfilter/nf_conntrack_helper.h> | 26 | #include <net/netfilter/nf_conntrack_helper.h> |
@@ -190,6 +191,11 @@ out: | |||
190 | static enum ip6_defrag_users nf_ct6_defrag_user(unsigned int hooknum, | 191 | static enum ip6_defrag_users nf_ct6_defrag_user(unsigned int hooknum, |
191 | struct sk_buff *skb) | 192 | struct sk_buff *skb) |
192 | { | 193 | { |
194 | #ifdef CONFIG_BRIDGE_NETFILTER | ||
195 | if (skb->nf_bridge && | ||
196 | skb->nf_bridge->mask & BRNF_NF_BRIDGE_PREROUTING) | ||
197 | return IP6_DEFRAG_CONNTRACK_BRIDGE_IN; | ||
198 | #endif | ||
193 | if (hooknum == NF_INET_PRE_ROUTING) | 199 | if (hooknum == NF_INET_PRE_ROUTING) |
194 | return IP6_DEFRAG_CONNTRACK_IN; | 200 | return IP6_DEFRAG_CONNTRACK_IN; |
195 | else | 201 | else |