Message ID | 20110413.120929.28806842.davem@davemloft.net |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Le mercredi 13 avril 2011 à 12:09 -0700, David Miller a écrit : > From: Eric Dumazet <eric.dumazet@gmail.com> > Date: Wed, 13 Apr 2011 05:00:08 +0200 > > > Le mercredi 13 avril 2011 à 04:55 +0200, Eric Dumazet a écrit : > > > >> Since SO_REUSEPORT is not a 'stable fix', I suggest we revert the patch, > >> and eventually work on SO_REUSEPORT on net-next-2.6 > >> > >> What do you think ? > >> > > > > Sorry, I should have mentioned commit id : c191a836a908d1dd6 > > (tcp: disallow bind() to reuse addr/port) > > I'm commiting the revert as follows to net-2.6, and will queue > it up for -stable as well: > > -------------------- > Revert "tcp: disallow bind() to reuse addr/port" > > This reverts commit c191a836a908d1dd6b40c503741f91b914de3348. > > It causes known regressions for programs that expect to be able to use > SO_REUSEADDR to shutdown a socket, then successfully rebind another > socket to the same ID. > > Programs such as haproxy and amavisd expect this to work. > > This should fix kernel bugzilla 32832. > > Signed-off-by: David S. Miller <davem@davemloft.net> > --- Thanks David, I was planning to submit this revert this morning, you beat me ;) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 6c0b7f4..38f23e7 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -73,7 +73,7 @@ int inet_csk_bind_conflict(const struct sock *sk, !sk2->sk_bound_dev_if || sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) { if (!reuse || !sk2->sk_reuse || - ((1 << sk2->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))) { + sk2->sk_state == TCP_LISTEN) { const __be32 sk2_rcv_saddr = sk_rcv_saddr(sk2); if (!sk2_rcv_saddr || !sk_rcv_saddr(sk) || sk2_rcv_saddr == sk_rcv_saddr(sk)) @@ -122,8 +122,7 @@ again: (tb->num_owners < smallest_size || smallest_size == -1)) { smallest_size = tb->num_owners; smallest_rover = rover; - if (atomic_read(&hashinfo->bsockets) > (high - low) + 1 && - !inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) { + if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) { spin_unlock(&head->lock); snum = smallest_rover; goto have_snum; diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index 1660546..f2c5b0f 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c @@ -44,7 +44,7 @@ int inet6_csk_bind_conflict(const struct sock *sk, !sk2->sk_bound_dev_if || sk->sk_bound_dev_if == sk2->sk_bound_dev_if) && (!sk->sk_reuse || !sk2->sk_reuse || - ((1 << sk2->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))) && + sk2->sk_state == TCP_LISTEN) && ipv6_rcv_saddr_equal(sk, sk2)) break; }