diff options
Diffstat (limited to 'net/ipv6/icmp.c')
-rw-r--r-- | net/ipv6/icmp.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index 5d7aa2c2770c..bbcdfd299692 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -423,10 +423,10 @@ static int icmp6_iif(const struct sk_buff *skb) | |||
423 | static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, | 423 | static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, |
424 | const struct in6_addr *force_saddr) | 424 | const struct in6_addr *force_saddr) |
425 | { | 425 | { |
426 | struct net *net = dev_net(skb->dev); | ||
427 | struct inet6_dev *idev = NULL; | 426 | struct inet6_dev *idev = NULL; |
428 | struct ipv6hdr *hdr = ipv6_hdr(skb); | 427 | struct ipv6hdr *hdr = ipv6_hdr(skb); |
429 | struct sock *sk; | 428 | struct sock *sk; |
429 | struct net *net; | ||
430 | struct ipv6_pinfo *np; | 430 | struct ipv6_pinfo *np; |
431 | const struct in6_addr *saddr = NULL; | 431 | const struct in6_addr *saddr = NULL; |
432 | struct dst_entry *dst; | 432 | struct dst_entry *dst; |
@@ -437,12 +437,16 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, | |||
437 | int iif = 0; | 437 | int iif = 0; |
438 | int addr_type = 0; | 438 | int addr_type = 0; |
439 | int len; | 439 | int len; |
440 | u32 mark = IP6_REPLY_MARK(net, skb->mark); | 440 | u32 mark; |
441 | 441 | ||
442 | if ((u8 *)hdr < skb->head || | 442 | if ((u8 *)hdr < skb->head || |
443 | (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb)) | 443 | (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb)) |
444 | return; | 444 | return; |
445 | 445 | ||
446 | if (!skb->dev) | ||
447 | return; | ||
448 | net = dev_net(skb->dev); | ||
449 | mark = IP6_REPLY_MARK(net, skb->mark); | ||
446 | /* | 450 | /* |
447 | * Make sure we respect the rules | 451 | * Make sure we respect the rules |
448 | * i.e. RFC 1885 2.4(e) | 452 | * i.e. RFC 1885 2.4(e) |