]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2113. [bug] nsupdate: if a zone is specified it should be used
authorMark Andrews <marka@isc.org>
Thu, 7 Dec 2006 05:39:45 +0000 (05:39 +0000)
committerMark Andrews <marka@isc.org>
Thu, 7 Dec 2006 05:39:45 +0000 (05:39 +0000)
                        for server discover. [RT# 16455]

CHANGES
bin/nsupdate/nsupdate.c

diff --git a/CHANGES b/CHANGES
index b716f5e36c048ddbcca16cfc15613fd65492e966..3e9d0eda4473bfbf40273f6a719b1456051d1f11 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -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]
 
 2111.  [bug]           Fix a number of errors reported by Coverity.
index cd81ec87f1689da2d66668909faf3144b9f15a9b..412505e4e09cb6582d802f75eeb2820d3f76681a 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: nsupdate.c,v 1.130.18.14 2006/06/09 07:30:28 marka Exp $ */
+/* $Id: nsupdate.c,v 1.130.18.15 2006/12/07 05:39:45 marka Exp $ */
 
 /*! \file */
 
@@ -161,6 +161,9 @@ debug(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
 static void
 ddebug(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
 
+static void
+error(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+
 #define STATUS_MORE    (isc_uint16_t)0
 #define STATUS_SEND    (isc_uint16_t)1
 #define STATUS_QUIT    (isc_uint16_t)2
@@ -194,6 +197,16 @@ fatal(const char *format, ...) {
        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
 debug(const char *format, ...) {
        va_list args;
@@ -1788,8 +1801,9 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
                setzoneclass(dns_rdataclass_none);
                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);
        reqev = NULL;
 
@@ -1848,6 +1862,19 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
            rcvmsg->rcode != dns_rcode_nxdomain)
                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:
        if (pass == 0)
                section = DNS_SECTION_ANSWER;
@@ -2004,15 +2031,6 @@ start_update(void) {
 
        if (answer != NULL)
                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) {
                send_update(userzone, userserver, localaddr);
@@ -2024,7 +2042,8 @@ start_update(void) {
                                    &soaquery);
        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);
        check_result(result, "dns_message_gettempname");
@@ -2034,10 +2053,24 @@ start_update(void) {
 
        dns_rdataset_makequestion(rdataset, getzoneclass(), dns_rdatatype_soa);
 
-       firstname = NULL;
-       dns_message_currentname(updatemsg, section, &firstname);
-       dns_name_init(name, NULL);
-       dns_name_clone(firstname, name);
+       if (userzone != NULL) {
+               dns_name_init(name, NULL);
+               dns_name_clone(userzone, 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_APPEND(name->list, rdataset, link);