aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv6/raw.c7
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
66static struct raw_hashinfo raw_v6_hashinfo = { 68static 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;