]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2425. [bug] named didn't detect unavailable query source addresses
authorTatuya JINMEI 神明達哉 <jinmei@isc.org>
Tue, 26 Aug 2008 02:04:20 +0000 (02:04 +0000)
committerTatuya JINMEI 神明達哉 <jinmei@isc.org>
Tue, 26 Aug 2008 02:04:20 +0000 (02:04 +0000)
at load time. [RT #18536]

CHANGES
lib/dns/dispatch.c

diff --git a/CHANGES b/CHANGES
index 6041858e6859678df80c766cb29da6073a6b7023..63d898e1cb4f5db8e9efda912a045774b40f8dc9 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2425.  [bug]           named didn't detect unavailable query source addresses
+                       at load time. [RT #18536]
+
 2424.  [port]          configure now probes for a working epoll
                        implementation.  Allow the use of kqueue,
                        epoll and /dev/poll to be selected at compile
index dd17d3524e5d6a2749fbb60117b68d1e82193dbd..cfe6cdef7b1833b95961d42915ffa5b1ac3db23d 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dispatch.c,v 1.152 2008/08/15 17:47:18 jinmei Exp $ */
+/* $Id: dispatch.c,v 1.153 2008/08/26 02:04:20 jinmei Exp $ */
 
 /*! \file */
 
@@ -2654,6 +2654,23 @@ dispatch_createudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
                                       0xffffU);
                if (result != ISC_R_SUCCESS)
                        goto deallocate_dispatch;
+       } else {
+               isc_sockaddr_t sa_any;
+
+               /*
+                * For dispatches using exclusive sockets with a specific
+                * source address, we only check if the specified address is
+                * available on the system.  Query sockets will be created later
+                * on demand.
+                */
+               isc_sockaddr_anyofpf(&sa_any, isc_sockaddr_pf(localaddr));
+               if (!isc_sockaddr_eqaddr(&sa_any, localaddr)) {
+                       result = open_socket(sockmgr, localaddr, 0, &sock);
+                       if (sock != NULL)
+                               isc_socket_detach(&sock);
+                       if (result != ISC_R_SUCCESS)
+                               goto deallocate_dispatch;
+               }
        }
        disp->socktype = isc_sockettype_udp;
        disp->socket = sock;