netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
       [not found] <bug-32832-10286@https.bugzilla.kernel.org/>
@ 2011-04-12 23:15 ` Andrew Morton
  2011-04-12 23:17   ` David Miller
  0 siblings, 1 reply; 13+ messages in thread
From: Andrew Morton @ 2011-04-12 23:15 UTC (permalink / raw)
  To: netdev; +Cc: bugzilla-daemon, bugme-daemon, kees


(switched to email.  Please respond via emailed reply-to-all, not via the
bugzilla web interface).

On Wed, 6 Apr 2011 22:42:38 GMT
bugzilla-daemon@bugzilla.kernel.org wrote:

> https://bugzilla.kernel.org/show_bug.cgi?id=32832

There is a tescase attached to this bugzilla report.

>            Summary: shutdown(2) does not fully shut down socket any more
>            Product: Networking
>            Version: 2.5
>     Kernel Version: 2.6.38
>           Platform: All
>         OS/Version: Linux
>               Tree: Mainline
>             Status: NEW
>           Severity: normal
>           Priority: P1
>          Component: IPV4
>         AssignedTo: shemminger@linux-foundation.org
>         ReportedBy: kees@outflux.net
>         Regression: Yes
> 
> 
> In 2.6.35 and earlier, shutdown(2) will fully remove a socket. This does not
> appear to be true any more and is causing software to misbehave.
> 
> 2.6.35:
> $ ./testcase
> parent: 5957
> before:
> tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN     
> after:
> child: 5961
> $ ./testcase
> parent: 6001
> before:
> tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN     
> after:
> child: 6002
> 
> 2.6.38:
> $ ./testcase
> parent: 1138
> before:
> tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN     
> after:
> child: 1142
> $ ./testcase
> bind: Address already in use
> 
> The listener doesn't show up in netstat any more, but as long as the child
> process is running, the socket is unavailable. It is as if the shutdown(2)
> behavior has partially reverted to close(2) behavior (but in the case of using
> close(2), the child's socket would remain visible in netstat).
> 



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-12 23:15 ` [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more Andrew Morton
@ 2011-04-12 23:17   ` David Miller
  2011-04-12 23:41     ` Andrew Morton
  2011-04-13  2:55     ` Eric Dumazet
  0 siblings, 2 replies; 13+ messages in thread
From: David Miller @ 2011-04-12 23:17 UTC (permalink / raw)
  To: akpm; +Cc: netdev, bugzilla-daemon, bugme-daemon, kees

From: Andrew Morton <akpm@linux-foundation.org>
Date: Tue, 12 Apr 2011 16:15:56 -0700

> 
> (switched to email.  Please respond via emailed reply-to-all, not via the
> bugzilla web interface).

Stephen Hemminger forwarded this to the list last week, and Eric
Dumazet is actively working on a fix.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-12 23:17   ` David Miller
@ 2011-04-12 23:41     ` Andrew Morton
  2011-04-13  2:55     ` Eric Dumazet
  1 sibling, 0 replies; 13+ messages in thread
From: Andrew Morton @ 2011-04-12 23:41 UTC (permalink / raw)
  To: David Miller
  Cc: netdev, bugzilla-daemon, bugme-daemon, kees, Stephen Hemminger

On Tue, 12 Apr 2011 16:17:44 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:

> From: Andrew Morton <akpm@linux-foundation.org>
> Date: Tue, 12 Apr 2011 16:15:56 -0700
> 
> > 
> > (switched to email.  Please respond via emailed reply-to-all, not via the
> > bugzilla web interface).
> 
> Stephen Hemminger forwarded this to the list last week, and Eric
> Dumazet is actively working on a fix.

OK.

Please don't forward bugzilla reports!  Instead do a reply-to-all and
add the cc's.  That way, bugzilla will capture the email discussion and
you won't get akpmspammed.

Sigh, kernel bugzilla is a PITA.  Some people do seem to like and
expect it though.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-12 23:17   ` David Miller
  2011-04-12 23:41     ` Andrew Morton
@ 2011-04-13  2:55     ` Eric Dumazet
  2011-04-13  3:00       ` Eric Dumazet
                         ` (2 more replies)
  1 sibling, 3 replies; 13+ messages in thread
From: Eric Dumazet @ 2011-04-13  2:55 UTC (permalink / raw)
  To: David Miller; +Cc: akpm, netdev, bugzilla-daemon, bugme-daemon, kees

Le mardi 12 avril 2011 à 16:17 -0700, David Miller a écrit :
> From: Andrew Morton <akpm@linux-foundation.org>
> Date: Tue, 12 Apr 2011 16:15:56 -0700
> 
> > 
> > (switched to email.  Please respond via emailed reply-to-all, not via the
> > bugzilla web interface).
> 
> Stephen Hemminger forwarded this to the list last week, and Eric
> Dumazet is actively working on a fix.

I worked on it this week end to discover FreeBSD 8.1 would not allow
several CLOSE sockets bound to same port even with REUSEADDR.

So haproxy claim is a bit wrong (its trick doesnt work on FreeBSD), and
used an undocumented linux feature.

I feel this case is a call for SO_REUSEPORT, eventually.

http://www.unixguide.net/network/socketfaq/4.11.shtml

  SO_REUSEADDR allows your server to bind to an address which is in a
  TIME_WAIT state.  It does not allow more than one server to bind to
  the same address.  It was mentioned that use of this flag can create a
  security risk because another server can bind to a the same port, by
  binding to a specific address as opposed to INADDR_ANY.  The
  SO_REUSEPORT flag allows multiple processes to bind to the same
  address provided all of them use the SO_REUSEPORT option.


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 ?



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13  2:55     ` Eric Dumazet
@ 2011-04-13  3:00       ` Eric Dumazet
  2011-04-13 11:57         ` Daniel Baluta
  2011-04-13 19:09         ` David Miller
  2011-04-13  7:06       ` Cyril Bonté
  2011-04-14  2:34       ` Simon Horman
  2 siblings, 2 replies; 13+ messages in thread
From: Eric Dumazet @ 2011-04-13  3:00 UTC (permalink / raw)
  To: David Miller; +Cc: akpm, netdev, bugzilla-daemon, bugme-daemon, kees

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)




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13  2:55     ` Eric Dumazet
  2011-04-13  3:00       ` Eric Dumazet
@ 2011-04-13  7:06       ` Cyril Bonté
  2011-04-13  8:51         ` Eric Dumazet
  2011-04-14  2:34       ` Simon Horman
  2 siblings, 1 reply; 13+ messages in thread
From: Cyril Bonté @ 2011-04-13  7:06 UTC (permalink / raw)
  To: Eric Dumazet
  Cc: David Miller, akpm, netdev, bugzilla-daemon, bugme-daemon, kees

Le mercredi 13 avril 2011 04:55:27, Eric Dumazet a écrit :
> I worked on it this week end to discover FreeBSD 8.1 would not allow
> several CLOSE sockets bound to same port even with REUSEADDR.

Just to complete the information, yes it does, but only after a shutdown() 
call. And this is the use case of haproxy, amavisd (quoted in the bugzilla bug 
report), and others.

> So haproxy claim is a bit wrong (its trick doesnt work on FreeBSD), and
> used an undocumented linux feature.

Both test cases (the one I provided to explain the haproxy issue and the one 
provided by Kees) are not about binding 2 sockets at the same time but binding 
a new socket after the first one has been shutdown.
Sadly this also looks undocumented on FreeBSD (only saw a reference on it in a 
code comment).

> 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 ?

Agree.

Many thanks for the time you already spent on that.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13  7:06       ` Cyril Bonté
@ 2011-04-13  8:51         ` Eric Dumazet
  0 siblings, 0 replies; 13+ messages in thread
From: Eric Dumazet @ 2011-04-13  8:51 UTC (permalink / raw)
  To: Cyril Bonté
  Cc: David Miller, akpm, netdev, bugzilla-daemon, bugme-daemon, kees

Le mercredi 13 avril 2011 à 09:06 +0200, Cyril Bonté a écrit :
> Le mercredi 13 avril 2011 04:55:27, Eric Dumazet a écrit :
> > I worked on it this week end to discover FreeBSD 8.1 would not allow
> > several CLOSE sockets bound to same port even with REUSEADDR.
> 
> Just to complete the information, yes it does, but only after a shutdown() 
> call. And this is the use case of haproxy, amavisd (quoted in the bugzilla bug 
> report), and others.

Yes, but after a shutdown(), FreeBSD doesnt allow a reuse of the socket.
listen() is not available anymore. Its a bit like an unbind, or a full
close().




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13  3:00       ` Eric Dumazet
@ 2011-04-13 11:57         ` Daniel Baluta
  2011-04-13 17:43           ` David Miller
  2011-04-13 19:09         ` David Miller
  1 sibling, 1 reply; 13+ messages in thread
From: Daniel Baluta @ 2011-04-13 11:57 UTC (permalink / raw)
  To: Eric Dumazet
  Cc: David Miller, akpm, netdev, bugzilla-daemon, bugme-daemon, kees

Hi Eric, Cyril,

>> 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)

Cyril's use case looks suspect. I don't think that this is a good
reason for reverting this commit.

I would love to help on adding SO_REUSEPORT option in kernel.

thanks,
Daniel.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13 11:57         ` Daniel Baluta
@ 2011-04-13 17:43           ` David Miller
  2011-04-13 18:47             ` Stephen Hemminger
  0 siblings, 1 reply; 13+ messages in thread
From: David Miller @ 2011-04-13 17:43 UTC (permalink / raw)
  To: dbaluta; +Cc: eric.dumazet, akpm, netdev, bugzilla-daemon, bugme-daemon, kees

From: Daniel Baluta <dbaluta@ixiacom.com>
Date: Wed, 13 Apr 2011 14:57:18 +0300

> Cyril's use case looks suspect. I don't think that this is a good
> reason for reverting this commit.

I complete disagree.

Something that worked perfectly fine, probably for years, we broke.

We simply cannot do that, especially since we do not have a reasonable
alternative at this time.

Adding SO_REUSEPORT is a long range option, and not something that
will provide a fix for users right now.

So please don't even pretend to suggest that we shouldn't fix this
with a revert unless a simple, obvious, kernel fix presents itself.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13 17:43           ` David Miller
@ 2011-04-13 18:47             ` Stephen Hemminger
  0 siblings, 0 replies; 13+ messages in thread
From: Stephen Hemminger @ 2011-04-13 18:47 UTC (permalink / raw)
  To: David Miller
  Cc: dbaluta, eric.dumazet, akpm, netdev, bugzilla-daemon,
	bugme-daemon, kees

On Wed, 13 Apr 2011 10:43:17 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:

> From: Daniel Baluta <dbaluta@ixiacom.com>
> Date: Wed, 13 Apr 2011 14:57:18 +0300
> 
> > Cyril's use case looks suspect. I don't think that this is a good
> > reason for reverting this commit.
> 
> I complete disagree.
> 
> Something that worked perfectly fine, probably for years, we broke.
> 
> We simply cannot do that, especially since we do not have a reasonable
> alternative at this time.
> 
> Adding SO_REUSEPORT is a long range option, and not something that
> will provide a fix for users right now.
> 
> So please don't even pretend to suggest that we shouldn't fix this
> with a revert unless a simple, obvious, kernel fix presents itself.

Just to echo what Dave said.
Even though the semantics of this is not documented in some standard,
applications have been built on Linux expecting a certain behavior.
If you want to change what happens in this case, you have to have a
really good reason (like crash, security hole, or standards violation).

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13  3:00       ` Eric Dumazet
  2011-04-13 11:57         ` Daniel Baluta
@ 2011-04-13 19:09         ` David Miller
  2011-04-14  2:17           ` Eric Dumazet
  1 sibling, 1 reply; 13+ messages in thread
From: David Miller @ 2011-04-13 19:09 UTC (permalink / raw)
  To: eric.dumazet; +Cc: akpm, netdev, bugzilla-daemon, bugme-daemon, kees

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>
---
 net/ipv4/inet_connection_sock.c  |    5 ++---
 net/ipv6/inet6_connection_sock.c |    2 +-
 2 files changed, 3 insertions(+), 4 deletions(-)

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;
 	}
-- 
1.7.4.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13 19:09         ` David Miller
@ 2011-04-14  2:17           ` Eric Dumazet
  0 siblings, 0 replies; 13+ messages in thread
From: Eric Dumazet @ 2011-04-14  2:17 UTC (permalink / raw)
  To: David Miller; +Cc: akpm, netdev, bugzilla-daemon, bugme-daemon, kees

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 ;)




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more
  2011-04-13  2:55     ` Eric Dumazet
  2011-04-13  3:00       ` Eric Dumazet
  2011-04-13  7:06       ` Cyril Bonté
@ 2011-04-14  2:34       ` Simon Horman
  2 siblings, 0 replies; 13+ messages in thread
From: Simon Horman @ 2011-04-14  2:34 UTC (permalink / raw)
  To: Eric Dumazet
  Cc: David Miller, akpm, netdev, bugzilla-daemon, bugme-daemon, kees

On Wed, Apr 13, 2011 at 04:55:27AM +0200, Eric Dumazet wrote:
> Le mardi 12 avril 2011 à 16:17 -0700, David Miller a écrit :
> > From: Andrew Morton <akpm@linux-foundation.org>
> > Date: Tue, 12 Apr 2011 16:15:56 -0700
> > 
> > > 
> > > (switched to email.  Please respond via emailed reply-to-all, not via the
> > > bugzilla web interface).
> > 
> > Stephen Hemminger forwarded this to the list last week, and Eric
> > Dumazet is actively working on a fix.
> 
> I worked on it this week end to discover FreeBSD 8.1 would not allow
> several CLOSE sockets bound to same port even with REUSEADDR.
> 
> So haproxy claim is a bit wrong (its trick doesnt work on FreeBSD), and
> used an undocumented linux feature.
> 
> I feel this case is a call for SO_REUSEPORT, eventually.
> 
> http://www.unixguide.net/network/socketfaq/4.11.shtml
> 
>   SO_REUSEADDR allows your server to bind to an address which is in a
>   TIME_WAIT state.  It does not allow more than one server to bind to
>   the same address.  It was mentioned that use of this flag can create a
>   security risk because another server can bind to a the same port, by
>   binding to a specific address as opposed to INADDR_ANY.  The
>   SO_REUSEPORT flag allows multiple processes to bind to the same
>   address provided all of them use the SO_REUSEPORT option.
> 
> 
> 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 ?

Not entirely related, but FWIW I think that SO_REUSEPORT would
be rather useful for haproxy.

I've been working on allowing haproxy to be reconfigured without dropping
or reusing connections. I have done this by re-using open sockets. But it
would have been rather a lot easier to achieve using SO_REUSEPORT -
assuming that I understand SO_REUSEPORT correctly.


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2011-04-14  5:54 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <bug-32832-10286@https.bugzilla.kernel.org/>
2011-04-12 23:15 ` [Bugme-new] [Bug 32832] New: shutdown(2) does not fully shut down socket any more Andrew Morton
2011-04-12 23:17   ` David Miller
2011-04-12 23:41     ` Andrew Morton
2011-04-13  2:55     ` Eric Dumazet
2011-04-13  3:00       ` Eric Dumazet
2011-04-13 11:57         ` Daniel Baluta
2011-04-13 17:43           ` David Miller
2011-04-13 18:47             ` Stephen Hemminger
2011-04-13 19:09         ` David Miller
2011-04-14  2:17           ` Eric Dumazet
2011-04-13  7:06       ` Cyril Bonté
2011-04-13  8:51         ` Eric Dumazet
2011-04-14  2:34       ` Simon Horman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).