|
Tomas Hozza |
eb2e08 |
From cb41aeedd9b11eef6fe24eb6bab58f6fd7e0efe8 Mon Sep 17 00:00:00 2001
|
|
Tomas Hozza |
eb2e08 |
From: Mark Andrews <marka@isc.org>
|
|
Tomas Hozza |
eb2e08 |
Date: Fri, 5 Dec 2014 18:26:38 +1100
|
|
Tomas Hozza |
eb2e08 |
Subject: [PATCH] 4020. [bug] Change 3736 broke nsupdate's SOA
|
|
Tomas Hozza |
eb2e08 |
MNAME discovery resulting in updates being sent to
|
|
Tomas Hozza |
eb2e08 |
the wrong server. [RT #37925]
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
(cherry picked from commit 03fd9cb81c2a92cf54baab5103db10e8ef9d524a)
|
|
Tomas Hozza |
eb2e08 |
---
|
|
Tomas Hozza |
eb2e08 |
bin/nsupdate/nsupdate.c | 206 ++++++++++++++++++++++++++++++++++--------------
|
|
Tomas Hozza |
eb2e08 |
3 files changed, 159 insertions(+), 57 deletions(-)
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c
|
|
Tomas Hozza |
eb2e08 |
index 1831624..e266330 100644
|
|
Tomas Hozza |
eb2e08 |
--- a/bin/nsupdate/nsupdate.c
|
|
Tomas Hozza |
eb2e08 |
+++ b/bin/nsupdate/nsupdate.c
|
|
Tomas Hozza |
eb2e08 |
@@ -160,10 +160,14 @@ static dst_key_t *sig0key = NULL;
|
|
Tomas Hozza |
eb2e08 |
static lwres_context_t *lwctx = NULL;
|
|
Tomas Hozza |
eb2e08 |
static lwres_conf_t *lwconf;
|
|
Tomas Hozza |
eb2e08 |
static isc_sockaddr_t *servers = NULL;
|
|
Tomas Hozza |
eb2e08 |
+static isc_sockaddr_t *master_servers = NULL;
|
|
Tomas Hozza |
eb2e08 |
static isc_boolean_t default_servers = ISC_TRUE;
|
|
Tomas Hozza |
eb2e08 |
static int ns_inuse = 0;
|
|
Tomas Hozza |
eb2e08 |
+static int master_inuse = 0;
|
|
Tomas Hozza |
eb2e08 |
static int ns_total = 0;
|
|
Tomas Hozza |
eb2e08 |
-static isc_sockaddr_t *localaddr = NULL;
|
|
Tomas Hozza |
eb2e08 |
+static int master_total = 0;
|
|
Tomas Hozza |
eb2e08 |
+static isc_sockaddr_t *localaddr4 = NULL;
|
|
Tomas Hozza |
eb2e08 |
+static isc_sockaddr_t *localaddr6 = NULL;
|
|
Tomas Hozza |
eb2e08 |
static const char *keyfile = NULL;
|
|
Tomas Hozza |
eb2e08 |
static char *keystr = NULL;
|
|
Tomas Hozza |
eb2e08 |
static isc_entropy_t *entropy = NULL;
|
|
Tomas Hozza |
eb2e08 |
@@ -189,8 +193,10 @@ typedef struct nsu_requestinfo {
|
|
Tomas Hozza |
eb2e08 |
} nsu_requestinfo_t;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
-sendrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
|
|
Tomas Hozza |
eb2e08 |
- dns_message_t *msg, dns_request_t **request);
|
|
Tomas Hozza |
eb2e08 |
+sendrequest(isc_sockaddr_t *destaddr, dns_message_t *msg,
|
|
Tomas Hozza |
eb2e08 |
+ dns_request_t **request);
|
|
Tomas Hozza |
eb2e08 |
+static void
|
|
Tomas Hozza |
eb2e08 |
+send_update(dns_name_t *zonename, isc_sockaddr_t *master);
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
ISC_PLATFORM_NORETURN_PRE static void
|
|
Tomas Hozza |
eb2e08 |
fatal(const char *format, ...)
|
|
Tomas Hozza |
eb2e08 |
@@ -217,9 +223,8 @@ typedef struct nsu_gssinfo {
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
start_gssrequest(dns_name_t *master);
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
-send_gssrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
|
|
Tomas Hozza |
eb2e08 |
- dns_message_t *msg, dns_request_t **request,
|
|
Tomas Hozza |
eb2e08 |
- gss_ctx_id_t context);
|
|
Tomas Hozza |
eb2e08 |
+send_gssrequest(isc_sockaddr_t *destaddr, dns_message_t *msg,
|
|
Tomas Hozza |
eb2e08 |
+ dns_request_t **request, gss_ctx_id_t context);
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
recvgss(isc_task_t *task, isc_event_t *event);
|
|
Tomas Hozza |
eb2e08 |
#endif /* GSSAPI */
|
|
Tomas Hozza |
eb2e08 |
@@ -294,6 +299,16 @@ cleanup_entropy(isc_entropy_t **ectx) {
|
|
Tomas Hozza |
eb2e08 |
isc_entropy_detach(ectx);
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
+static void
|
|
Tomas Hozza |
eb2e08 |
+master_from_servers(void) {
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
+ if (master_servers != NULL && master_servers != servers)
|
|
Tomas Hozza |
eb2e08 |
+ isc_mem_put(mctx, master_servers,
|
|
Tomas Hozza |
eb2e08 |
+ master_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+ master_servers = servers;
|
|
Tomas Hozza |
eb2e08 |
+ master_total = ns_total;
|
|
Tomas Hozza |
eb2e08 |
+ master_inuse = ns_inuse;
|
|
Tomas Hozza |
eb2e08 |
+}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
static dns_rdataclass_t
|
|
Tomas Hozza |
eb2e08 |
getzoneclass(void) {
|
|
Tomas Hozza |
eb2e08 |
@@ -714,11 +729,22 @@ static void
|
|
Tomas Hozza |
eb2e08 |
doshutdown(void) {
|
|
Tomas Hozza |
eb2e08 |
isc_task_detach(&global_task);
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
+ /*
|
|
Tomas Hozza |
eb2e08 |
+ * The isc_mem_put of master_servers must be before the
|
|
Tomas Hozza |
eb2e08 |
+ * isc_mem_put of servers must is it NULL the pointer.
|
|
Tomas Hozza |
eb2e08 |
+ */
|
|
Tomas Hozza |
eb2e08 |
+ if (master_servers != NULL && master_servers != servers)
|
|
Tomas Hozza |
eb2e08 |
+ isc_mem_put(mctx, master_servers,
|
|
Tomas Hozza |
eb2e08 |
+ master_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
if (servers != NULL)
|
|
Tomas Hozza |
eb2e08 |
isc_mem_put(mctx, servers, ns_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- if (localaddr != NULL)
|
|
Tomas Hozza |
eb2e08 |
- isc_mem_put(mctx, localaddr, sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+ if (localaddr4 != NULL)
|
|
Tomas Hozza |
eb2e08 |
+ isc_mem_put(mctx, localaddr4, sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
+ if (localaddr6 != NULL)
|
|
Tomas Hozza |
eb2e08 |
+ isc_mem_put(mctx, localaddr6, sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
if (tsigkey != NULL) {
|
|
Tomas Hozza |
eb2e08 |
ddebug("Freeing TSIG key");
|
|
Tomas Hozza |
eb2e08 |
@@ -824,6 +850,12 @@ setup_system(void) {
|
|
Tomas Hozza |
eb2e08 |
(void)lwres_conf_parse(lwctx, RESOLV_CONF);
|
|
Tomas Hozza |
eb2e08 |
lwconf = lwres_conf_get(lwctx);
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
+ if (servers != NULL) {
|
|
Tomas Hozza |
eb2e08 |
+ if (master_servers == servers)
|
|
Tomas Hozza |
eb2e08 |
+ master_servers = NULL;
|
|
Tomas Hozza |
eb2e08 |
+ isc_mem_put(mctx, servers, ns_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+ }
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
ns_inuse = 0;
|
|
Tomas Hozza |
eb2e08 |
if (local_only || lwconf->nsnext <= 0) {
|
|
Tomas Hozza |
eb2e08 |
struct in_addr in;
|
|
Tomas Hozza |
eb2e08 |
@@ -832,11 +864,7 @@ setup_system(void) {
|
|
Tomas Hozza |
eb2e08 |
if (local_only && keyfile == NULL)
|
|
Tomas Hozza |
eb2e08 |
keyfile = SESSION_KEYFILE;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- default_servers = ISC_FALSE;
|
|
Tomas Hozza |
eb2e08 |
-
|
|
Tomas Hozza |
eb2e08 |
- if (servers != NULL)
|
|
Tomas Hozza |
eb2e08 |
- isc_mem_put(mctx, servers,
|
|
Tomas Hozza |
eb2e08 |
- ns_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+ default_servers = !local_only;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
ns_total = (have_ipv4 ? 1 : 0) + (have_ipv6 ? 1 : 0);
|
|
Tomas Hozza |
eb2e08 |
servers = isc_mem_get(mctx, ns_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
@@ -1424,12 +1452,16 @@ evaluate_server(char *cmdline) {
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- if (servers != NULL)
|
|
Tomas Hozza |
eb2e08 |
+ if (servers != NULL) {
|
|
Tomas Hozza |
eb2e08 |
+ if (master_servers == servers)
|
|
Tomas Hozza |
eb2e08 |
+ master_servers = NULL;
|
|
Tomas Hozza |
eb2e08 |
isc_mem_put(mctx, servers, ns_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+ }
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
default_servers = ISC_FALSE;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
ns_total = MAX_SERVERADDRS;
|
|
Tomas Hozza |
eb2e08 |
+ ns_inuse = 0;
|
|
Tomas Hozza |
eb2e08 |
servers = isc_mem_get(mctx, ns_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
if (servers == NULL)
|
|
Tomas Hozza |
eb2e08 |
fatal("out of memory");
|
|
Tomas Hozza |
eb2e08 |
@@ -1470,17 +1502,19 @@ evaluate_local(char *cmdline) {
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- if (localaddr == NULL) {
|
|
Tomas Hozza |
eb2e08 |
- localaddr = isc_mem_get(mctx, sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
- if (localaddr == NULL)
|
|
Tomas Hozza |
eb2e08 |
+ if (have_ipv6 && inet_pton(AF_INET6, local, &in6) == 1) {
|
|
Tomas Hozza |
eb2e08 |
+ if (localaddr6 == NULL)
|
|
Tomas Hozza |
eb2e08 |
+ localaddr6 = isc_mem_get(mctx, sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+ if (localaddr6 == NULL)
|
|
Tomas Hozza |
eb2e08 |
fatal("out of memory");
|
|
Tomas Hozza |
eb2e08 |
- }
|
|
Tomas Hozza |
eb2e08 |
-
|
|
Tomas Hozza |
eb2e08 |
- if (have_ipv6 && inet_pton(AF_INET6, local, &in6) == 1)
|
|
Tomas Hozza |
eb2e08 |
- isc_sockaddr_fromin6(localaddr, &in6, (in_port_t)port);
|
|
Tomas Hozza |
eb2e08 |
- else if (have_ipv4 && inet_pton(AF_INET, local, &in4) == 1)
|
|
Tomas Hozza |
eb2e08 |
- isc_sockaddr_fromin(localaddr, &in4, (in_port_t)port);
|
|
Tomas Hozza |
eb2e08 |
- else {
|
|
Tomas Hozza |
eb2e08 |
+ isc_sockaddr_fromin6(localaddr6, &in6, (in_port_t)port);
|
|
Tomas Hozza |
eb2e08 |
+ } else if (have_ipv4 && inet_pton(AF_INET, local, &in4) == 1) {
|
|
Tomas Hozza |
eb2e08 |
+ if (localaddr4 == NULL)
|
|
Tomas Hozza |
eb2e08 |
+ localaddr4 = isc_mem_get(mctx, sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+ if (localaddr4 == NULL)
|
|
Tomas Hozza |
eb2e08 |
+ fatal("out of memory");
|
|
Tomas Hozza |
eb2e08 |
+ isc_sockaddr_fromin(localaddr4, &in4, (in_port_t)port);
|
|
Tomas Hozza |
eb2e08 |
+ } else {
|
|
Tomas Hozza |
eb2e08 |
fprintf(stderr, "invalid address %s", local);
|
|
Tomas Hozza |
eb2e08 |
return (STATUS_SYNTAX);
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
@@ -2145,6 +2179,19 @@ check_tsig_error(dns_rdataset_t *rdataset, isc_buffer_t *b) {
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
+static isc_boolean_t
|
|
Tomas Hozza |
eb2e08 |
+next_master(const char *caller, isc_sockaddr_t *addr, isc_result_t eresult) {
|
|
Tomas Hozza |
eb2e08 |
+ char addrbuf[ISC_SOCKADDR_FORMATSIZE];
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
+ isc_sockaddr_format(addr, addrbuf, sizeof(addrbuf));
|
|
Tomas Hozza |
eb2e08 |
+ fprintf(stderr, "; Communication with %s failed: %s\n",
|
|
Tomas Hozza |
eb2e08 |
+ addrbuf, isc_result_totext(eresult));
|
|
Tomas Hozza |
eb2e08 |
+ if (++master_inuse >= master_total)
|
|
Tomas Hozza |
eb2e08 |
+ return (ISC_FALSE);
|
|
Tomas Hozza |
eb2e08 |
+ ddebug("%s: trying next server", caller);
|
|
Tomas Hozza |
eb2e08 |
+ return (ISC_TRUE);
|
|
Tomas Hozza |
eb2e08 |
+}
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
update_completed(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
dns_requestevent_t *reqev = NULL;
|
|
Tomas Hozza |
eb2e08 |
@@ -2169,10 +2216,19 @@ update_completed(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
if (reqev->result != ISC_R_SUCCESS) {
|
|
Tomas Hozza |
eb2e08 |
- fprintf(stderr, "; Communication with server failed: %s\n",
|
|
Tomas Hozza |
eb2e08 |
- isc_result_totext(reqev->result));
|
|
Tomas Hozza |
eb2e08 |
- seenerror = ISC_TRUE;
|
|
Tomas Hozza |
eb2e08 |
- goto done;
|
|
Tomas Hozza |
eb2e08 |
+ if (!next_master("recvsoa", &master_servers[master_inuse],
|
|
Tomas Hozza |
eb2e08 |
+ reqev->result)) {
|
|
Tomas Hozza |
eb2e08 |
+ seenerror = ISC_TRUE;
|
|
Tomas Hozza |
eb2e08 |
+ goto done;
|
|
Tomas Hozza |
eb2e08 |
+ }
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
+ ddebug("Destroying request [%p]", request);
|
|
Tomas Hozza |
eb2e08 |
+ dns_request_destroy(&request);
|
|
Tomas Hozza |
eb2e08 |
+ dns_message_renderreset(updatemsg);
|
|
Tomas Hozza |
eb2e08 |
+ dns_message_settsigkey(updatemsg, NULL);
|
|
Tomas Hozza |
eb2e08 |
+ send_update(zonename, &master_servers[master_inuse]);
|
|
Tomas Hozza |
eb2e08 |
+ isc_event_free(&event);
|
|
Tomas Hozza |
eb2e08 |
+ return;
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &answer);
|
|
Tomas Hozza |
eb2e08 |
@@ -2237,12 +2293,11 @@ update_completed(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
-send_update(dns_name_t *zonename, isc_sockaddr_t *master,
|
|
Tomas Hozza |
eb2e08 |
- isc_sockaddr_t *srcaddr)
|
|
Tomas Hozza |
eb2e08 |
-{
|
|
Tomas Hozza |
eb2e08 |
+send_update(dns_name_t *zonename, isc_sockaddr_t *master) {
|
|
Tomas Hozza |
eb2e08 |
isc_result_t result;
|
|
Tomas Hozza |
eb2e08 |
dns_request_t *request = NULL;
|
|
Tomas Hozza |
eb2e08 |
unsigned int options = DNS_REQUESTOPT_CASE;
|
|
Tomas Hozza |
eb2e08 |
+ isc_sockaddr_t *srcaddr;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
ddebug("send_update()");
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
@@ -2261,6 +2316,11 @@ send_update(dns_name_t *zonename, isc_sockaddr_t *master,
|
|
Tomas Hozza |
eb2e08 |
fprintf(stderr, "Sending update to %s\n", addrbuf);
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
+ if (isc_sockaddr_pf(master) == AF_INET6)
|
|
Tomas Hozza |
eb2e08 |
+ srcaddr = localaddr6;
|
|
Tomas Hozza |
eb2e08 |
+ else
|
|
Tomas Hozza |
eb2e08 |
+ srcaddr = localaddr4;
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
/* Windows doesn't like the tsig name to be compressed. */
|
|
Tomas Hozza |
eb2e08 |
if (updatemsg->tsigname)
|
|
Tomas Hozza |
eb2e08 |
updatemsg->tsigname->attributes |= DNS_NAMEATTR_NOCOMPRESS;
|
|
Tomas Hozza |
eb2e08 |
@@ -2306,6 +2366,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
nsu_requestinfo_t *reqinfo;
|
|
Tomas Hozza |
eb2e08 |
dns_message_t *soaquery = NULL;
|
|
Tomas Hozza |
eb2e08 |
isc_sockaddr_t *addr;
|
|
Tomas Hozza |
eb2e08 |
+ isc_sockaddr_t *srcaddr;
|
|
Tomas Hozza |
eb2e08 |
isc_boolean_t seencname = ISC_FALSE;
|
|
Tomas Hozza |
eb2e08 |
dns_name_t tname;
|
|
Tomas Hozza |
eb2e08 |
unsigned int nlabels;
|
|
Tomas Hozza |
eb2e08 |
@@ -2339,7 +2400,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
dns_request_destroy(&request);
|
|
Tomas Hozza |
eb2e08 |
dns_message_renderreset(soaquery);
|
|
Tomas Hozza |
eb2e08 |
dns_message_settsigkey(soaquery, NULL);
|
|
Tomas Hozza |
eb2e08 |
- sendrequest(localaddr, &servers[ns_inuse], soaquery, &request);
|
|
Tomas Hozza |
eb2e08 |
+ sendrequest(&servers[ns_inuse], soaquery, &request);
|
|
Tomas Hozza |
eb2e08 |
isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t));
|
|
Tomas Hozza |
eb2e08 |
isc_event_free(&event);
|
|
Tomas Hozza |
eb2e08 |
setzoneclass(dns_rdataclass_none);
|
|
Tomas Hozza |
eb2e08 |
@@ -2367,8 +2428,14 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
reqinfo->addr = addr;
|
|
Tomas Hozza |
eb2e08 |
dns_message_renderreset(soaquery);
|
|
Tomas Hozza |
eb2e08 |
ddebug("retrying soa request without TSIG");
|
|
Tomas Hozza |
eb2e08 |
- result = dns_request_createvia3(requestmgr, soaquery,
|
|
Tomas Hozza |
eb2e08 |
- localaddr, addr, 0, NULL,
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
+ if (isc_sockaddr_pf(addr) == AF_INET6)
|
|
Tomas Hozza |
eb2e08 |
+ srcaddr = localaddr6;
|
|
Tomas Hozza |
eb2e08 |
+ else
|
|
Tomas Hozza |
eb2e08 |
+ srcaddr = localaddr4;
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
+ result = dns_request_createvia3(requestmgr, soaquery, srcaddr,
|
|
Tomas Hozza |
eb2e08 |
+ addr, 0, NULL,
|
|
Tomas Hozza |
eb2e08 |
FIND_TIMEOUT * 20,
|
|
Tomas Hozza |
eb2e08 |
FIND_TIMEOUT, 3,
|
|
Tomas Hozza |
eb2e08 |
global_task, recvsoa, reqinfo,
|
|
Tomas Hozza |
eb2e08 |
@@ -2472,23 +2539,30 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
fprintf(stderr, "The master is: %s\n", namestr);
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- if (servers == NULL) {
|
|
Tomas Hozza |
eb2e08 |
+ if (default_servers) {
|
|
Tomas Hozza |
eb2e08 |
char serverstr[DNS_NAME_MAXTEXT+1];
|
|
Tomas Hozza |
eb2e08 |
isc_buffer_t buf;
|
|
Tomas Hozza |
eb2e08 |
+ size_t size;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
isc_buffer_init(&buf, serverstr, sizeof(serverstr));
|
|
Tomas Hozza |
eb2e08 |
result = dns_name_totext(&master, ISC_TRUE, &buf;;
|
|
Tomas Hozza |
eb2e08 |
check_result(result, "dns_name_totext");
|
|
Tomas Hozza |
eb2e08 |
serverstr[isc_buffer_usedlength(&buf)] = 0;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- ns_total = MAX_SERVERADDRS;
|
|
Tomas Hozza |
eb2e08 |
- servers = isc_mem_get(mctx, ns_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
- if (servers == NULL)
|
|
Tomas Hozza |
eb2e08 |
+ if (master_servers != NULL && master_servers != servers)
|
|
Tomas Hozza |
eb2e08 |
+ isc_mem_put(mctx, master_servers,
|
|
Tomas Hozza |
eb2e08 |
+ master_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
+ master_total = MAX_SERVERADDRS;
|
|
Tomas Hozza |
eb2e08 |
+ size = master_total * sizeof(isc_sockaddr_t);
|
|
Tomas Hozza |
eb2e08 |
+ master_servers = isc_mem_get(mctx, size);
|
|
Tomas Hozza |
eb2e08 |
+ if (master_servers == NULL)
|
|
Tomas Hozza |
eb2e08 |
fatal("out of memory");
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- memset(servers, 0, ns_total * sizeof(isc_sockaddr_t));
|
|
Tomas Hozza |
eb2e08 |
- get_addresses(serverstr, dnsport, servers, ns_total);
|
|
Tomas Hozza |
eb2e08 |
- }
|
|
Tomas Hozza |
eb2e08 |
+ memset(master_servers, 0, size);
|
|
Tomas Hozza |
eb2e08 |
+ get_addresses(serverstr, dnsport, master_servers, master_total);
|
|
Tomas Hozza |
eb2e08 |
+ master_inuse = 0;
|
|
Tomas Hozza |
eb2e08 |
+ } else
|
|
Tomas Hozza |
eb2e08 |
+ master_from_servers();
|
|
Tomas Hozza |
eb2e08 |
dns_rdata_freestruct(&soa;;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
#ifdef GSSAPI
|
|
Tomas Hozza |
eb2e08 |
@@ -2499,11 +2573,11 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
dns_name_dup(&master, mctx, &restart_master);
|
|
Tomas Hozza |
eb2e08 |
start_gssrequest(&master);
|
|
Tomas Hozza |
eb2e08 |
} else {
|
|
Tomas Hozza |
eb2e08 |
- send_update(zonename, &servers[ns_inuse], localaddr);
|
|
Tomas Hozza |
eb2e08 |
+ send_update(zonename, &master_servers[master_inuse]);
|
|
Tomas Hozza |
eb2e08 |
setzoneclass(dns_rdataclass_none);
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
#else
|
|
Tomas Hozza |
eb2e08 |
- send_update(zonename, &servers[ns_inuse], localaddr);
|
|
Tomas Hozza |
eb2e08 |
+ send_update(zonename, &master_servers[master_inuse]);
|
|
Tomas Hozza |
eb2e08 |
setzoneclass(dns_rdataclass_none);
|
|
Tomas Hozza |
eb2e08 |
#endif
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
@@ -2529,22 +2603,29 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
dns_request_destroy(&request);
|
|
Tomas Hozza |
eb2e08 |
dns_message_renderreset(soaquery);
|
|
Tomas Hozza |
eb2e08 |
dns_message_settsigkey(soaquery, NULL);
|
|
Tomas Hozza |
eb2e08 |
- sendrequest(localaddr, &servers[ns_inuse], soaquery, &request);
|
|
Tomas Hozza |
eb2e08 |
+ sendrequest(&servers[ns_inuse], soaquery, &request);
|
|
Tomas Hozza |
eb2e08 |
goto out;
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
-sendrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
|
|
Tomas Hozza |
eb2e08 |
- dns_message_t *msg, dns_request_t **request)
|
|
Tomas Hozza |
eb2e08 |
+sendrequest(isc_sockaddr_t *destaddr, dns_message_t *msg,
|
|
Tomas Hozza |
eb2e08 |
+ dns_request_t **request)
|
|
Tomas Hozza |
eb2e08 |
{
|
|
Tomas Hozza |
eb2e08 |
isc_result_t result;
|
|
Tomas Hozza |
eb2e08 |
nsu_requestinfo_t *reqinfo;
|
|
Tomas Hozza |
eb2e08 |
+ isc_sockaddr_t *srcaddr;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
reqinfo = isc_mem_get(mctx, sizeof(nsu_requestinfo_t));
|
|
Tomas Hozza |
eb2e08 |
if (reqinfo == NULL)
|
|
Tomas Hozza |
eb2e08 |
fatal("out of memory");
|
|
Tomas Hozza |
eb2e08 |
reqinfo->msg = msg;
|
|
Tomas Hozza |
eb2e08 |
reqinfo->addr = destaddr;
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
+ if (isc_sockaddr_pf(destaddr) == AF_INET6)
|
|
Tomas Hozza |
eb2e08 |
+ srcaddr = localaddr6;
|
|
Tomas Hozza |
eb2e08 |
+ else
|
|
Tomas Hozza |
eb2e08 |
+ srcaddr = localaddr4;
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
result = dns_request_createvia3(requestmgr, msg, srcaddr, destaddr, 0,
|
|
Tomas Hozza |
eb2e08 |
default_servers ? NULL : tsigkey,
|
|
Tomas Hozza |
eb2e08 |
FIND_TIMEOUT * 20, FIND_TIMEOUT, 3,
|
|
Tomas Hozza |
eb2e08 |
@@ -2699,17 +2780,17 @@ start_gssrequest(dns_name_t *master) {
|
|
Tomas Hozza |
eb2e08 |
fatal("dns_tkey_buildgssquery failed: %s",
|
|
Tomas Hozza |
eb2e08 |
isc_result_totext(result));
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- send_gssrequest(localaddr, kserver, rmsg, &request, context);
|
|
Tomas Hozza |
eb2e08 |
+ send_gssrequest(kserver, rmsg, &request, context);
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
-send_gssrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
|
|
Tomas Hozza |
eb2e08 |
- dns_message_t *msg, dns_request_t **request,
|
|
Tomas Hozza |
eb2e08 |
- gss_ctx_id_t context)
|
|
Tomas Hozza |
eb2e08 |
+send_gssrequest(isc_sockaddr_t *destaddr, dns_message_t *msg,
|
|
Tomas Hozza |
eb2e08 |
+ dns_request_t **request, gss_ctx_id_t context)
|
|
Tomas Hozza |
eb2e08 |
{
|
|
Tomas Hozza |
eb2e08 |
isc_result_t result;
|
|
Tomas Hozza |
eb2e08 |
nsu_gssinfo_t *reqinfo;
|
|
Tomas Hozza |
eb2e08 |
unsigned int options = 0;
|
|
Tomas Hozza |
eb2e08 |
+ isc_sockaddr_t *srcaddr;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
debug("send_gssrequest");
|
|
Tomas Hozza |
eb2e08 |
reqinfo = isc_mem_get(mctx, sizeof(nsu_gssinfo_t));
|
|
Tomas Hozza |
eb2e08 |
@@ -2720,6 +2801,12 @@ send_gssrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
|
|
Tomas Hozza |
eb2e08 |
reqinfo->context = context;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
options |= DNS_REQUESTOPT_TCP;
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
+ if (isc_sockaddr_pf(destaddr) == AF_INET6)
|
|
Tomas Hozza |
eb2e08 |
+ srcaddr = localaddr6;
|
|
Tomas Hozza |
eb2e08 |
+ else
|
|
Tomas Hozza |
eb2e08 |
+ srcaddr = localaddr4;
|
|
Tomas Hozza |
eb2e08 |
+
|
|
Tomas Hozza |
eb2e08 |
result = dns_request_createvia3(requestmgr, msg, srcaddr, destaddr,
|
|
Tomas Hozza |
eb2e08 |
options, tsigkey, FIND_TIMEOUT * 20,
|
|
Tomas Hozza |
eb2e08 |
FIND_TIMEOUT, 3, global_task, recvgss,
|
|
Tomas Hozza |
eb2e08 |
@@ -2774,7 +2861,7 @@ recvgss(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
ddebug("Destroying request [%p]", request);
|
|
Tomas Hozza |
eb2e08 |
dns_request_destroy(&request);
|
|
Tomas Hozza |
eb2e08 |
dns_message_renderreset(tsigquery);
|
|
Tomas Hozza |
eb2e08 |
- sendrequest(localaddr, &servers[ns_inuse], tsigquery, &request);
|
|
Tomas Hozza |
eb2e08 |
+ sendrequest(&servers[ns_inuse], tsigquery, &request);
|
|
Tomas Hozza |
eb2e08 |
isc_mem_put(mctx, reqinfo, sizeof(nsu_gssinfo_t));
|
|
Tomas Hozza |
eb2e08 |
isc_event_free(&event);
|
|
Tomas Hozza |
eb2e08 |
return;
|
|
Tomas Hozza |
eb2e08 |
@@ -2828,8 +2915,7 @@ recvgss(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
switch (result) {
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
case DNS_R_CONTINUE:
|
|
Tomas Hozza |
eb2e08 |
- send_gssrequest(localaddr, kserver, tsigquery, &request,
|
|
Tomas Hozza |
eb2e08 |
- context);
|
|
Tomas Hozza |
eb2e08 |
+ send_gssrequest(kserver, tsigquery, &request, context);
|
|
Tomas Hozza |
eb2e08 |
break;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
case ISC_R_SUCCESS:
|
|
Tomas Hozza |
eb2e08 |
@@ -2862,7 +2948,7 @@ recvgss(isc_task_t *task, isc_event_t *event) {
|
|
Tomas Hozza |
eb2e08 |
check_result(result, "dns_message_checksig");
|
|
Tomas Hozza |
eb2e08 |
#endif /* 0 */
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- send_update(&tmpzonename, &servers[ns_inuse], localaddr);
|
|
Tomas Hozza |
eb2e08 |
+ send_update(&tmpzonename, &master_servers[master_inuse]);
|
|
Tomas Hozza |
eb2e08 |
setzoneclass(dns_rdataclass_none);
|
|
Tomas Hozza |
eb2e08 |
break;
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
@@ -2896,8 +2982,14 @@ start_update(void) {
|
|
Tomas Hozza |
eb2e08 |
if (answer != NULL)
|
|
Tomas Hozza |
eb2e08 |
dns_message_destroy(&answer);
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
- if (userzone != NULL && ! usegsstsig) {
|
|
Tomas Hozza |
eb2e08 |
- send_update(userzone, &servers[ns_inuse], localaddr);
|
|
Tomas Hozza |
eb2e08 |
+ /*
|
|
Tomas Hozza |
eb2e08 |
+ * If we have both the zone and the servers we have enough information
|
|
Tomas Hozza |
eb2e08 |
+ * to send the update straight away otherwise we need to discover
|
|
Tomas Hozza |
eb2e08 |
+ * the zone and / or the master server.
|
|
Tomas Hozza |
eb2e08 |
+ */
|
|
Tomas Hozza |
eb2e08 |
+ if (userzone != NULL && !default_servers && !usegsstsig) {
|
|
Tomas Hozza |
eb2e08 |
+ master_from_servers();
|
|
Tomas Hozza |
eb2e08 |
+ send_update(userzone, &master_servers[master_inuse]);
|
|
Tomas Hozza |
eb2e08 |
setzoneclass(dns_rdataclass_none);
|
|
Tomas Hozza |
eb2e08 |
return;
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
@@ -2959,7 +3051,7 @@ start_update(void) {
|
|
Tomas Hozza |
eb2e08 |
dns_message_addname(soaquery, name, DNS_SECTION_QUESTION);
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
ns_inuse = 0;
|
|
Tomas Hozza |
eb2e08 |
- sendrequest(localaddr, &servers[ns_inuse], soaquery, &request);
|
|
Tomas Hozza |
eb2e08 |
+ sendrequest(&servers[ns_inuse], soaquery, &request);
|
|
Tomas Hozza |
eb2e08 |
}
|
|
Tomas Hozza |
eb2e08 |
|
|
Tomas Hozza |
eb2e08 |
static void
|
|
Tomas Hozza |
eb2e08 |
--
|
|
Tomas Hozza |
eb2e08 |
2.1.0
|
|
Tomas Hozza |
eb2e08 |
|