ipv6: Fix inet6_csk_bind_conflict()
authorEric Dumazet <eric.dumazet@gmail.com>
Sun, 25 Apr 2010 22:09:42 +0000 (15:09 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 25 Apr 2010 22:09:42 +0000 (15:09 -0700)
Commit fda48a0d7a84 (tcp: bind() fix when many ports are bound)
introduced a bug on IPV6 part.
We should not call ipv6_addr_any(inet6_rcv_saddr(sk2)) but
ipv6_addr_any(inet6_rcv_saddr(sk)) because sk2 can be IPV4, while sk is
IPV6.

Reported-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Tested-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/inet6_connection_sock.c

index b4b7d40a9c95a74479d0b6af834075740764d664..3a4d92b5a83e5586ff4201e2cc3abfac1caf4ead 100644 (file)
@@ -48,7 +48,7 @@ int inet6_csk_bind_conflict(const struct sock *sk,
                             ipv6_rcv_saddr_equal(sk, sk2))
                                break;
                        else if (sk->sk_reuse && sk2->sk_reuse &&
-                               !ipv6_addr_any(inet6_rcv_saddr(sk2)) &&
+                               !ipv6_addr_any(inet6_rcv_saddr(sk)) &&
                                ipv6_rcv_saddr_equal(sk, sk2))
                                break;
                }