diff options
Diffstat (limited to 'drivers/net/usb/ipheth.c')
| -rw-r--r-- | drivers/net/usb/ipheth.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index 7d42f9a2c06..81126ff85e0 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c @@ -65,6 +65,7 @@  #define IPHETH_USBINTF_PROTO    1  #define IPHETH_BUF_SIZE         1516 +#define IPHETH_IP_ALIGN		2	/* padding at front of URB */  #define IPHETH_TX_TIMEOUT       (5 * HZ)  #define IPHETH_INTFNUM          2 @@ -202,18 +203,21 @@ static void ipheth_rcvbulk_callback(struct urb *urb)  		return;  	} -	len = urb->actual_length; -	buf = urb->transfer_buffer; +	if (urb->actual_length <= IPHETH_IP_ALIGN) { +		dev->net->stats.rx_length_errors++; +		return; +	} +	len = urb->actual_length - IPHETH_IP_ALIGN; +	buf = urb->transfer_buffer + IPHETH_IP_ALIGN; -	skb = dev_alloc_skb(NET_IP_ALIGN + len); +	skb = dev_alloc_skb(len);  	if (!skb) {  		err("%s: dev_alloc_skb: -ENOMEM", __func__);  		dev->net->stats.rx_dropped++;  		return;  	} -	skb_reserve(skb, NET_IP_ALIGN); -	memcpy(skb_put(skb, len), buf + NET_IP_ALIGN, len - NET_IP_ALIGN); +	memcpy(skb_put(skb, len), buf, len);  	skb->dev = dev->net;  	skb->protocol = eth_type_trans(skb, dev->net);  |