diff options
Diffstat (limited to 'net/ipv6/raw.c')
| -rw-r--r-- | net/ipv6/raw.c | 21 | 
1 files changed, 10 insertions, 11 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index ef0579d5bca..4a5f78b5049 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -107,21 +107,20 @@ found:   *	0 - deliver   *	1 - block   */ -static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb) +static int icmpv6_filter(const struct sock *sk, const struct sk_buff *skb)  { -	struct icmp6hdr *icmph; -	struct raw6_sock *rp = raw6_sk(sk); - -	if (pskb_may_pull(skb, sizeof(struct icmp6hdr))) { -		__u32 *data = &rp->filter.data[0]; -		int bit_nr; +	struct icmp6hdr *_hdr; +	const struct icmp6hdr *hdr; -		icmph = (struct icmp6hdr *) skb->data; -		bit_nr = icmph->icmp6_type; +	hdr = skb_header_pointer(skb, skb_transport_offset(skb), +				 sizeof(_hdr), &_hdr); +	if (hdr) { +		const __u32 *data = &raw6_sk(sk)->filter.data[0]; +		unsigned int type = hdr->icmp6_type; -		return (data[bit_nr >> 5] & (1 << (bit_nr & 31))) != 0; +		return (data[type >> 5] & (1U << (type & 31))) != 0;  	} -	return 0; +	return 1;  }  #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)  |