Skip to content

Commit b102f0c

Browse files
nbd168Kalle Valo
authored andcommitted
mt76: fix array overflow on receiving too many fragments for a packet
If the hardware receives an oversized packet with too many rx fragments, skb_shinfo(skb)->frags can overflow and corrupt memory of adjacent pages. This becomes especially visible if it corrupts the freelist pointer of a slab page. Cc: [email protected] Signed-off-by: Felix Fietkau <[email protected]> Signed-off-by: Kalle Valo <[email protected]>
1 parent a9149d2 commit b102f0c

File tree

1 file changed

+6
-3
lines changed
  • drivers/net/wireless/mediatek/mt76

1 file changed

+6
-3
lines changed

drivers/net/wireless/mediatek/mt76/dma.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -447,10 +447,13 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
447447
struct page *page = virt_to_head_page(data);
448448
int offset = data - page_address(page);
449449
struct sk_buff *skb = q->rx_head;
450+
struct skb_shared_info *shinfo = skb_shinfo(skb);
450451

451-
offset += q->buf_offset;
452-
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, offset, len,
453-
q->buf_size);
452+
if (shinfo->nr_frags < ARRAY_SIZE(shinfo->frags)) {
453+
offset += q->buf_offset;
454+
skb_add_rx_frag(skb, shinfo->nr_frags, page, offset, len,
455+
q->buf_size);
456+
}
454457

455458
if (more)
456459
return;

0 commit comments

Comments
 (0)