+4756. [bug] Interrupting dig could lead to an INSIST failure after
+ certain errors were encountered while querying a host
+ whose name resolved to more than one address. Change
+ 4537 increased the odds of triggering this issue by
+ causing dig to hang indefinitely when certain error
+ paths were evaluated. dig now also retries TCP queries
+ (once) if the server gracefully closes the connection
+ before sending a response. [RT #42832, #45159]
+
4755. [cleanup] Silence unnecessary log message when NZF file doesn't
exist. [RT #46186]
looknew->mapped = ISC_TRUE;
looknew->dscp = -1;
looknew->rrcomments = 0;
+ looknew->eoferr = 0;
dns_fixedname_init(&looknew->fdomain);
ISC_LINK_INIT(looknew, link);
ISC_LIST_INIT(looknew->q);
looknew->done_as_is = lookold->done_as_is;
looknew->dscp = lookold->dscp;
looknew->rrcomments = lookold->rrcomments;
+ looknew->eoferr = lookold->eoferr;
if (lookold->ecs_addr != NULL) {
size_t len = sizeof(isc_sockaddr_t);
next = ISC_LIST_NEXT(query, link);
l = query->lookup;
clear_query(query);
- if (next == NULL)
+ if (next == NULL) {
printf(";; No acceptable nameservers\n");
- check_next_lookup(l);
+ check_next_lookup(l);
+ } else {
+ send_udp(next);
+ }
return;
}
isc_buffer_t *b = NULL;
isc_result_t result;
dig_query_t *query = NULL;
- dig_lookup_t *l;
+ dig_lookup_t *l, *n;
isc_uint16_t length;
REQUIRE(event->ev_type == ISC_SOCKEVENT_RECVDONE);
sizeof(sockstr));
printf(";; communications error to %s: %s\n",
sockstr, isc_result_totext(sevent->result));
+ if (keep != NULL)
+ isc_socket_detach(&keep);
l = query->lookup;
isc_socket_detach(&query->sock);
sockcount--;
debug("sockcount=%d", sockcount);
INSIST(sockcount >= 0);
+ if (sevent->result == ISC_R_EOF && l->eoferr == 0U) {
+ n = requeue_lookup(l, ISC_TRUE);
+ n->eoferr++;
+ }
isc_event_free(&event);
clear_query(query);
+ cancel_lookup(l);
check_next_lookup(l);
UNLOCK_LOOKUP;
return;
} else {
printf(";; communications error: %s\n",
isc_result_totext(sevent->result));
+ if (keep != NULL)
+ isc_socket_detach(&keep);
isc_socket_detach(&query->sock);
sockcount--;
debug("sockcount=%d", sockcount);
INSIST(sockcount >= 0);
}
+ if (sevent->result == ISC_R_EOF && l->eoferr == 0U) {
+ n = requeue_lookup(l, ISC_TRUE);
+ n->eoferr++;
+ }
isc_event_free(&event);
clear_query(query);
+ cancel_lookup(l);
check_next_lookup(l);
UNLOCK_LOOKUP;
return;
if (fail) {
isc_event_free(&event);
clear_query(query);
+ cancel_lookup(l);
check_next_lookup(l);
UNLOCK_LOOKUP;
return;
if (l->tcp_mode) {
isc_event_free(&event);
clear_query(query);
+ cancel_lookup(l);
check_next_lookup(l);
UNLOCK_LOOKUP;
return;