diff --git a/CHANGES b/CHANGES index 70466f220c..3536565c8a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +5935. [bug] Fix DiG lookup reference counting bug, which could + be observed in NSSEARCH mode. [GL #3478] + 5934. [func] Improve fetches-per-zone fetch limit logging to log the final allowed and spilled values of the fetch counters before the counter object gets destroyed. diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index a207b91a2c..2131aa18ff 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -1828,11 +1828,19 @@ clear_current_lookup(void) { return; } + if (lookup->cleared) { + debug("current_lookup is already cleared"); + return; + } + if (ISC_LIST_HEAD(lookup->q) != NULL) { debug("still have a worker"); return; } + lookup->cleared = true; + debug("lookup cleared"); + lookup_detach(&lookup); } diff --git a/bin/dig/dighost.h b/bin/dig/dighost.h index e9da8f618e..00158ac6f9 100644 --- a/bin/dig/dighost.h +++ b/bin/dig/dighost.h @@ -105,7 +105,7 @@ typedef struct dig_searchlist dig_searchlist_t; struct dig_lookup { unsigned int magic; isc_refcount_t references; - bool aaonly, adflag, badcookie, besteffort, cdflag, comments, + bool aaonly, adflag, badcookie, besteffort, cdflag, cleared, comments, dns64prefix, dnssec, doing_xfr, done_as_is, ednsneg, expandaaaa, expire, header_only, identify, /*%< Append an "on server " message */