Blob Blame History Raw
--- bind-9.3.1/bin/dig/dighost.c.next_server_on_referral	2005-08-16 16:27:33.000000000 -0400
+++ bind-9.3.1/bin/dig/dighost.c	2005-08-16 16:27:49.000000000 -0400
@@ -2765,7 +2765,17 @@
 		UNLOCK_LOOKUP;
 		return;
 	}			
-	if (msg->rcode == dns_rcode_servfail && !l->servfail_stops) {
+	if ( (!l->servfail_stops)
+	   &&( (msg->rcode == dns_rcode_servfail)
+	     ||(  (msg->rcode == dns_rcode_noerror) 
+	        &&(msg->counts[DNS_SECTION_ANSWER] == 0)
+	        &&(msg->counts[DNS_SECTION_ADDITIONAL] == 0)
+		&&((msg->flags &  DNS_MESSAGEFLAG_RD) == DNS_MESSAGEFLAG_RD)
+		&&((msg->flags & (DNS_MESSAGEFLAG_RA | DNS_MESSAGEFLAG_AA)) == 0)
+	       )
+	     )
+	   )
+	{
 		dig_query_t *next = ISC_LIST_NEXT(query, link);
 		if (l->current_query == query)
 			l->current_query = NULL;
@@ -2783,9 +2793,11 @@
 		 */
 		if ((ISC_LIST_HEAD(l->q) != query) ||
 		    (ISC_LIST_NEXT(query, link) != NULL)) {
-			printf(";; Got SERVFAIL reply from %s, "
-			       "trying next server\n",
-			       query->servname);
+		        if( l->comments == ISC_TRUE )
+			        printf(";; Got %s reply from %s, "
+				       "trying next server\n",
+				       msg->rcode == dns_rcode_servfail ? "SERVFAIL" : "referral",
+				       query->servname);
 			clear_query(query);
 			check_next_lookup(l);
 			dns_message_destroy(&msg);