Skip to contentSkip to conversation

cxgb3: Fix kernel crash caused by uninitialized l2t_entry.arpq

PATCH Applied Roland Dreier 4 participants 4 messages Oct 17, 2008 – Oct 21, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Commit 147e70e6 ("cxgb3: Use SKB list interfaces instead of home-grown implementation.") causes a crash in t3_l2t_send_slow() when an iWARP connection request is received. This is because the new l2t_entry.arpq skb queue is never initialized, and therefore trying to add an skb to it causes a NULL dereference. With the old code there was no need to initialize the queues because the l2t_entry structures were zeroed, and the code used NULL to mean empty.

Fix this by adding __skb_queue_head_init() when all the l2t_entry structures get allocated.

---
This should probably go to -stable as well, since it looks like the commit that broke things went into 2.6.27-rc6.

 drivers/net/cxgb3/l2t.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/net/cxgb3/l2t.c +1 -0
index 4407ac9..ff1611f 100644
@@ -431,6 +431,7 @@ struct l2t_data *t3_init_l2t(unsigned int l2t_capacity)
 	for (i = 0; i < l2t_capacity; ++i) {
 		d->l2tab[i].idx = i;
 		d->l2tab[i].state = L2T_STATE_UNUSED;
+		__skb_queue_head_init(&d->l2tab[i].arpq);
 		spin_lock_init(&d->l2tab[i].lock);
 		atomic_set(&d->l2tab[i].refcnt, 0);
 	}
maintainer Acked-by
#1 lore raw

From: Roland Dreier <[email protected]>
Date: Fri, 17 Oct 2008 14:18:26 -0700

Quoted 8 lines

Commit 147e70e6 ("cxgb3: Use SKB list interfaces instead of home-grown implementation.") causes a crash in t3_l2t_send_slow() when an iWARP connection request is received. This is because the new l2t_entry.arpq skb queue is never initialized, and therefore trying to add an skb to it causes a NULL dereference. With the old code there was no need to initialize the queues because the l2t_entry structures were zeroed, and the code used NULL to mean empty.

Quoted 4 lines

Fix this by adding __skb_queue_head_init() when all the l2t_entry structures get allocated.

Quoted 2 lines

This should probably go to -stable as well, since it looks like the commit that broke things went into 2.6.27-rc6.

Indeed.

Acked-by
#2 lore raw
Quoted 12 lines · David Miller

From: Roland Dreier <[email protected]>
Date: Fri, 17 Oct 2008 14:18:26 -0700

Quoted 8 lines

Commit 147e70e6 ("cxgb3: Use SKB list interfaces instead of home-grown implementation.") causes a crash in t3_l2t_send_slow() when an iWARP connection request is received. This is because the new l2t_entry.arpq skb queue is never initialized, and therefore trying to add an skb to it causes a NULL dereference. With the old code there was no need to initialize the queues because the l2t_entry structures were zeroed, and the code used NULL to mean empty.

Quoted 8 lines
Quoted 5 lines

Fix this by adding __skb_queue_head_init() when all the l2t_entry structures get allocated.

Applied
#3 lore raw
In reply to Roland Dreier
Quoted 24 lines · Roland Dreier

Commit 147e70e6 ("cxgb3: Use SKB list interfaces instead of home-grown implementation.") causes a crash in t3_l2t_send_slow() when an iWARP connection request is received. This is because the new l2t_entry.arpq skb queue is never initialized, and therefore trying to add an skb to it causes a NULL dereference. With the old code there was no need to initialize the queues because the l2t_entry structures were zeroed, and the code used NULL to mean empty.

Fix this by adding __skb_queue_head_init() when all the l2t_entry structures get allocated.

---
This should probably go to -stable as well, since it looks like the commit that broke things went into 2.6.27-rc6.

 drivers/net/cxgb3/l2t.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/net/cxgb3/l2t.c +0 -0
index 4407ac9..ff1611f 100644

drivers/net/cxgb3/l2t.c struct l2t_data *t3_init_l2t(unsigned int l2t_capacity) · line 436

Quoted 6 lines
drivers/net/cxgb3/l2t.c +1 -0
@@ -431,6 +431,7 @@ struct l2t_data *t3_init_l2t(unsigned int l2t_capacity)
 	for (i = 0; i < l2t_capacity; ++i) {
 		d->l2tab[i].idx = i;
 		d->l2tab[i].state = L2T_STATE_UNUSED;
+		__skb_queue_head_init(&d->l2tab[i].arpq);
 		spin_lock_init(&d->l2tab[i].lock);
 		atomic_set(&d->l2tab[i].refcnt, 0);

applied