diff options
Diffstat (limited to 'drivers/net/bareudp.c')
| -rw-r--r-- | drivers/net/bareudp.c | 16 | 
1 files changed, 11 insertions, 5 deletions
| diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c index a7ee0af1af90..54e321a695ce 100644 --- a/drivers/net/bareudp.c +++ b/drivers/net/bareudp.c @@ -71,12 +71,18 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)  		family = AF_INET6;  	if (bareudp->ethertype == htons(ETH_P_IP)) { -		struct iphdr *iphdr; +		__u8 ipversion; -		iphdr = (struct iphdr *)(skb->data + BAREUDP_BASE_HLEN); -		if (iphdr->version == 4) { -			proto = bareudp->ethertype; -		} else if (bareudp->multi_proto_mode && (iphdr->version == 6)) { +		if (skb_copy_bits(skb, BAREUDP_BASE_HLEN, &ipversion, +				  sizeof(ipversion))) { +			bareudp->dev->stats.rx_dropped++; +			goto drop; +		} +		ipversion >>= 4; + +		if (ipversion == 4) { +			proto = htons(ETH_P_IP); +		} else if (ipversion == 6 && bareudp->multi_proto_mode) {  			proto = htons(ETH_P_IPV6);  		} else {  			bareudp->dev->stats.rx_dropped++; |