]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2517. [bug] dig +trace with -4 or -6 failed when it chose a
authorTatuya JINMEI 神明達哉 <jinmei@isc.org>
Tue, 16 Dec 2008 03:00:06 +0000 (03:00 +0000)
committerTatuya JINMEI 神明達哉 <jinmei@isc.org>
Tue, 16 Dec 2008 03:00:06 +0000 (03:00 +0000)
nameserver address of the unsupported address.
[RT #18843]

CHANGES
bin/dig/dighost.c
bin/dig/include/dig/dig.h
bin/dig/nslookup.c

diff --git a/CHANGES b/CHANGES
index f72a4ee9ebe9d819fc481c284f6035ff1ca9b46f..6c56dc8fca8cfe2b652246ee3a7e3450855933c3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+2517.  [bug]           dig +trace with -4 or -6 failed when it chose a
+                       nameserver address of the unsupported address.
+                       [RT #18843]
+
 2516.  [bug]           glue sort for responses was performed even when not
                        needed. [RT #19039]
 
index 5790d442061f840796afab4ce30206c876ea13e6..cd5cd70ed5bbb56e8b4a3bb52365a0b51191ce67 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dighost.c,v 1.259.18.51 2008/12/13 04:43:52 jinmei Exp $ */
+/* $Id: dighost.c,v 1.259.18.52 2008/12/16 03:00:06 jinmei Exp $ */
 
 /*! \file
  *  \note
@@ -2180,6 +2180,21 @@ bringup_timer(dig_query_t *query, unsigned int default_timeout) {
        check_result(result, "isc_timer_create");
 }
 
+static void
+force_timeout(dig_lookup_t *l, dig_query_t *query) {
+       isc_event_t *event;
+
+       event = isc_event_allocate(mctx, query, ISC_TIMEREVENT_IDLE,
+                                  connect_timeout, l,
+                                  sizeof(isc_event_t));
+       if (event == NULL) {
+               fatal("isc_event_allocate: %s",
+                     isc_result_totext(ISC_R_NOMEMORY));
+       }
+       isc_task_send(global_task, &event);
+}
+
+
 static void
 connect_done(isc_task_t *task, isc_event_t *event);
 
@@ -2199,7 +2214,16 @@ send_tcp_connect(dig_query_t *query) {
        l = query->lookup;
        query->waiting_connect = ISC_TRUE;
        query->lookup->current_query = query;
-       get_address(query->servname, port, &query->sockaddr);
+       result = get_address(query->servname, port, &query->sockaddr);
+       if (result == ISC_R_NOTFOUND) {
+               /*
+                * This servname doesn't have an address.  Try the next server
+                * by triggering an immediate 'timeout' (we lie, but the effect
+                * is the same).
+                */
+               force_timeout(l, query);
+               return;
+       }
 
        if (specified_source &&
            (isc_sockaddr_pf(&query->sockaddr) !=
@@ -2272,7 +2296,12 @@ send_udp(dig_query_t *query) {
        if (!query->recv_made) {
                /* XXX Check the sense of this, need assertion? */
                query->waiting_connect = ISC_FALSE;
-               get_address(query->servname, port, &query->sockaddr);
+               result = get_address(query->servname, port, &query->sockaddr);
+               if (result == ISC_R_NOTFOUND) {
+                       /* This servname doesn't have an address. */
+                       force_timeout(l, query);
+                       return;
+               }
 
                result = isc_socket_create(socketmgr,
                                           isc_sockaddr_pf(&query->sockaddr),
@@ -3225,7 +3254,7 @@ recv_done(isc_task_t *task, isc_event_t *event) {
  * used in looking up server names, etc... and needs to use system-supplied
  * routines, since they may be using a non-DNS system for these lookups.
  */
-void
+isc_result_t
 get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) {
        int count;
        isc_result_t result;
@@ -3234,9 +3263,11 @@ get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) {
        result = bind9_getaddresses(host, port, sockaddr, 1, &count);
        isc_app_unblock();
        if (result != ISC_R_SUCCESS)
-               fatal("couldn't get address for '%s': %s",
-                     host, isc_result_totext(result));
+               return (result);
+
        INSIST(count == 1);
+
+       return (ISC_R_SUCCESS);
 }
 
 /*%
index 02ae4d22bc502aed572900beda305f0acc3a9fc0..10293d965b99f1014e434bf3fa11fc975f3810c4 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dig.h,v 1.82.18.23 2007/08/28 07:19:55 tbox Exp $ */
+/* $Id: dig.h,v 1.82.18.24 2008/12/16 03:00:06 jinmei Exp $ */
 
 #ifndef DIG_H
 #define DIG_H
@@ -284,7 +284,7 @@ extern int idnoptions;
 /*
  * Routines in dighost.c.
  */
-void
+isc_result_t
 get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr);
 
 isc_result_t
index 3327c6e9429a0f5bdb6cc51db1624423ef89145f..64bfdfe5b32153eda60c8d2fa75fb900c2aa1d4d 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: nslookup.c,v 1.101.18.15 2007/08/28 07:19:55 tbox Exp $ */
+/* $Id: nslookup.c,v 1.101.18.16 2008/12/16 03:00:06 jinmei Exp $ */
 
 #include <config.h>
 
@@ -441,13 +441,16 @@ show_settings(isc_boolean_t full, isc_boolean_t serv_only) {
        dig_server_t *srv;
        isc_sockaddr_t sockaddr;
        dig_searchlist_t *listent;
+       isc_result_t result;
 
        srv = ISC_LIST_HEAD(server_list);
 
        while (srv != NULL) {
                char sockstr[ISC_SOCKADDR_FORMATSIZE];
 
-               get_address(srv->servername, port, &sockaddr);
+               result = get_address(srv->servername, port, &sockaddr);
+               check_result(result, "get_address");
+
                isc_sockaddr_format(&sockaddr, sockstr, sizeof(sockstr));
                printf("Default server: %s\nAddress: %s\n",
                        srv->userarg, sockstr);