]> 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:36:22 +0000 (23:36 +0000)
committerMark Andrews <marka@isc.org>
Wed, 23 Jul 2008 23:36:22 +0000 (23:36 +0000)
                        [RT #18336]
part 2

bin/dig/dighost.c
bin/named/controlconf.c
bin/named/interfacemgr.c
bin/named/lwresd.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 b4ca1866542fbd1dcf24d01650a75b19783d8aff..2c81fd433c8cb05943f2b34aec02dfc5e69885e0 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dighost.c,v 1.221.2.19.2.47 2008/07/22 04:00:36 marka Exp $ */
+/* $Id: dighost.c,v 1.221.2.19.2.48 2008/07/23 23:36:21 marka Exp $ */
 
 /*
  * Notice to programmers:  Do not use this code as an example of how to
@@ -2047,7 +2047,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)
@@ -2101,8 +2102,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 51c8dd9e7c38af27bac582187ae54455753f75e9..ffebec8048b46e270f5498807aac776ec3f947ff 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: controlconf.c,v 1.28.2.9.2.14 2008/07/22 04:00:37 marka Exp $ */
+/* $Id: controlconf.c,v 1.28.2.9.2.15 2008/07/23 23:36:22 marka Exp $ */
 
 #include <config.h>
 
@@ -1106,8 +1106,8 @@ add_listener(ns_controls_t *cp, controllistener_t **listenerp,
                                           &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)
                result = control_listen(listener);
index ef4d51135dae13e9fccb0d88e9828a3edb5f8762..e56bd9c3876e2d7cfa546f5081029ac5c9b02bca 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: interfacemgr.c,v 1.59.2.5.8.23 2008/07/22 23:45:33 tbox Exp $ */
+/* $Id: interfacemgr.c,v 1.59.2.5.8.24 2008/07/23 23:36:22 marka Exp $ */
 
 #include <config.h>
 
@@ -298,7 +298,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 92a39d2cd499fc48598338c4867346a5791714dc..77dce1e4ff41a0279e6946ed7246289274efd77c 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: lwresd.c,v 1.37.2.2.2.10 2008/07/22 23:45:33 tbox Exp $ */
+/* $Id: lwresd.c,v 1.37.2.2.2.11 2008/07/23 23:36:22 marka Exp $ */
 
 /*
  * Main program for the Lightweight Resolver Daemon.
@@ -569,7 +569,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 93cc24a11af4d6d21eecb73a6bed97939bd254b1..05c9c566f618ec84a7aa011399ac4244fec7b307 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: sock_test.c,v 1.47.12.9 2008/07/22 23:45:33 tbox Exp $ */
+/* $Id: sock_test.c,v 1.47.12.10 2008/07/23 23:36:22 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 6e5245163d72037bec09d9e5f73d49ad5300485f..629cf3d3ff46fe79c95046c6947d26a23011f1a4 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dispatch.c,v 1.101.2.6.2.31 2008/07/22 04:00:37 marka Exp $ */
+/* $Id: dispatch.c,v 1.101.2.6.2.32 2008/07/23 23:36:22 marka Exp $ */
 
 #include <config.h>
 
@@ -300,7 +300,7 @@ static isc_result_t qid_allocate(dns_dispatchmgr_t *mgr, unsigned int buckets,
                                 isc_boolean_t needaddrtable);
 static void qid_destroy(isc_mem_t *mctx, dns_qid_t **qidp);
 static isc_result_t open_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
-                               int reuseaddr, isc_socket_t **sockp);
+                               unsigned int options, isc_socket_t **sockp);
 static isc_boolean_t portavailable(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
                                   isc_sockaddr_t *sockaddrp);
 
@@ -1572,8 +1572,8 @@ destroy_mgr(dns_dispatchmgr_t **mgrp) {
 }
 
 static isc_result_t
-open_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local, int reuseaddr,
-           isc_socket_t **sockp)
+open_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
+           unsigned int options, isc_socket_t **sockp)
 {
        isc_socket_t *sock;
        isc_result_t result;
@@ -1593,7 +1593,7 @@ open_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local, int reuseaddr,
 #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) {
                if (*sockp == NULL)
                        isc_socket_detach(&sock);
index 20d50d7de10a7f6c0bf8ef7b00827cce71c94cd2..68ce4da47c853cb806474e973e9ddee96cc287eb 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: xfrin.c,v 1.124.2.4.2.23 2008/07/22 23:45:33 tbox Exp $ */
+/* $Id: xfrin.c,v 1.124.2.4.2.24 2008/07/23 23:36:22 marka Exp $ */
 
 #include <config.h>
 
@@ -857,7 +857,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 45d64311c230f5dfd546f6a0d184ed0922e3ad5d..d6a4139862c5e89c73c8b8660a0a4996178cb99b 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.h,v 1.54.12.11 2008/07/22 04:00:37 marka Exp $ */
+/* $Id: socket.h,v 1.54.12.12 2008/07/23 23:36:22 marka Exp $ */
 
 #ifndef ISC_SOCKET_H
 #define ISC_SOCKET_H 1
@@ -81,6 +81,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
  ***/
@@ -351,7 +357,8 @@ isc_socket_close(isc_socket_t *sock);
  */
 
 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'.
  *
@@ -396,8 +403,6 @@ 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 f4df8c223034e86810d1814f9e114351cb11cd71..e41808eab6feb080caa5779ef44d093275b73699 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.207.2.19.2.43 2008/07/22 04:00:37 marka Exp $ */
+/* $Id: socket.c,v 1.207.2.19.2.44 2008/07/23 23:36:22 marka Exp $ */
 
 #include <config.h>
 
@@ -3747,7 +3747,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) {
        char strbuf[ISC_STRERRORSIZE];
        int on = 1;
 
@@ -3762,7 +3763,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) {
index 8098b9fc4145af28ab2feaa23dd36afebab8e0f6..49bc24ff9f7cc4fca8eb24aff485bead40613347 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.5.2.13.2.30 2008/07/22 04:00:37 marka Exp $ */
+/* $Id: socket.c,v 1.5.2.13.2.31 2008/07/23 23:36:22 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
@@ -3272,7 +3272,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;
@@ -3288,7 +3289,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) {