Merge branch 'stable-3.17' of git://git.infradead.org/users/pcmoore/selinux
[firefly-linux-kernel-4.4.55.git] / net / ipv6 / icmp.c
index f6c84a6eb2389c55f4abd55fefbd073c73743a2a..06ba3e58320ba45fc3856659e43afd952495db35 100644 (file)
@@ -626,9 +626,10 @@ void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
        int inner_offset;
        __be16 frag_off;
        u8 nexthdr;
+       struct net *net = dev_net(skb->dev);
 
        if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
-               return;
+               goto out;
 
        nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
        if (ipv6_ext_hdr(nexthdr)) {
@@ -636,14 +637,14 @@ void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
                inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
                                                &nexthdr, &frag_off);
                if (inner_offset<0)
-                       return;
+                       goto out;
        } else {
                inner_offset = sizeof(struct ipv6hdr);
        }
 
        /* Checkin header including 8 bytes of inner protocol header. */
        if (!pskb_may_pull(skb, inner_offset+8))
-               return;
+               goto out;
 
        /* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
           Without this we will not able f.e. to make source routed
@@ -652,13 +653,15 @@ void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
           --ANK (980726)
         */
 
-       rcu_read_lock();
        ipprot = rcu_dereference(inet6_protos[nexthdr]);
        if (ipprot && ipprot->err_handler)
                ipprot->err_handler(skb, NULL, type, code, inner_offset, info);
-       rcu_read_unlock();
 
        raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info);
+       return;
+
+out:
+       ICMP6_INC_STATS_BH(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
 }
 
 /*