diff options
Diffstat (limited to 'net/ipv4/raw.c')
| -rw-r--r-- | net/ipv4/raw.c | 14 | 
1 files changed, 8 insertions, 6 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index ff0f071969e..d23c6571ba1 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -131,18 +131,20 @@ found:   *	0 - deliver   *	1 - block   */ -static __inline__ int icmp_filter(struct sock *sk, struct sk_buff *skb) +static int icmp_filter(const struct sock *sk, const struct sk_buff *skb)  { -	int type; +	struct icmphdr _hdr; +	const struct icmphdr *hdr; -	if (!pskb_may_pull(skb, sizeof(struct icmphdr))) +	hdr = skb_header_pointer(skb, skb_transport_offset(skb), +				 sizeof(_hdr), &_hdr); +	if (!hdr)  		return 1; -	type = icmp_hdr(skb)->type; -	if (type < 32) { +	if (hdr->type < 32) {  		__u32 data = raw_sk(sk)->filter.data; -		return ((1 << type) & data) != 0; +		return ((1U << hdr->type) & data) != 0;  	}  	/* Do not block unknown ICMP types */  |