When an upstream server answers BADCOOKIE, no matter the transport used,
the resolver eventually resends the query using TCP. However, if the
upstream server responds with BADCOOKIE again over TCP, the resolver
would keep resending until the maximum query count is reached.
This is now fixed by stopping resending once the query has already been
sent over TCP.
rctx->broken_server = DNS_R_BADVERS;
rctx->next_server = true;
#endif /* if DNS_EDNS_VERSION > 0 */
- } else if (rcode == dns_rcode_badcookie && rctx->query->rmessage->cc_ok)
+ } else if (rcode == dns_rcode_badcookie &&
+ rctx->query->rmessage->cc_ok &&
+ (rctx->retryopts & DNS_FETCHOPT_TCP) == 0)
{
/*
* We have recorded the new cookie.