Skip to content

Commit 7f247f5

Browse files
szymonhdavem330
authored andcommitted
net: usb: lan78xx: Limit packet length to skb->len
Packet length retrieved from descriptor may be larger than the actual socket buffer length. In such case the cloned skb passed up the network stack will leak kernel memory contents. Additionally prevent integer underflow when size is less than ETH_FCS_LEN. Fixes: 55d7de9 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Ethernet device driver") Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 6b6bc5b commit 7f247f5

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

drivers/net/usb/lan78xx.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3579,13 +3579,29 @@ static int lan78xx_rx(struct lan78xx_net *dev, struct sk_buff *skb,
35793579
size = (rx_cmd_a & RX_CMD_A_LEN_MASK_);
35803580
align_count = (4 - ((size + RXW_PADDING) % 4)) % 4;
35813581

3582+
if (unlikely(size > skb->len)) {
3583+
netif_dbg(dev, rx_err, dev->net,
3584+
"size err rx_cmd_a=0x%08x\n",
3585+
rx_cmd_a);
3586+
return 0;
3587+
}
3588+
35823589
if (unlikely(rx_cmd_a & RX_CMD_A_RED_)) {
35833590
netif_dbg(dev, rx_err, dev->net,
35843591
"Error rx_cmd_a=0x%08x", rx_cmd_a);
35853592
} else {
3586-
u32 frame_len = size - ETH_FCS_LEN;
3593+
u32 frame_len;
35873594
struct sk_buff *skb2;
35883595

3596+
if (unlikely(size < ETH_FCS_LEN)) {
3597+
netif_dbg(dev, rx_err, dev->net,
3598+
"size err rx_cmd_a=0x%08x\n",
3599+
rx_cmd_a);
3600+
return 0;
3601+
}
3602+
3603+
frame_len = size - ETH_FCS_LEN;
3604+
35893605
skb2 = napi_alloc_skb(&dev->napi, frame_len);
35903606
if (!skb2)
35913607
return 0;

0 commit comments

Comments
 (0)