From d8966062826ead2f056cd24fca5460f63467774d Mon Sep 17 00:00:00 2001 From: JINMEI Tatuya Date: Wed, 29 Oct 2025 21:58:18 -0700 Subject: [PATCH] avoid retrying a server if its address is unusable Previously, if there's no more server to try in force_next, it attempted to retry the current server similar to a query timeout case. But, force_next() is called only when the current server's address is unusable and the query was not even sent, so recvcount was not incremented, causing an assertion failure. We might be able to fix it so the retry doesn't cause a crash, but it doesn't make sense to retry the server when its address is known to be unusable. So, simply avoiding the retry would be the easiest and safest way to prevent the crash. (cherry picked from commit 022bf31fabe70e0555bba3aac98f752c79e3b3cc) --- bin/dig/dighost.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index d496f72ad5..0bb64fc87b 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -3438,19 +3438,11 @@ force_next(dig_query_t *query) { return; } - if (l->retries > 1) { - l->retries--; - debug("making new %s request, %d tries left", - l->tcp_mode ? "TCP" : "UDP", l->retries); - requeue_lookup(l, true); - lookup_detach(&l); - isc_refcount_decrement0(&recvcount); - debug("recvcount=%" PRIuFAST32, - isc_refcount_current(&recvcount)); - query_detach(&query); - clear_current_lookup(); - return; - } + /* + * We don't retry this server unlike other similar cases such as + * recv_done() because we're here due to get_address() failure, + * which shouldn't be transient. + */ if (query->readhandle != NULL) { isc_refcount_decrement0(&recvcount);