]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2396. [bug] Don't set SO_REUSEADDR for randomized ports.
authorMark Andrews <marka@isc.org>
Tue, 22 Jul 2008 04:16:14 +0000 (04:16 +0000)
committerMark Andrews <marka@isc.org>
Tue, 22 Jul 2008 04:16:14 +0000 (04:16 +0000)
                        [RT #18336]

14 files changed:
CHANGES
bin/dig/dighost.c
bin/named/controlconf.c
bin/named/interfacemgr.c
bin/named/lwresd.c
bin/tests/sig0_test.c
bin/tests/sock_test.c
lib/dns/dispatch.c
lib/dns/request.c
lib/dns/resolver.c
lib/dns/xfrin.c
lib/isc/include/isc/socket.h
lib/isc/unix/socket.c
lib/isc/win32/socket.c

diff --git a/CHANGES b/CHANGES
index a44e20337bb5b955de6adea78684ef29c46d0dc4..17ae2e309b29f8262175f48e50fe132a98f8433a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2396.  [bug]           Don't set SO_REUSEADDR for randomized ports.
+                       [RT #18336]
+
        --- 9.3.5-P1 released ---
 
 2375.   [security]      Fully randomize UDP query ports to improve
index f3b0d9954b969354c3df556d955296802b9013c4..a33b19b073d325d46d7705af61891fefc4382319 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dighost.c,v 1.221.2.19.2.46 2008/01/17 23:45:26 tbox Exp $ */
+/* $Id: dighost.c,v 1.221.2.19.2.46.4.1 2008/07/22 04:16:13 marka Exp $ */
 
 /*
  * Notice to programmers:  Do not use this code as an example of how to
@@ -2047,14 +2047,14 @@ send_tcp_connect(dig_query_t *query) {
        sockcount++;
        debug("sockcount=%d", sockcount);
        if (specified_source)
-               result = isc_socket_bind(query->sock, &bind_address);
+               result = isc_socket_bind(query->sock, &bind_address, 1);
        else {
                if ((isc_sockaddr_pf(&query->sockaddr) == AF_INET) &&
                    have_ipv4)
                        isc_sockaddr_any(&bind_any);
                else
                        isc_sockaddr_any6(&bind_any);
-               result = isc_socket_bind(query->sock, &bind_any);
+               result = isc_socket_bind(query->sock, &bind_any, 0);
        }
        check_result(result, "isc_socket_bind");
        bringup_timer(query, TCP_TIMEOUT);
@@ -2101,11 +2101,12 @@ send_udp(dig_query_t *query) {
                sockcount++;
                debug("sockcount=%d", sockcount);
                if (specified_source) {
-                       result = isc_socket_bind(query->sock, &bind_address);
+                       result = isc_socket_bind(query->sock,
+                                                &bind_address, 1);
                } else {
                        isc_sockaddr_anyofpf(&bind_any,
                                        isc_sockaddr_pf(&query->sockaddr));
-                       result = isc_socket_bind(query->sock, &bind_any);
+                       result = isc_socket_bind(query->sock, &bind_any, 0);
                }
                check_result(result, "isc_socket_bind");
 
index d8a7bcf2fcf935b6eb09220ddc3bc2efcf009e5c..286948eca3756a09700700ecc2cb4156d82de833 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: controlconf.c,v 1.28.2.9.2.13 2008/01/17 23:45:27 tbox Exp $ */
+/* $Id: controlconf.c,v 1.28.2.9.2.13.4.1 2008/07/22 04:16:13 marka Exp $ */
 
 #include <config.h>
 
@@ -1107,7 +1107,7 @@ add_listener(ns_controls_t *cp, controllistener_t **listenerp,
 
        if (result == ISC_R_SUCCESS)
                result = isc_socket_bind(listener->sock,
-                                        &listener->address);
+                                        &listener->address, 1);
 
        if (result == ISC_R_SUCCESS)
                result = control_listen(listener);
index f3d1d0b88c34d7807d6a6304923a185b0f992b73..48b7ce080d4d88a38fe1830c18fdb0430bf10e52 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: interfacemgr.c,v 1.59.2.5.8.21 2007/08/28 07:19:08 tbox Exp $ */
+/* $Id: interfacemgr.c,v 1.59.2.5.8.21.4.1 2008/07/22 04:16:13 marka Exp $ */
 
 #include <config.h>
 
@@ -298,7 +298,7 @@ ns_interface_accepttcp(ns_interface_t *ifp) {
 #ifndef ISC_ALLOW_MAPPED
        isc_socket_ipv6only(ifp->tcpsocket, ISC_TRUE);
 #endif
-       result = isc_socket_bind(ifp->tcpsocket, &ifp->addr);
+       result = isc_socket_bind(ifp->tcpsocket, &ifp->addr, 1);
        if (result != ISC_R_SUCCESS) {
                isc_log_write(IFMGR_COMMON_LOGARGS, ISC_LOG_ERROR,
                                 "binding TCP socket: %s",
index e48822f7119586556f210b79aacf9fa0ddffad53..9ddfd046eb75894c3ef539b9c8a692320a357eb9 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: lwresd.c,v 1.37.2.2.2.8 2006/02/28 06:32:53 marka Exp $ */
+/* $Id: lwresd.c,v 1.37.2.2.2.8.14.1 2008/07/22 04:16:13 marka Exp $ */
 
 /*
  * Main program for the Lightweight Resolver Daemon.
@@ -569,7 +569,7 @@ listener_bind(ns_lwreslistener_t *listener, isc_sockaddr_t *address) {
                return (result);
        }
 
-       result = isc_socket_bind(sock, &listener->address);
+       result = isc_socket_bind(sock, &listener->address, 1);
        if (result != ISC_R_SUCCESS) {
                char socktext[ISC_SOCKADDR_FORMATSIZE];
                isc_sockaddr_format(&listener->address, socktext,
index 4464d9ddc8b88913978bc222842136ac27b8ef56..8f5c4ed1ab3f34a4c55598ea086b3baf0f6469f0 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: sig0_test.c,v 1.9.12.8 2007/08/28 07:19:09 tbox Exp $ */
+/* $Id: sig0_test.c,v 1.9.12.8.4.1 2008/07/22 04:16:13 marka Exp $ */
 
 #include <config.h>
 
@@ -189,7 +189,7 @@ buildquery(void) {
 
        isc_buffer_usedregion(&qbuffer, &r);
        isc_sockaddr_any(&sa);
-       result = isc_socket_bind(s, &sa);
+       result = isc_socket_bind(s, &sa, 0);
        CHECK("isc_socket_bind", result);
        result = isc_socket_sendto(s, &r, task1, senddone, NULL, &address,
                                   NULL);
index 0aafee1521cdd2dc8c22c92a0a53677609778ba9..2453ee1bb90b36e8cd69397383ae7ab7767e1e77 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: sock_test.c,v 1.47.12.7 2007/08/28 07:19:09 tbox Exp $ */
+/* $Id: sock_test.c,v 1.47.12.7.4.1 2008/07/22 04:16:13 marka Exp $ */
 
 #include <config.h>
 
@@ -321,7 +321,7 @@ main(int argc, char *argv[]) {
        }
        RUNTIME_CHECK(isc_socket_create(socketmgr, pf, isc_sockettype_tcp,
                                        &so1) == ISC_R_SUCCESS);
-       result = isc_socket_bind(so1, &sockaddr);
+       result = isc_socket_bind(so1, &sockaddr, 1);
        RUNTIME_CHECK(result == ISC_R_SUCCESS);
        RUNTIME_CHECK(isc_socket_listen(so1, 0) == ISC_R_SUCCESS);
 
index 207432d5f357a63f0bbeeef1fbfc7249c5cc7764..66da0f939d474d6db57b86e52f09afd23daef39c 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dispatch.c,v 1.101.2.6.2.21.4.1 2008/05/22 21:11:15 each Exp $ */
+/* $Id: dispatch.c,v 1.101.2.6.2.21.4.2 2008/07/22 04:16:13 marka Exp $ */
 
 #include <config.h>
 
@@ -1167,7 +1167,7 @@ destroy_mgr(dns_dispatchmgr_t **mgrp) {
 
 static isc_result_t
 create_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
-             isc_socket_t **sockp)
+             int reuseaddr, isc_socket_t **sockp)
 {
        isc_socket_t *sock;
        isc_result_t result;
@@ -1181,7 +1181,7 @@ create_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
 #ifndef ISC_ALLOW_MAPPED
        isc_socket_ipv6only(sock, ISC_TRUE);
 #endif
-       result = isc_socket_bind(sock, local);
+       result = isc_socket_bind(sock, local, reuseaddr);
        if (result != ISC_R_SUCCESS) {
                isc_socket_detach(&sock);
                return (result);
@@ -1913,7 +1913,7 @@ dispatch_createudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
                                attributes &= ~DNS_DISPATCHATTR_RANDOMPORT;
                        goto getsocket;
                }
-               result = create_socket(sockmgr, &localaddr_bound, &sock);
+               result = create_socket(sockmgr, &localaddr_bound, 0, &sock);
                if (result == ISC_R_ADDRINUSE) {
                        if (++k == 1024)
                                attributes &= ~DNS_DISPATCHATTR_RANDOMPORT;
@@ -1921,7 +1921,7 @@ dispatch_createudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
                }
                localport = prt;
        } else
-               result = create_socket(sockmgr, localaddr, &sock);
+               result = create_socket(sockmgr, localaddr, 1, &sock);
        if (result != ISC_R_SUCCESS)
                goto deallocate_dispatch;
        if ((attributes & DNS_DISPATCHATTR_RANDOMPORT) == 0 &&
index 69841e5e710ced219728e28086481c2b35280718..c8074aa59bfab8abdca2c7716b5c49daa8a8ec8f 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: request.c,v 1.64.2.1.10.12 2007/08/28 07:19:13 tbox Exp $ */
+/* $Id: request.c,v 1.64.2.1.10.12.4.1 2008/07/22 04:16:13 marka Exp $ */
 
 #include <config.h>
 
@@ -516,11 +516,11 @@ create_tcp_dispatch(dns_requestmgr_t *requestmgr, isc_sockaddr_t *srcaddr,
        if (srcaddr == NULL) {
                isc_sockaddr_anyofpf(&bind_any,
                                     isc_sockaddr_pf(destaddr));
-               result = isc_socket_bind(socket, &bind_any);
+               result = isc_socket_bind(socket, &bind_any, 0);
        } else {
                src = *srcaddr;
                isc_sockaddr_setport(&src, 0);
-               result = isc_socket_bind(socket, &src);
+               result = isc_socket_bind(socket, &src, 0);
        }
        if (result != ISC_R_SUCCESS)
                goto cleanup;
index 93f10f5dd3e39494a3275a173abe54fb8d7ec9af..6e78fab3d4f5dab068842a8b076b339e768baeae 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: resolver.c,v 1.218.2.18.4.77.2.1 2008/05/22 21:11:15 each Exp $ */
+/* $Id: resolver.c,v 1.218.2.18.4.77.2.2 2008/07/22 04:16:13 marka Exp $ */
 
 #include <config.h>
 
@@ -1061,7 +1061,7 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
                        goto cleanup_query;
 
 #ifndef BROKEN_TCP_BIND_BEFORE_CONNECT
-               result = isc_socket_bind(query->tcpsocket, &addr);
+               result = isc_socket_bind(query->tcpsocket, &addr, 0);
                if (result != ISC_R_SUCCESS)
                        goto cleanup_socket;
 #endif
index 432569a4e40dfa8eb70895bdf45280fad4716bb3..8017352fa0c82db7f06f1bafd56cdf7cbde39922 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: xfrin.c,v 1.124.2.4.2.21 2007/10/31 01:59:03 marka Exp $ */
+/* $Id: xfrin.c,v 1.124.2.4.2.21.4.1 2008/07/22 04:16:14 marka Exp $ */
 
 #include <config.h>
 
@@ -857,7 +857,7 @@ xfrin_start(dns_xfrin_ctx_t *xfr) {
                                isc_sockettype_tcp,
                                &xfr->socket));
 #ifndef BROKEN_TCP_BIND_BEFORE_CONNECT
-       CHECK(isc_socket_bind(xfr->socket, &xfr->sourceaddr));
+       CHECK(isc_socket_bind(xfr->socket, &xfr->sourceaddr, 1));
 #endif
        CHECK(isc_socket_connect(xfr->socket, &xfr->masteraddr, xfr->task,
                                 xfrin_connect_done, xfr));
index 324a61a19e46084c957ef13094de070658a860b2..2a55804151a4897e30c92291c30ec96e3586f871 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.h,v 1.54.12.7 2007/08/28 07:19:15 tbox Exp $ */
+/* $Id: socket.h,v 1.54.12.7.4.1 2008/07/22 04:16:14 marka Exp $ */
 
 #ifndef ISC_SOCKET_H
 #define ISC_SOCKET_H 1
@@ -306,7 +306,7 @@ isc_socket_detach(isc_socket_t **socketp);
  */
 
 isc_result_t
-isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *addressp);
+isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *addressp, int reuseaddr);
 /*
  * Bind 'socket' to '*addressp'.
  *
@@ -351,6 +351,8 @@ isc_socket_listen(isc_socket_t *sock, unsigned int backlog);
  *
  *     'socket' is a valid, bound TCP socket.
  *
+ * \li 'reuseaddr' asks to set SO_REUSEADDR (if the port is not 0).
+
  * Returns:
  *
  *     ISC_R_SUCCESS
index 7322abc2518e319b62a286a19cc1b109705e76d1..2e8f67f6c1df3c6594e71c4f9e180ae60550cc33 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.207.2.19.2.35 2008/01/27 02:06:07 marka Exp $ */
+/* $Id: socket.c,v 1.207.2.19.2.35.4.1 2008/07/22 04:16:14 marka Exp $ */
 
 #include <config.h>
 
@@ -2948,7 +2948,7 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
 }
 
 isc_result_t
-isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) {
+isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr, int reuseaddr) {
        char strbuf[ISC_STRERRORSIZE];
        int on = 1;
 
@@ -2963,7 +2963,8 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) {
        /*
         * Only set SO_REUSEADDR when we want a specific port.
         */
-       if (isc_sockaddr_getport(sockaddr) != (in_port_t)0 &&
+       if (reuseaddr &&
+           isc_sockaddr_getport(sockaddr) != (in_port_t)0 &&
            setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on,
                       sizeof(on)) < 0) {
                UNEXPECTED_ERROR(__FILE__, __LINE__,
index 79dfe7a098ca2ebf422f49f85766ab35dfce4e35..f2be9b9d31760336149c143699d3c9cb8e2420a6 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.5.2.13.2.24 2007/08/28 07:19:17 tbox Exp $ */
+/* $Id: socket.c,v 1.5.2.13.2.24.4.1 2008/07/22 04:16:14 marka Exp $ */
 
 /* This code has been rewritten to take advantage of Windows Sockets
  * I/O Completion Ports and Events. I/O Completion Ports is ONLY
@@ -3257,7 +3257,7 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
 }
 
 isc_result_t
-isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) {
+isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr, int reuseaddr) {
        int bind_errno;
        char strbuf[ISC_STRERRORSIZE];
        int on = 1;
@@ -3273,7 +3273,8 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) {
        /*
         * Only set SO_REUSEADDR when we want a specific port.
         */
-       if (isc_sockaddr_getport(sockaddr) != (in_port_t)0 &&
+       if (reuseaddr &&
+           isc_sockaddr_getport(sockaddr) != (in_port_t)0 &&
            setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on,
                       sizeof(on)) < 0) {
                UNEXPECTED_ERROR(__FILE__, __LINE__,