aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPengpeng Hou <hppiscas@163.com>2026-09-20 11:47:45 +0800
committerJakub Kicinski <kuba@kernel.org>2026-09-21 17:22:54 -0700
commitc06bde80ae7a7b595732f7cabcb92cf08db9d56a (patch)
tree54c45dc4e76e2b3dbfd3d41e5c04d83d97068bd3
parent7cce782d8327b7291334c4a304cf3fd909a74d9d (diff)
net: usb: sr9700: include receive overhead in the length check
The receive fixup subtracts the Ethernet CRC from the reported packet length, but compares that payload length against the whole remaining receive buffer. The following copy starts after the three-byte header, and the cursor advance consumes both that header and the four-byte CRC. Require the payload to fit after SR_RX_OVERHEAD before copying it or advancing to the next packet. The loop already ensures that the remaining buffer is larger than the overhead, so the subtraction is safe. The issue was found by our static-analysis tool. Fixes: c9b37458e956 ("USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support") Reviewed-by: Ethan Nelson-Moore <enelsonmoore@gmail.com> Tested-by: Ethan Nelson-Moore <enelsonmoore@gmail.com> Signed-off-by: Pengpeng Hou <hppiscas@163.com> Link: https://patch.msgid.link/20260920034745.18468-1-hppiscas@163.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--drivers/net/usb/sr9700.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c
index 937e6fef3ac6..50981a28376a 100644
--- a/drivers/net/usb/sr9700.c
+++ b/drivers/net/usb/sr9700.c
@@ -355,7 +355,8 @@ static int sr9700_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
/* ignore the CRC length */
len = (skb->data[1] | (skb->data[2] << 8)) - 4;
- if (len > ETH_FRAME_LEN || len > skb->len || len < 0)
+ if (len > ETH_FRAME_LEN || len < 0 ||
+ len > skb->len - SR_RX_OVERHEAD)
return 0;
/* the last packet of current skb */