diff options
-rw-r--r-- | net/ipv6/raw.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 164fb5f58641..c1e533498203 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -63,6 +63,8 @@ | |||
63 | #include <linux/seq_file.h> | 63 | #include <linux/seq_file.h> |
64 | #include <linux/export.h> | 64 | #include <linux/export.h> |
65 | 65 | ||
66 | #define ICMPV6_HDRLEN 4 /* ICMPv6 header, RFC 4443 Section 2.1 */ | ||
67 | |||
66 | static struct raw_hashinfo raw_v6_hashinfo = { | 68 | static struct raw_hashinfo raw_v6_hashinfo = { |
67 | .lock = __RW_LOCK_UNLOCKED(raw_v6_hashinfo.lock), | 69 | .lock = __RW_LOCK_UNLOCKED(raw_v6_hashinfo.lock), |
68 | }; | 70 | }; |
@@ -111,8 +113,11 @@ static int icmpv6_filter(const struct sock *sk, const struct sk_buff *skb) | |||
111 | struct icmp6hdr _hdr; | 113 | struct icmp6hdr _hdr; |
112 | const struct icmp6hdr *hdr; | 114 | const struct icmp6hdr *hdr; |
113 | 115 | ||
116 | /* We require only the four bytes of the ICMPv6 header, not any | ||
117 | * additional bytes of message body in "struct icmp6hdr". | ||
118 | */ | ||
114 | hdr = skb_header_pointer(skb, skb_transport_offset(skb), | 119 | hdr = skb_header_pointer(skb, skb_transport_offset(skb), |
115 | sizeof(_hdr), &_hdr); | 120 | ICMPV6_HDRLEN, &_hdr); |
116 | if (hdr) { | 121 | if (hdr) { |
117 | const __u32 *data = &raw6_sk(sk)->filter.data[0]; | 122 | const __u32 *data = &raw6_sk(sk)->filter.data[0]; |
118 | unsigned int type = hdr->icmp6_type; | 123 | unsigned int type = hdr->icmp6_type; |