2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 15:05:23 +00:00

2113. [bug] nsupdate: if a zone is specified it should be used

for server discover. [RT# 16455]
This commit is contained in:
Mark Andrews
2006-12-07 05:39:41 +00:00
parent 58ea8fb1df
commit bca16e31b4
2 changed files with 52 additions and 16 deletions

View File

@@ -1,3 +1,6 @@
2113. [bug] nsupdate: if a zone is specified it should be used
for server discover. [RT# 16455]
2112. [security] Warn if weak RSA exponent is used. [RT #16460] 2112. [security] Warn if weak RSA exponent is used. [RT #16460]
2111. [bug] Fix a number of errors reported by Coverity. 2111. [bug] Fix a number of errors reported by Coverity.

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: nsupdate.c,v 1.145 2006/12/04 01:52:45 marka Exp $ */ /* $Id: nsupdate.c,v 1.146 2006/12/07 05:39:41 marka Exp $ */
/*! \file */ /*! \file */
@@ -201,6 +201,9 @@ static void
recvgss(isc_task_t *task, isc_event_t *event); recvgss(isc_task_t *task, isc_event_t *event);
#endif /* GSSAPI */ #endif /* GSSAPI */
static void
error(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
#define STATUS_MORE (isc_uint16_t)0 #define STATUS_MORE (isc_uint16_t)0
#define STATUS_SEND (isc_uint16_t)1 #define STATUS_SEND (isc_uint16_t)1
#define STATUS_QUIT (isc_uint16_t)2 #define STATUS_QUIT (isc_uint16_t)2
@@ -234,6 +237,16 @@ fatal(const char *format, ...) {
exit(1); exit(1);
} }
static void
error(const char *format, ...) {
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
fprintf(stderr, "\n");
}
static void static void
debug(const char *format, ...) { debug(const char *format, ...) {
va_list args; va_list args;
@@ -1893,8 +1906,9 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
setzoneclass(dns_rdataclass_none); setzoneclass(dns_rdataclass_none);
return; return;
} }
isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t));
isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t));
reqinfo = NULL;
isc_event_free(&event); isc_event_free(&event);
reqev = NULL; reqev = NULL;
@@ -1933,6 +1947,19 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
rcvmsg->rcode != dns_rcode_nxdomain) rcvmsg->rcode != dns_rcode_nxdomain)
fatal("response to SOA query was unsuccessful"); fatal("response to SOA query was unsuccessful");
if (userzone != NULL && rcvmsg->rcode == dns_rcode_nxdomain) {
char namebuf[DNS_NAME_FORMATSIZE];
dns_name_format(userzone, namebuf, sizeof(namebuf));
error("specified zone '%s' does not exist (NXDOMAIN)",
namebuf);
dns_message_destroy(&rcvmsg);
dns_request_destroy(&request);
dns_message_destroy(&soaquery);
ddebug("Out of recvsoa");
done_update();
return;
}
lookforsoa: lookforsoa:
if (pass == 0) if (pass == 0)
section = DNS_SECTION_ANSWER; section = DNS_SECTION_ANSWER;
@@ -2357,15 +2384,6 @@ start_update(void) {
if (answer != NULL) if (answer != NULL)
dns_message_destroy(&answer); dns_message_destroy(&answer);
result = dns_message_firstname(updatemsg, section);
if (result == ISC_R_NOMORE) {
section = DNS_SECTION_PREREQUISITE;
result = dns_message_firstname(updatemsg, section);
}
if (result != ISC_R_SUCCESS) {
done_update();
return;
}
if (userzone != NULL && userserver != NULL && ! usegsstsig) { if (userzone != NULL && userserver != NULL && ! usegsstsig) {
send_update(userzone, userserver, localaddr); send_update(userzone, userserver, localaddr);
@@ -2377,7 +2395,8 @@ start_update(void) {
&soaquery); &soaquery);
check_result(result, "dns_message_create"); check_result(result, "dns_message_create");
soaquery->flags |= DNS_MESSAGEFLAG_RD; if (userserver == NULL)
soaquery->flags |= DNS_MESSAGEFLAG_RD;
result = dns_message_gettempname(soaquery, &name); result = dns_message_gettempname(soaquery, &name);
check_result(result, "dns_message_gettempname"); check_result(result, "dns_message_gettempname");
@@ -2387,10 +2406,24 @@ start_update(void) {
dns_rdataset_makequestion(rdataset, getzoneclass(), dns_rdatatype_soa); dns_rdataset_makequestion(rdataset, getzoneclass(), dns_rdatatype_soa);
firstname = NULL; if (userzone != NULL) {
dns_message_currentname(updatemsg, section, &firstname); dns_name_init(name, NULL);
dns_name_init(name, NULL); dns_name_clone(userzone, name);
dns_name_clone(firstname, name); } else {
result = dns_message_firstname(updatemsg, section);
if (result == ISC_R_NOMORE) {
section = DNS_SECTION_PREREQUISITE;
result = dns_message_firstname(updatemsg, section);
}
if (result != ISC_R_SUCCESS) {
done_update();
return;
}
firstname = NULL;
dns_message_currentname(updatemsg, section, &firstname);
dns_name_init(name, NULL);
dns_name_clone(firstname, name);
}
ISC_LIST_INIT(name->list); ISC_LIST_INIT(name->list);
ISC_LIST_APPEND(name->list, rdataset, link); ISC_LIST_APPEND(name->list, rdataset, link);