ipv4: raw: fix icmp_filter()

icmp_filter() should not modify its input, or else its caller
would need to recompute ip_hdr() if skb->head is reallocated.

Use skb_header_pointer() instead of pskb_may_pull() and
change the prototype to make clear both sk and skb are const.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric Dumazet 2012-09-22 00:08:29 +00:00 committed by David S. Miller
parent 9913b8c8f0
commit ab43ed8b74

View File

@ -131,18 +131,20 @@ found:
* 0 - deliver * 0 - deliver
* 1 - block * 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; return 1;
type = icmp_hdr(skb)->type; if (hdr->type < 32) {
if (type < 32) {
__u32 data = raw_sk(sk)->filter.data; __u32 data = raw_sk(sk)->filter.data;
return ((1 << type) & data) != 0; return ((1U << hdr->type) & data) != 0;
} }
/* Do not block unknown ICMP types */ /* Do not block unknown ICMP types */