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

bin/dig/dighost.c
bin/named/controlconf.c
bin/named/interfacemgr.c
bin/named/lwresd.c
bin/rndc/rndc.c
bin/tests/sock_test.c
lib/dns/dispatch.c
lib/dns/xfrin.c
lib/isc/include/isc/socket.h
lib/isc/unix/socket.c
lib/isc/win32/socket.c

index ee25cb6a1f6c971306f9bb3cd3d5a714bebe14b2..9e7e79659a69cc81c0a4639bd3e35aa6ae0a7b5d 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dighost.c,v 1.259.18.43.10.2 2008/07/23 07:28:54 tbox Exp $ */
+/* $Id: dighost.c,v 1.259.18.43.10.3 2008/07/23 23:16:43 marka Exp $ */
 
 /*! \file
  *  \note
@@ -2217,7 +2217,8 @@ send_tcp_connect(dig_query_t *query) {
        sockcount++;
        debug("sockcount=%d", sockcount);
        if (specified_source)
-               result = isc_socket_bind(query->sock, &bind_address, 1);
+               result = isc_socket_bind(query->sock, &bind_address,
+                                        ISC_SOCKET_REUSEADDRESS);
        else {
                if ((isc_sockaddr_pf(&query->sockaddr) == AF_INET) &&
                    have_ipv4)
@@ -2271,8 +2272,8 @@ send_udp(dig_query_t *query) {
                sockcount++;
                debug("sockcount=%d", sockcount);
                if (specified_source) {
-                       result = isc_socket_bind(query->sock,
-                                                &bind_address, 1);
+                       result = isc_socket_bind(query->sock, &bind_address,
+                                                ISC_SOCKET_REUSEADDRESS);
                } else {
                        isc_sockaddr_anyofpf(&bind_any,
                                        isc_sockaddr_pf(&query->sockaddr));
index 15efb6d5e13b8e98d75f7ef9300d079a8f8207d0..f0703cb06505bc2d33876bfbd5600eee645dd89f 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: controlconf.c,v 1.40.18.10.40.2 2008/07/23 07:28:55 tbox Exp $ */
+/* $Id: controlconf.c,v 1.40.18.10.40.3 2008/07/23 23:16:43 marka Exp $ */
 
 /*! \file */
 
@@ -1151,8 +1151,8 @@ add_listener(ns_controls_t *cp, controllistener_t **listenerp,
                                           type, &listener->sock);
 
        if (result == ISC_R_SUCCESS)
-               result = isc_socket_bind(listener->sock,
-                                        &listener->address, 1);
+               result = isc_socket_bind(listener->sock, &listener->address,
+                                        ISC_SOCKET_REUSEADDRESS);
 
        if (result == ISC_R_SUCCESS && type == isc_sockettype_unix) {
                listener->perm = cfg_obj_asuint32(cfg_tuple_get(control,
index 121f8939deb234c2a33861a6d19e39eee8f55a84..2a82c987476434dcd1aff504923a0d3944765b38 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: interfacemgr.c,v 1.76.18.8.44.2 2008/07/23 07:28:55 tbox Exp $ */
+/* $Id: interfacemgr.c,v 1.76.18.8.44.3 2008/07/23 23:16:43 marka Exp $ */
 
 /*! \file */
 
@@ -307,7 +307,8 @@ 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, 1);
+       result = isc_socket_bind(ifp->tcpsocket, &ifp->addr,
+                                ISC_SOCKET_REUSEADDRESS);
        if (result != ISC_R_SUCCESS) {
                isc_log_write(IFMGR_COMMON_LOGARGS, ISC_LOG_ERROR,
                                 "binding TCP socket: %s",
index 5664e6eae6e4e5b7ccf08dcc1c62a34f21d5ad03..1f7184e72dccad372ab0dc77bd3a935eb4745db9 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: lwresd.c,v 1.46.18.7.52.2 2008/07/23 07:28:55 tbox Exp $ */
+/* $Id: lwresd.c,v 1.46.18.7.52.3 2008/07/23 23:16:43 marka Exp $ */
 
 /*! \file 
  * \brief
@@ -576,7 +576,8 @@ listener_bind(ns_lwreslistener_t *listener, isc_sockaddr_t *address) {
                return (result);
        }
 
-       result = isc_socket_bind(sock, &listener->address, 1);
+       result = isc_socket_bind(sock, &listener->address,
+                                ISC_SOCKET_REUSEADDRESS);
        if (result != ISC_R_SUCCESS) {
                char socktext[ISC_SOCKADDR_FORMATSIZE];
                isc_sockaddr_format(&listener->address, socktext,
index e2b181aa2f993dc7d5700443d093884b1765446b..b916aea88bd063f496cc79ec6324e9acfeb4dde2 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: rndc.c,v 1.96.18.17.42.2 2008/07/23 07:28:55 tbox Exp $ */
+/* $Id: rndc.c,v 1.96.18.17.42.3 2008/07/23 23:16:43 marka Exp $ */
 
 /*! \file */
 
@@ -400,10 +400,10 @@ rndc_startconnect(isc_sockaddr_t *addr, isc_task_t *task) {
        DO("create socket", isc_socket_create(socketmgr, pf, type, &sock));
        switch (isc_sockaddr_pf(addr)) {
        case AF_INET:
-               DO("bind socket", isc_socket_bind(sock, &local4, 1));
+               DO("bind socket", isc_socket_bind(sock, &local4, 0));
                break;
        case AF_INET6:
-               DO("bind socket", isc_socket_bind(sock, &local6, 1));
+               DO("bind socket", isc_socket_bind(sock, &local6, 0));
                break;
        default:
                break;
index ba06b05bd848a83715c8179c8a56bef2e0810dca..adbf3231a42e100d2dea7354843a08db398847ff 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: sock_test.c,v 1.49.18.1.52.2 2008/07/23 07:28:55 tbox Exp $ */
+/* $Id: sock_test.c,v 1.49.18.1.52.3 2008/07/23 23:16:43 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, 1);
+       result = isc_socket_bind(so1, &sockaddr, ISC_SOCKET_REUSEADDRESS);
        RUNTIME_CHECK(result == ISC_R_SUCCESS);
        RUNTIME_CHECK(isc_socket_listen(so1, 0) == ISC_R_SUCCESS);
 
index adac3b0f35c6e11dfb61c9a9edfe43e5145a5f9c..617fde8a2dad1c22f3b5493747563c7b8a5ca1da 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dispatch.c,v 1.116.18.19.12.4 2008/07/23 07:28:56 tbox Exp $ */
+/* $Id: dispatch.c,v 1.116.18.19.12.5 2008/07/23 23:16:43 marka Exp $ */
 
 /*! \file */
 
@@ -1191,7 +1191,7 @@ destroy_mgr(dns_dispatchmgr_t **mgrp) {
 
 static isc_result_t
 create_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
-             int reuseaddr, isc_socket_t **sockp)
+             unsigned int options, isc_socket_t **sockp)
 {
        isc_socket_t *sock;
        isc_result_t result;
@@ -1205,7 +1205,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, reuseaddr);
+       result = isc_socket_bind(sock, local, options);
        if (result != ISC_R_SUCCESS) {
                isc_socket_detach(&sock);
                return (result);
@@ -1944,7 +1944,8 @@ dispatch_createudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
                }
                localport = prt;
        } else
-               result = create_socket(sockmgr, localaddr, 1, &sock);
+               result = create_socket(sockmgr, localaddr,
+                                      ISC_SOCKET_REUSEADDRESS, &sock);
        if (result != ISC_R_SUCCESS)
                goto deallocate_dispatch;
        if ((attributes & DNS_DISPATCHATTR_RANDOMPORT) == 0 &&
index 2f8fd18e4c7c098a07cc1dedcdf5f795e31a76e5..f95773f41063e0bd141b390d9280354ff35f5375 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: xfrin.c,v 1.135.18.16.10.2 2008/07/23 07:28:56 tbox Exp $ */
+/* $Id: xfrin.c,v 1.135.18.16.10.3 2008/07/23 23:16:43 marka Exp $ */
 
 /*! \file */
 
@@ -862,7 +862,8 @@ 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, 1));
+       CHECK(isc_socket_bind(xfr->socket, &xfr->sourceaddr,
+                             ISC_SOCKET_REUSEADDRESS));
 #endif
        CHECK(isc_socket_connect(xfr->socket, &xfr->masteraddr, xfr->task,
                                 xfrin_connect_done, xfr));
index 8f09b1361d2d07dd319989eca4196a7625342b3f..951a06316ed2cc11a85b0b595cc551b25da00961 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.h,v 1.57.18.6.46.3 2008/07/23 12:04:32 marka Exp $ */
+/* $Id: socket.h,v 1.57.18.6.46.4 2008/07/23 23:16:43 marka Exp $ */
 
 #ifndef ISC_SOCKET_H
 #define ISC_SOCKET_H 1
@@ -77,6 +77,12 @@ ISC_LANG_BEGINDECLS
  */
 #define ISC_SOCKET_MAXSCATTERGATHER    8
 
+/*%
+ * In isc_socket_bind() set socket option SO_REUSEADDR prior to calling
+ * bind() if a non zero port is specified (AF_INET and AF_INET6).
+ */
+#define ISC_SOCKET_REUSEADDRESS                0x01U
+
 /***
  *** Types
  ***/
@@ -312,7 +318,8 @@ isc_socket_detach(isc_socket_t **socketp);
  */
 
 isc_result_t
-isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *addressp, int reuseaddr);
+isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *addressp,
+               unsigned int options);
 /*%<
  * Bind 'socket' to '*addressp'.
  *
@@ -322,8 +329,6 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *addressp, int reuseaddr);
  *
  * \li 'addressp' points to a valid isc_sockaddr.
  *
- * \li 'reuseaddr' asks to set SO_REUSEADDR (if the port is not 0).
-
  * Returns:
  *
  * \li ISC_R_SUCCESS
index 007067042061cd0c45d2e467b014ddc5350b1cb5..21ad07bd4dd17d2034bc35e27972ad8125db78cc 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.237.18.29.10.3 2008/07/23 12:04:32 marka Exp $ */
+/* $Id: socket.c,v 1.237.18.29.10.4 2008/07/23 23:16:44 marka Exp $ */
 
 /*! \file */
 
@@ -3184,7 +3184,8 @@ isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
 }
 
 isc_result_t
-isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr, int reuseaddr) {
+isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr, 
+               unsigned int options) {
        char strbuf[ISC_STRERRORSIZE];
        int on = 1;
 
@@ -3203,7 +3204,7 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr, int reuseaddr) {
        if (sock->pf == AF_UNIX)
                goto bind_socket;
 #endif
-       if (reuseaddr &&
+       if ((options & ISC_SOCKET_REUSEADDRESS) != 0 &&
            isc_sockaddr_getport(sockaddr) != (in_port_t)0 &&
            setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on,
                       sizeof(on)) < 0) {
index b74f21014d592a1e49bc3c0bdf89b736a5d0e002..f4ef3c5052f22c16e1b4d3acfeef686787c2cc95 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.30.18.20.12.3 2008/07/23 12:04:32 marka Exp $ */
+/* $Id: socket.c,v 1.30.18.20.12.4 2008/07/23 23:16:44 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
@@ -3283,7 +3283,8 @@ 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, int reuseaddr) {
+isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
+               unsigned int options) {
        int bind_errno;
        char strbuf[ISC_STRERRORSIZE];
        int on = 1;
@@ -3299,7 +3300,7 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr, int reuseaddr) {
        /*
         * Only set SO_REUSEADDR when we want a specific port.
         */
-       if (reuseaddr &&
+       if ((options & ISC_SOCKET_REUSEADDRESS) != 0 &&
            isc_sockaddr_getport(sockaddr) != (in_port_t)0 &&
            setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on,
                       sizeof(on)) < 0) {