mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 05:24:12 +08: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 <oneukum@suse.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7e5b6a5c8c
commit
8d2b1a1ec9
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user