mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
net: usb: lan78xx: Limit packet length to skb->len
[ Upstream commit7f247f5a2c] 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:55d7de9de6("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5fc2c4e311
commit
83de349674
@@ -3579,13 +3579,29 @@ static int lan78xx_rx(struct lan78xx_net *dev, struct sk_buff *skb,
|
||||
size = (rx_cmd_a & RX_CMD_A_LEN_MASK_);
|
||||
align_count = (4 - ((size + RXW_PADDING) % 4)) % 4;
|
||||
|
||||
if (unlikely(size > skb->len)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"size err rx_cmd_a=0x%08x\n",
|
||||
rx_cmd_a);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (unlikely(rx_cmd_a & RX_CMD_A_RED_)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"Error rx_cmd_a=0x%08x", rx_cmd_a);
|
||||
} else {
|
||||
u32 frame_len = size - ETH_FCS_LEN;
|
||||
u32 frame_len;
|
||||
struct sk_buff *skb2;
|
||||
|
||||
if (unlikely(size < ETH_FCS_LEN)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"size err rx_cmd_a=0x%08x\n",
|
||||
rx_cmd_a);
|
||||
return 0;
|
||||
}
|
||||
|
||||
frame_len = size - ETH_FCS_LEN;
|
||||
|
||||
skb2 = napi_alloc_skb(&dev->napi, frame_len);
|
||||
if (!skb2)
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user