* bridge br_multicast: BUG: unable to handle kernel NULL pointer dereference
@ 2010-07-05 19:05 Frank Arnold
2010-07-06 0:48 ` Herbert Xu
0 siblings, 1 reply; 4+ messages in thread
From: Frank Arnold @ 2010-07-05 19:05 UTC (permalink / raw)
To: Stephen Hemminger, YOSHIFUJI Hideaki, Herbert Xu; +Cc: netdev
Hi,
we see a kernel NULL pointer dereference during testing of the KVM tree,
currently based on 2.6.35-rc3. We are using bridge to connect the KVM
guests through the hosts network interface. Here is the trace:
BUG: unable to handle kernel NULL pointer dereference at
0000000000000028
IP: [<ffffffffa0196da0>] __br_ip4_hash+0x0/0x7c [bridge]
PGD 0
Oops: 0000 [#1] SMP
last sysfs file: /sys/module/lockd/initstate
CPU 3
Modules linked in: nfsd exportfs nfs lockd nfs_acl auth_rpcgss sunrpc bridge stp ipv6 kvm_amd kvm snd_hda_codec_atihdmi
snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd pcspkr serio_raw ata_generic r8169 so
undcore i2c_piix4 pata_acpi i2c_core joydev snd_page_alloc mii pata_atiixp shpchp [last unloaded: scsi_wait_scan]
Pid: 0, comm: swapper Not tainted 2.6.35.20100705_8dea564-1.fc11.osrc.x86_64 #1 GA-MA74GM-S2H/GA-MA74GM-S2H
RIP: 0010:[<ffffffffa0196da0>] [<ffffffffa0196da0>] __br_ip4_hash+0x0/0x7c [bridge]
RSP: 0018:ffff880001b838a8 EFLAGS: 00010246
RAX: ffff880126028000 RBX: 0000000000000000 RCX: ffff880127b3a828
RDX: 0000000001b80008 RSI: 0000000064ffffef RDI: 0000000000000000
RBP: ffff880001b838b0 R08: ffff8800054c3870 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: ffff880001b83a00
R13: ffff880001b83a00 R14: ffff880127b3a800 R15: ffff880125ccc400
FS: 00007f17d45ea6f0(0000) GS:ffff880001b80000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 0000000000000028 CR3: 00000000016b0000 CR4: 00000000000006e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process swapper (pid: 0, threadinfo ffff880127ab4000, task ffff880127ab96b0)
Stack:
ffffffffa0196f48 ffff880001b838d0 ffffffffa01970be ffff880126028640
<0> ffff880125ccc400 ffff880001b83910 ffffffffa0197511 ffff880001b83900
<0> ffff880127b3a800 ffff8800054c3868 ffff880126028640 ffff880127b3a800
Call Trace:
<IRQ>
[<ffffffffa0196f48>] ? br_ip_hash+0x1f/0x28 [bridge]
[<ffffffffa01970be>] br_mdb_ip_get+0x12/0x24 [bridge]
[<ffffffffa0197511>] br_multicast_leave_group+0x62/0x160 [bridge]
[<ffffffffa0199028>] br_multicast_rcv+0x60e/0xcda [bridge]
[<ffffffff81043320>] ? local_bh_enable_ip+0x9/0xb
[<ffffffff81369f85>] ? _raw_spin_unlock_bh+0xf/0x11
[<ffffffff812f9a1a>] ? packet+0x1a/0x24
[<ffffffff812f777b>] ? nf_conntrack_in+0x4ee/0x59f
[<ffffffffa01907d5>] ? fdb_create+0x28/0x73 [bridge]
[<ffffffffa0190945>] ? br_fdb_update+0x125/0x134 [bridge]
[<ffffffffa0191e74>] br_handle_frame_finish+0x6d/0x1ba [bridge]
[<ffffffffa0191e07>] ? br_handle_frame_finish+0x0/0x1ba [bridge]
[<ffffffffa0195c79>] NF_HOOK_THRESH+0x46/0x4d [bridge]
[<ffffffffa0195ed2>] ? nf_bridge_push_encap_header+0x2f/0x3c [bridge]
[<ffffffffa0196c65>] br_nf_pre_routing_finish+0x222/0x231 [bridge]
[<ffffffff812f4a10>] ? nf_hook_slow+0x65/0xc6
[<ffffffffa0196a43>] ? br_nf_pre_routing_finish+0x0/0x231 [bridge]
[<ffffffffa0196a43>] ? br_nf_pre_routing_finish+0x0/0x231 [bridge]
[<ffffffffa0195c79>] NF_HOOK_THRESH+0x46/0x4d [bridge]
[<ffffffffa019609a>] ? nf_bridge_alloc+0x1d/0x3a [bridge]
[<ffffffffa0196a26>] br_nf_pre_routing+0x550/0x56d [bridge]
[<ffffffff812f4968>] nf_iterate+0x41/0x84
[<ffffffffa0191e07>] ? br_handle_frame_finish+0x0/0x1ba [bridge]
[<ffffffff812f4a10>] nf_hook_slow+0x65/0xc6
[<ffffffffa0191e07>] ? br_handle_frame_finish+0x0/0x1ba [bridge]
[<ffffffffa0191e07>] ? br_handle_frame_finish+0x0/0x1ba [bridge]
[<ffffffffa0191df5>] NF_HOOK.clone.0+0x41/0x53 [bridge]
[<ffffffffa0192137>] br_handle_frame+0x176/0x18f [bridge]
[<ffffffff812d54e5>] __netif_receive_skb+0x2b0/0x3f5
[<ffffffff810592d2>] ? ktime_get_real+0x11/0x3e
[<ffffffff812d612c>] netif_receive_skb+0x52/0x59
[<ffffffff812d0ce6>] ? __netdev_alloc_skb+0x2f/0x4b
[<ffffffffa0054ff1>] rtl8169_rx_interrupt+0x385/0x4d6 [r8169]
[<ffffffff81222203>] ? scsi_next_command+0x3e/0x46
[<ffffffff812354b3>] ? __ata_qc_complete+0xdf/0xe7
[<ffffffffa0057614>] rtl8169_poll+0x37/0x1a1 [r8169]
[<ffffffff812d62ed>] net_rx_action+0xab/0x18c
[<ffffffffa00565f4>] ? rtl8169_interrupt+0x2cb/0x36e [r8169]
[<ffffffff81043446>] __do_softirq+0x97/0x125
[<ffffffff8101a026>] ? ack_apic_level+0x78/0x1ce
[<ffffffff810038dc>] call_softirq+0x1c/0x28
[<ffffffff81004e61>] do_softirq+0x41/0x7e
[<ffffffff810431ce>] irq_exit+0x36/0x78
[<ffffffff8100459c>] do_IRQ+0xa7/0xbe
[<ffffffff8136a1d3>] ret_from_intr+0x0/0x11
<EOI>
[<ffffffff8102036c>] ? native_safe_halt+0x6/0x8
[<ffffffff8136d161>] ? atomic_notifier_call_chain+0x13/0x15
[<ffffffff81009696>] default_idle+0x27/0x44
[<ffffffff81001d3a>] cpu_idle+0x58/0x93
[<ffffffff81364944>] start_secondary+0x1a4/0x1a8
Code: 7e 66 81 fa 81 00 74 0d 31 c0 66 81 fa 88 64 0f 94 c0 c1 e0 03 89 c2 48 29 93 e0 00 00 00 01 43 68 31 c0 5b 41 5c
c9 c3 90 90 90 <8b> 47 28 89 f1 ba b9 79 37 9e c1 e9 0d 29 f2 55 29 f0 48 89 e5
RIP [<ffffffffa0196da0>] __br_ip4_hash+0x0/0x7c [bridge]
RSP <ffff880001b838a8>
CR2: 0000000000000028
---[ end trace c0f05a4e3727475d ]---
Kernel panic - not syncing: Fatal exception in interrupt
--
Frank Arnold
Systems Design Technician, Software Test
AMD Operating System Research Center
Dresden, Germany
Tel: +49 351 448 356702
Legal Information:
Advanced Micro Devices GmbH
Einsteinring 24
85609 Dornach b. München
Geschäftsführer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis München
Registergericht München, HRB Nr. 43632
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: bridge br_multicast: BUG: unable to handle kernel NULL pointer dereference
2010-07-05 19:05 bridge br_multicast: BUG: unable to handle kernel NULL pointer dereference Frank Arnold
@ 2010-07-06 0:48 ` Herbert Xu
2010-07-06 0:50 ` Herbert Xu
0 siblings, 1 reply; 4+ messages in thread
From: Herbert Xu @ 2010-07-06 0:48 UTC (permalink / raw)
To: Frank Arnold
Cc: Stephen Hemminger, YOSHIFUJI Hideaki, netdev, David S. Miller
On Mon, Jul 05, 2010 at 09:05:37PM +0200, Frank Arnold wrote:
> Hi,
>
> we see a kernel NULL pointer dereference during testing of the KVM tree,
> currently based on 2.6.35-rc3. We are using bridge to connect the KVM
> guests through the hosts network interface. Here is the trace:
>
> BUG: unable to handle kernel NULL pointer dereference at
> 0000000000000028
> IP: [<ffffffffa0196da0>] __br_ip4_hash+0x0/0x7c [bridge]
Thanks for the report! Luckily this bug was introduced after
2.6.34 so we don't need it in stable.
bridge: Restore NULL check in br_mdb_ip_get
Somewhere along the line the NULL check in br_mdb_ip_get went
AWOL, causing crashes when we receive an IGMP packet with no
multicast table allocated.
This patch restores it and ensures all br_mdb_*_get functions
use it.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 9d21d98..27ae946 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -99,6 +99,15 @@ static struct net_bridge_mdb_entry *__br_mdb_ip_get(
return NULL;
}
+static struct net_bridge_mdb_entry *br_mdb_ip_get(
+ struct net_bridge_mdb_htable *mdb, struct br_ip *dst)
+{
+ if (!mdb)
+ return NULL;
+
+ return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst));
+}
+
static struct net_bridge_mdb_entry *br_mdb_ip4_get(
struct net_bridge_mdb_htable *mdb, __be32 dst)
{
@@ -107,7 +116,7 @@ static struct net_bridge_mdb_entry *br_mdb_ip4_get(
br_dst.u.ip4 = dst;
br_dst.proto = htons(ETH_P_IP);
- return __br_mdb_ip_get(mdb, &br_dst, __br_ip4_hash(mdb, dst));
+ return br_mdb_ip_get(mdb, &br_dst);
}
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
@@ -119,23 +128,17 @@ static struct net_bridge_mdb_entry *br_mdb_ip6_get(
ipv6_addr_copy(&br_dst.u.ip6, dst);
br_dst.proto = htons(ETH_P_IPV6);
- return __br_mdb_ip_get(mdb, &br_dst, __br_ip6_hash(mdb, dst));
+ return br_mdb_ip_get(mdb, &br_dst);
}
#endif
-static struct net_bridge_mdb_entry *br_mdb_ip_get(
- struct net_bridge_mdb_htable *mdb, struct br_ip *dst)
-{
- return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst));
-}
-
struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
struct sk_buff *skb)
{
struct net_bridge_mdb_htable *mdb = br->mdb;
struct br_ip ip;
- if (!mdb || br->multicast_disabled)
+ if (br->multicast_disabled)
return NULL;
if (BR_INPUT_SKB_CB(skb)->igmp)
Thanks,
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: bridge br_multicast: BUG: unable to handle kernel NULL pointer dereference
2010-07-06 0:48 ` Herbert Xu
@ 2010-07-06 0:50 ` Herbert Xu
2010-07-06 3:07 ` David Miller
0 siblings, 1 reply; 4+ messages in thread
From: Herbert Xu @ 2010-07-06 0:50 UTC (permalink / raw)
To: Frank Arnold
Cc: Stephen Hemminger, YOSHIFUJI Hideaki, netdev, David S. Miller
On Tue, Jul 06, 2010 at 08:48:35AM +0800, Herbert Xu wrote:
>
> bridge: Restore NULL check in br_mdb_ip_get
Resend with proper attribution.
bridge: Restore NULL check in br_mdb_ip_get
Somewhere along the line the NULL check in br_mdb_ip_get went
AWOL, causing crashes when we receive an IGMP packet with no
multicast table allocated.
This patch restores it and ensures all br_mdb_*_get functions
use it.
Reported-by: Frank Arnold <frank.arnold@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 9d21d98..27ae946 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -99,6 +99,15 @@ static struct net_bridge_mdb_entry *__br_mdb_ip_get(
return NULL;
}
+static struct net_bridge_mdb_entry *br_mdb_ip_get(
+ struct net_bridge_mdb_htable *mdb, struct br_ip *dst)
+{
+ if (!mdb)
+ return NULL;
+
+ return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst));
+}
+
static struct net_bridge_mdb_entry *br_mdb_ip4_get(
struct net_bridge_mdb_htable *mdb, __be32 dst)
{
@@ -107,7 +116,7 @@ static struct net_bridge_mdb_entry *br_mdb_ip4_get(
br_dst.u.ip4 = dst;
br_dst.proto = htons(ETH_P_IP);
- return __br_mdb_ip_get(mdb, &br_dst, __br_ip4_hash(mdb, dst));
+ return br_mdb_ip_get(mdb, &br_dst);
}
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
@@ -119,23 +128,17 @@ static struct net_bridge_mdb_entry *br_mdb_ip6_get(
ipv6_addr_copy(&br_dst.u.ip6, dst);
br_dst.proto = htons(ETH_P_IPV6);
- return __br_mdb_ip_get(mdb, &br_dst, __br_ip6_hash(mdb, dst));
+ return br_mdb_ip_get(mdb, &br_dst);
}
#endif
-static struct net_bridge_mdb_entry *br_mdb_ip_get(
- struct net_bridge_mdb_htable *mdb, struct br_ip *dst)
-{
- return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst));
-}
-
struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
struct sk_buff *skb)
{
struct net_bridge_mdb_htable *mdb = br->mdb;
struct br_ip ip;
- if (!mdb || br->multicast_disabled)
+ if (br->multicast_disabled)
return NULL;
if (BR_INPUT_SKB_CB(skb)->igmp)
Thanks,
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: bridge br_multicast: BUG: unable to handle kernel NULL pointer dereference
2010-07-06 0:50 ` Herbert Xu
@ 2010-07-06 3:07 ` David Miller
0 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2010-07-06 3:07 UTC (permalink / raw)
To: herbert; +Cc: frank.arnold, shemminger, yoshfuji, netdev
From: Herbert Xu <herbert@gondor.apana.org.au>
Date: Tue, 6 Jul 2010 08:50:08 +0800
> On Tue, Jul 06, 2010 at 08:48:35AM +0800, Herbert Xu wrote:
>>
>> bridge: Restore NULL check in br_mdb_ip_get
>
> Resend with proper attribution.
>
> bridge: Restore NULL check in br_mdb_ip_get
>
> Somewhere along the line the NULL check in br_mdb_ip_get went
> AWOL, causing crashes when we receive an IGMP packet with no
> multicast table allocated.
It got removed by:
--------------------
commit 8ef2a9a59854994bace13b5c4f7edc2c8d4d124e
Author: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Date: Sun Apr 18 12:42:07 2010 +0900
bridge br_multicast: Make functions less ipv4 dependent.
Introduce struct br_ip{} to store ip address and protocol
and make functions more generic so that we can support
both IPv4 and IPv6 with less pain.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
--------------------
> This patch restores it and ensures all br_mdb_*_get functions
> use it.
>
> Reported-by: Frank Arnold <frank.arnold@amd.com>
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Applied, thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-07-06 3:07 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-05 19:05 bridge br_multicast: BUG: unable to handle kernel NULL pointer dereference Frank Arnold
2010-07-06 0:48 ` Herbert Xu
2010-07-06 0:50 ` Herbert Xu
2010-07-06 3:07 ` David Miller
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).