From 7d891eaf911e5cab1f704615f8f1ef87c8716f46 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 1 Oct 2014 10:01:54 +1000 Subject: [PATCH] 3962. [bug] 'dig +topdown +trace +sigchase' address unhandled error conditions. [RT #34663] --- bin/dig/dighost.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index c99dcfc..aeded9e 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -56,6 +56,7 @@ #include #include #include +#include #include #include #include @@ -4489,6 +4490,9 @@ chase_scanname_section(dns_message_t *msg, dns_name_t *name, dns_rdataset_t *rdataset; dns_name_t *msg_name = NULL; + if (msg->counts[section] == 0) + return (NULL); + do { dns_message_currentname(msg, section, &msg_name); if (dns_name_compare(msg_name, name) == 0) { @@ -5297,6 +5301,20 @@ sigchase_td(dns_message_t *msg) isc_boolean_t have_answer = ISC_FALSE; isc_boolean_t true = ISC_TRUE; + if (msg->rcode != dns_rcode_noerror && + msg->rcode != dns_rcode_nxdomain) { + char buf[20]; + isc_buffer_t b; + + isc_buffer_init(&b, buf, sizeof(buf)); + result = dns_rcode_totext(msg->rcode, &b); + check_result(result, "dns_rcode_totext failed"); + printf("error response code %.*s\n", + (int)isc_buffer_usedlength(&b), buf); + error_message = msg; + return; + } + if ((result = dns_message_firstname(msg, DNS_SECTION_ANSWER)) == ISC_R_SUCCESS) { dns_message_currentname(msg, DNS_SECTION_ANSWER, &name); @@ -5309,10 +5327,13 @@ sigchase_td(dns_message_t *msg) if (!current_lookup->trace_root_sigchase) { result = dns_message_firstname(msg, DNS_SECTION_AUTHORITY); - if (result == ISC_R_SUCCESS) - dns_message_currentname(msg, - DNS_SECTION_AUTHORITY, - &name); + if (result != ISC_R_SUCCESS) { + printf("no answer or authority section\n"); + error_message = msg; + return; + } + dns_message_currentname(msg, DNS_SECTION_AUTHORITY, + &name); chase_nsrdataset = chase_scanname_section(msg, name, dns_rdatatype_ns, @@ -5322,7 +5343,7 @@ sigchase_td(dns_message_t *msg) if (chase_nsrdataset != NULL) { have_delegation_ns = ISC_TRUE; printf("no response but there is a delegation" - " in authority section:"); + " in authority section: "); dns_name_print(name, stdout); printf("\n"); } else { -- 1.8.2.3