]> err.no Git - linux-2.6/blobdiff - net/ipv6/ip6_input.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireles...
[linux-2.6] / net / ipv6 / ip6_input.c
index 09a3201e408aa9fd32d78d15d525db49968462d4..4e5c8615832c61d88034910422db16722151de05 100644 (file)
@@ -262,21 +262,23 @@ int ip6_mc_input(struct sk_buff *skb)
                         * is for MLD (0x0000).
                         */
                        if ((ptr[2] | ptr[3]) == 0) {
+                               deliver = 0;
+
                                if (!ipv6_ext_hdr(nexthdr)) {
                                        /* BUG */
-                                       goto discard;
+                                       goto out;
                                }
                                offset = ipv6_skip_exthdr(skb, sizeof(*hdr),
                                                          &nexthdr);
                                if (offset < 0)
-                                       goto discard;
+                                       goto out;
 
                                if (nexthdr != IPPROTO_ICMPV6)
-                                       goto discard;
+                                       goto out;
 
                                if (!pskb_may_pull(skb, (skb_network_header(skb) +
                                                   offset + 1 - skb->data)))
-                                       goto discard;
+                                       goto out;
 
                                icmp6 = (struct icmp6hdr *)(skb_network_header(skb) + offset);
 
@@ -285,12 +287,9 @@ int ip6_mc_input(struct sk_buff *skb)
                                case ICMPV6_MGM_REPORT:
                                case ICMPV6_MGM_REDUCTION:
                                case ICMPV6_MLD2_REPORT:
+                                       deliver = 1;
                                        break;
-                               default:
-                                       /* Bogus */
-                                       goto discard;
                                }
-                               deliver = 1;
                                goto out;
                        }
                        /* unknown RA - process it normally */
@@ -308,15 +307,14 @@ int ip6_mc_input(struct sk_buff *skb)
                        ip6_mr_input(skb2);
                }
        }
-#endif
 out:
-       if (likely(deliver)) {
+#endif
+       if (likely(deliver))
                ip6_input(skb);
-               return 0;
+       else {
+               /* discard */
+               kfree_skb(skb);
        }
-discard:
-       /* discard */
-       kfree_skb(skb);
 
        return 0;
 }