]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/io: don't set socket options for AF_UNIX
authorTomas Krizek <tomas.krizek@nic.cz>
Thu, 9 Jan 2020 10:57:43 +0000 (11:57 +0100)
committerTomas Krizek <tomas.krizek@nic.cz>
Fri, 17 Jan 2020 12:39:33 +0000 (13:39 +0100)
reuseaddr/reuseport and freebind only make sense for AF_INET, AF_INET6

daemon/io.c

index 64932ab0e0d894ac0b15714673cc8944f804749f..368a2207a1cd6beb5f58022242af19bdbf1bd4a9 100644 (file)
@@ -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)))