MINOR: tcp: don't try to set/clear v6only on inherited sockets
authorWilly Tarreau <w@1wt.eu>
Wed, 26 Aug 2020 08:21:06 +0000 (10:21 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 26 Aug 2020 08:26:42 +0000 (10:26 +0200)
If a socket was already bound (inherited from a parent or retrieved from
a previous process), there's no point trying to change its IPV6_V6ONLY
state since it will fail. This is visible in strace as an EINVAL during
a reload when passing FDs.

src/proto_tcp.c

index 091772d..eb0e668 100644 (file)
@@ -974,9 +974,9 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen)
        }
 #endif
 #if defined(IPV6_V6ONLY)
-       if (listener->options & LI_O_V6ONLY)
+       if (!ext && listener->options & LI_O_V6ONLY)
                 setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
-       else if (listener->options & LI_O_V4V6)
+       else if (!ext && listener->options & LI_O_V4V6)
                 setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero));
 #endif