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).
This commit is contained in:
Matthijs Mekking
2023-08-10 09:34:19 +02:00
parent c0e39f0272
commit a0a95fb997

View File

@@ -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);