From: Tomas Krizek Date: Thu, 9 Jan 2020 10:57:43 +0000 (+0100) Subject: daemon/io: don't set socket options for AF_UNIX X-Git-Tag: v5.0.0~6^2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aac3367a3e9fbdc5e584f47bc2d9c89f21431944;p=thirdparty%2Fknot-resolver.git daemon/io: don't set socket options for AF_UNIX reuseaddr/reuseport and freebind only make sense for AF_INET, AF_INET6 --- 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)))