From a0a95fb99790c4074d48cf8820823310ddea7840 Mon Sep 17 00:00:00 2001 From: Matthijs Mekking Date: Thu, 10 Aug 2023 09:34:19 +0200 Subject: [PATCH] Make nsupdate honor -v for SOA queries nsupdate offers the switch -v to use TCP for update requests. But before sending that update request nsupdate was using UDP connection to gather the SOA for determining the zone if not given explicitly. Only use TCP if not using the default servers, because the SOA query lookup is a different server with different capabilities (and usually not for the better of it). --- bin/nsupdate/nsupdate.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c index 1f06dab614..ae759be607 100644 --- a/bin/nsupdate/nsupdate.c +++ b/bin/nsupdate/nsupdate.c @@ -2594,6 +2594,8 @@ recvsoa(isc_task_t *task, isc_event_t *event) { result = dns_request_getresponse(request, rcvmsg, DNS_MESSAGEPARSE_PRESERVEORDER); if (result == DNS_R_TSIGERRORSET && servers != NULL) { + unsigned int options = 0; + dns_message_detach(&rcvmsg); ddebug("Destroying request [%p]", request); dns_request_destroy(&request); @@ -2603,6 +2605,10 @@ recvsoa(isc_task_t *task, isc_event_t *event) { dns_message_renderreset(soaquery); ddebug("retrying soa request without TSIG"); + if (!default_servers && usevc) { + options |= DNS_REQUESTOPT_TCP; + } + if (isc_sockaddr_pf(addr) == AF_INET6) { srcaddr = localaddr6; } else { @@ -2610,7 +2616,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) { } result = dns_request_create(requestmgr, soaquery, srcaddr, addr, - 0, NULL, timeout, udp_timeout, + options, NULL, timeout, udp_timeout, udp_retries, global_task, recvsoa, reqinfo, &request); check_result(result, "dns_request_create"); @@ -2825,6 +2831,11 @@ sendrequest(isc_sockaddr_t *destaddr, dns_message_t *msg, isc_result_t result; nsu_requestinfo_t *reqinfo; isc_sockaddr_t *srcaddr; + unsigned int options = 0; + + if (!default_servers && usevc) { + options |= DNS_REQUESTOPT_TCP; + } reqinfo = isc_mem_get(gmctx, sizeof(nsu_requestinfo_t)); reqinfo->msg = msg; @@ -2836,7 +2847,7 @@ sendrequest(isc_sockaddr_t *destaddr, dns_message_t *msg, srcaddr = localaddr4; } - result = dns_request_create(requestmgr, msg, srcaddr, destaddr, 0, + result = dns_request_create(requestmgr, msg, srcaddr, destaddr, options, default_servers ? NULL : tsigkey, timeout, udp_timeout, udp_retries, global_task, recvsoa, reqinfo, request);