diff --git a/CHANGES b/CHANGES index 6041858e68..63d898e1cb 100644 --- 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 diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index dd17d3524e..cfe6cdef7b 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -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;