From aac3367a3e9fbdc5e584f47bc2d9c89f21431944 Mon Sep 17 00:00:00 2001 From: Tomas Krizek Date: Thu, 9 Jan 2020 11:57:43 +0100 Subject: [PATCH] daemon/io: don't set socket options for AF_UNIX reuseaddr/reuseport and freebind only make sense for AF_INET, AF_INET6 --- daemon/io.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/daemon/io.c b/daemon/io.c index 64932ab0e..368a2207a 100644 --- a/daemon/io.c +++ b/daemon/io.c @@ -140,29 +140,31 @@ int io_bind(const struct sockaddr *addr, int type, const endpoint_flags_t *flags if (fd < 0) return kr_error(errno); int yes = 1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))) - return kr_error(errno); + if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) { + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))) + return kr_error(errno); #ifdef SO_REUSEPORT_LB - if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT_LB, &yes, sizeof(yes))) - return kr_error(errno); + if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT_LB, &yes, sizeof(yes))) + return kr_error(errno); #elif defined(SO_REUSEPORT) && defined(__linux__) /* different meaning on (Free)BSD */ - if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes))) - return kr_error(errno); + if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes))) + return kr_error(errno); #endif #ifdef IPV6_V6ONLY - if (addr->sa_family == AF_INET6 - && setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(yes))) - return kr_error(errno); -#endif - if (flags != NULL && flags->freebind) { - int optlevel; - int optname; - int ret = family_to_freebind_option(addr->sa_family, &optlevel, &optname); - if (ret) return kr_error(ret); - if (setsockopt(fd, optlevel, optname, &yes, sizeof(yes))) + if (addr->sa_family == AF_INET6 + && setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(yes))) return kr_error(errno); +#endif + if (flags != NULL && flags->freebind) { + int optlevel; + int optname; + int ret = family_to_freebind_option(addr->sa_family, &optlevel, &optname); + if (ret) return kr_error(ret); + if (setsockopt(fd, optlevel, optname, &yes, sizeof(yes))) + return kr_error(errno); + } } if (bind(fd, addr, kr_sockaddr_len(addr))) -- 2.47.2