]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/ipv6/icmp.c
[ICMP]: Ensure that ICMP relookup maintains status quo
[linux-2.6-omap-h63xx.git] / net / ipv6 / icmp.c
index f204a7275a0d0e1e740d64f713d7d3d28cda9b78..893287ecc6289e2bf76ba5af2f9bc1efb74e0799 100644 (file)
@@ -436,24 +436,26 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
        }
 
        if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6))
-               goto out_dst_release;
+               goto relookup_failed;
 
        if (ip6_dst_lookup(sk, &dst2, &fl))
-               goto out_dst_release;
+               goto relookup_failed;
 
        err = xfrm_lookup(&dst2, &fl, sk, XFRM_LOOKUP_ICMP);
-       if (err == -ENOENT) {
+       switch (err) {
+       case 0:
+               dst_release(dst);
+               dst = dst2;
+               break;
+       case -EPERM:
+               goto out_dst_release;
+       default:
+relookup_failed:
                if (!dst)
                        goto out;
-               goto route_done;
+               break;
        }
 
-       dst_release(dst);
-       dst = dst2;
-
-       if (err)
-               goto out;
-
 route_done:
        if (ipv6_addr_is_multicast(&fl.fl6_dst))
                hlimit = np->mcast_hops;