mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-30 05:42:46 +01:00
CDC-NCM: avoid overflow in sanity checking
A broken device may give an extreme offset like 0xFFF0 and a reasonable length for a fragment. In the sanity check as formulated now, this will create an integer overflow, defeating the sanity check. Both offset and offset + len need to be checked in such a manner that no overflow can occur. And those quantities should be unsigned. Signed-off-by: Oliver Neukum <[email protected]> Reviewed-by: Greg Kroah-Hartman <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
1 parent
7e5b6a5c8c
commit
8d2b1a1ec9
1 file changed
+4
-4
@@ -1715,10 +1715,10 @@ int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
|
||||
int len;
|
||||
unsigned int len;
|
||||
int nframes;
|
||||
int x;
|
||||
int offset;
|
||||
unsigned int offset;
|
||||
union {
|
||||
struct usb_cdc_ncm_ndp16 *ndp16;
|
||||
struct usb_cdc_ncm_ndp32 *ndp32;
|
||||
@@ -1790,8 +1790,8 @@ next_ndp:
|
||||
break;
|
||||
}
|
||||
|
||||
/* sanity checking */
|
||||
if (((offset + len) > skb_in->len) ||
|
||||
/* sanity checking - watch out for integer wrap*/
|
||||
if ((offset > skb_in->len) || (len > skb_in->len - offset) ||
|
||||
(len > ctx->rx_max) || (len < ETH_HLEN)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n",
|
||||
|
||||
Reference in new issue
Block a user