Message ID | 20180612170555.11733-1-bart.vanassche@wdc.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | Revert "net: do not allow changing SO_REUSEADDR/SO_REUSEPORT on bound sockets" | expand |
On 06/12/2018 10:05 AM, Bart Van Assche wrote: > Revert the patch mentioned in the subject because it breaks at least > the Avahi mDNS daemon. That patch namely causes the Ubuntu 18.04 Avahi > daemon to fail to start: > > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Successfully called chroot(). > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Successfully dropped remaining capabilities. > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: No service file found in /etc/avahi/services. > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: SO_REUSEADDR failed: Structure needs cleaning > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: SO_REUSEADDR failed: Structure needs cleaning > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Failed to create server: No suitable network protocol available > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: avahi-daemon 0.7 exiting. > Jun 12 09:49:24 ubuntu-vm systemd[1]: avahi-daemon.service: Main process exited, code=exited, status=255/n/a > Jun 12 09:49:24 ubuntu-vm systemd[1]: avahi-daemon.service: Failed with result 'exit-code'. > Jun 12 09:49:24 ubuntu-vm systemd[1]: Failed to start Avahi mDNS/DNS-SD Stack. > > Fixes: f396922d862a ("net: do not allow changing SO_REUSEADDR/SO_REUSEPORT on bound sockets") > Cc: Maciej Żenczykowski <maze@google.com> > Cc: Eric Dumazet <edumazet@google.com> > Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com> > --- > net/core/sock.c | 15 +-------------- > 1 file changed, 1 insertion(+), 14 deletions(-) Yes, this change probably broke a lot of applications, unfortunately. Acked-by: Eric Dumazet <edumazet@google.com>
From: Bart Van Assche <bart.vanassche@wdc.com> Date: Tue, 12 Jun 2018 10:05:55 -0700 > Revert the patch mentioned in the subject because it breaks at least > the Avahi mDNS daemon. That patch namely causes the Ubuntu 18.04 Avahi > daemon to fail to start: > > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Successfully called chroot(). > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Successfully dropped remaining capabilities. > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: No service file found in /etc/avahi/services. > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: SO_REUSEADDR failed: Structure needs cleaning > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: SO_REUSEADDR failed: Structure needs cleaning > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Failed to create server: No suitable network protocol available > Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: avahi-daemon 0.7 exiting. > Jun 12 09:49:24 ubuntu-vm systemd[1]: avahi-daemon.service: Main process exited, code=exited, status=255/n/a > Jun 12 09:49:24 ubuntu-vm systemd[1]: avahi-daemon.service: Failed with result 'exit-code'. > Jun 12 09:49:24 ubuntu-vm systemd[1]: Failed to start Avahi mDNS/DNS-SD Stack. > > Fixes: f396922d862a ("net: do not allow changing SO_REUSEADDR/SO_REUSEPORT on bound sockets") > Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com> Applied, thanks. I held off on submitting the reverted patch to -stable, and have now thus removed it from my -stable queue.
Any ideas about how to fix the core issue of tb->fast* being effectively invalid? ie. currently any reader of tb->fastreuse(port) which isn't simply testing for it being >= 0 is basically a bug (-1 is the empty tb case, so that AFAICT keeps on working). For example sk_reuseport_match(tb, sk) can both fail to match when it should, and can match when it shouldn't... (at a quick glance, all the readers, and thus bugs are constrained to the inet_csk_get_port() function) Do we just delete that entire 'tb->fast*' optimization? It would certainly make the code much simpler... Do we put special case per-family/protocol code (ie. presumably another indirect call) to fix up tb->fast in the setsockopt(SOREUSEADDR/PORT) codepath? Something else? (btw. I'm not certain if both 0->1 and 1->0 transitions on a bound socket are equally buggy, I think one is more dangerous then the other)
diff --git a/net/core/sock.c b/net/core/sock.c index f333d75ef1a9..bcc41829a16d 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -728,22 +728,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname, sock_valbool_flag(sk, SOCK_DBG, valbool); break; case SO_REUSEADDR: - val = (valbool ? SK_CAN_REUSE : SK_NO_REUSE); - if ((sk->sk_family == PF_INET || sk->sk_family == PF_INET6) && - inet_sk(sk)->inet_num && - (sk->sk_reuse != val)) { - ret = (sk->sk_state == TCP_ESTABLISHED) ? -EISCONN : -EUCLEAN; - break; - } - sk->sk_reuse = val; + sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE); break; case SO_REUSEPORT: - if ((sk->sk_family == PF_INET || sk->sk_family == PF_INET6) && - inet_sk(sk)->inet_num && - (sk->sk_reuseport != valbool)) { - ret = (sk->sk_state == TCP_ESTABLISHED) ? -EISCONN : -EUCLEAN; - break; - } sk->sk_reuseport = valbool; break; case SO_TYPE:
Revert the patch mentioned in the subject because it breaks at least the Avahi mDNS daemon. That patch namely causes the Ubuntu 18.04 Avahi daemon to fail to start: Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Successfully called chroot(). Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Successfully dropped remaining capabilities. Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: No service file found in /etc/avahi/services. Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: SO_REUSEADDR failed: Structure needs cleaning Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: SO_REUSEADDR failed: Structure needs cleaning Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: Failed to create server: No suitable network protocol available Jun 12 09:49:24 ubuntu-vm avahi-daemon[529]: avahi-daemon 0.7 exiting. Jun 12 09:49:24 ubuntu-vm systemd[1]: avahi-daemon.service: Main process exited, code=exited, status=255/n/a Jun 12 09:49:24 ubuntu-vm systemd[1]: avahi-daemon.service: Failed with result 'exit-code'. Jun 12 09:49:24 ubuntu-vm systemd[1]: Failed to start Avahi mDNS/DNS-SD Stack. Fixes: f396922d862a ("net: do not allow changing SO_REUSEADDR/SO_REUSEPORT on bound sockets") Cc: Maciej Żenczykowski <maze@google.com> Cc: Eric Dumazet <edumazet@google.com> Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com> --- net/core/sock.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-)