diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index a941bcf87d..24e35820df 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -1754,13 +1754,18 @@ start_lookup(void) { * decremented, current_lookup will not be set to NULL.) */ static void -clear_current_lookup() { +clear_current_lookup(void) { dig_lookup_t *lookup = current_lookup; INSIST(!free_now); debug("clear_current_lookup()"); + if (lookup == NULL) { + debug("current_lookup is already detached"); + return; + } + if (ISC_LIST_HEAD(lookup->q) != NULL) { debug("still have a worker"); return; @@ -3574,16 +3579,19 @@ recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, region, arg); LOCK_LOOKUP; - lookup_attach(query->lookup, &l); isc_refcount_decrement0(&recvcount); debug("recvcount=%" PRIuFAST32, isc_refcount_current(&recvcount)); if (eresult == ISC_R_CANCELED) { debug("recv_done: cancel"); - goto detach_query; + isc_nmhandle_detach(&query->readhandle); + query_detach(&query); + return; } + lookup_attach(query->lookup, &l); + if (query->lookup->use_usec) { TIME_NOW_HIRES(&query->time_recv); } else { @@ -4204,7 +4212,13 @@ cancel_all(void) { } query_detach(&q); } - lookup_detach(¤t_lookup); + + /* + * current_lookup could have been detached via query_detach(). + */ + if (current_lookup != NULL) { + lookup_detach(¤t_lookup); + } } l = ISC_LIST_HEAD(lookup_list); while (l != NULL) {