Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelv...
[deliverable/linux.git] / net / ipv6 / udp.c
index 6842dd2edd5bc0a9552c4bfbd2f7b9fbed7480fe..fc333d854728ee875e9068029d0ee44a4456d6c2 100644 (file)
@@ -53,6 +53,8 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
 {
        const struct in6_addr *sk_rcv_saddr6 = &inet6_sk(sk)->rcv_saddr;
        const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2);
+       __be32 sk_rcv_saddr = inet_sk(sk)->rcv_saddr;
+       __be32 sk2_rcv_saddr = inet_rcv_saddr(sk2);
        int sk_ipv6only = ipv6_only_sock(sk);
        int sk2_ipv6only = inet_v6_ipv6only(sk2);
        int addr_type = ipv6_addr_type(sk_rcv_saddr6);
@@ -60,7 +62,9 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
 
        /* if both are mapped, treat as IPv4 */
        if (addr_type == IPV6_ADDR_MAPPED && addr_type2 == IPV6_ADDR_MAPPED)
-               return ipv4_rcv_saddr_equal(sk, sk2);
+               return (!sk2_ipv6only &&
+                       (!sk_rcv_saddr || !sk2_rcv_saddr ||
+                         sk_rcv_saddr == sk2_rcv_saddr));
 
        if (addr_type2 == IPV6_ADDR_ANY &&
            !(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED))
@@ -173,10 +177,9 @@ static struct sock *__udp6_lib_lookup_skb(struct sk_buff *skb,
 
        if (unlikely(sk = skb_steal_sock(skb)))
                return sk;
-       else
-               return __udp6_lib_lookup(dev_net(skb->dst->dev), &iph->saddr, sport,
-                                        &iph->daddr, dport, inet6_iif(skb),
-                                        udptable);
+       return __udp6_lib_lookup(dev_net(skb_dst(skb)->dev), &iph->saddr, sport,
+                                &iph->daddr, dport, inet6_iif(skb),
+                                udptable);
 }
 
 /*
This page took 0.027191 seconds and 5 git commands to generate.