]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
pullup:
authorMark Andrews <marka@isc.org>
Mon, 8 Mar 2004 12:19:48 +0000 (12:19 +0000)
committerMark Andrews <marka@isc.org>
Mon, 8 Mar 2004 12:19:48 +0000 (12:19 +0000)
lookup SOA record w/o TSIG if initial SOA lookup w/ TSIG fails due
to TSIG err.  Required for nsupdate to discover the zone when using
a server which is forwarding updates but doesn't share the secret.

bin/nsupdate/nsupdate.c

index 32824340d73f1235c870e832e30a7405a7cd3aed..c3212ccb0f45374be40292e82b50b9f45ddc2dcb 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: nsupdate.c,v 1.103.2.19 2004/03/04 01:22:50 marka Exp $ */
+/* $Id: nsupdate.c,v 1.103.2.20 2004/03/08 12:19:48 marka Exp $ */
 
 #include <config.h>
 
@@ -1645,6 +1645,25 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
        check_result(result, "dns_message_create");
        result = dns_request_getresponse(request, rcvmsg,
                                         DNS_MESSAGEPARSE_PRESERVEORDER);
+       if (result == DNS_R_TSIGERRORSET && userserver != NULL) {
+               dns_message_destroy(&rcvmsg);
+               ddebug("Destroying request [%p]", request);
+               dns_request_destroy(&request);
+               reqinfo = isc_mem_get(mctx, sizeof(nsu_requestinfo_t));
+               if (reqinfo == NULL)
+                       fatal("out of memory");
+               reqinfo->msg = soaquery;
+               reqinfo->addr = addr;
+               dns_message_renderreset(soaquery);
+               ddebug("retrying soa request without TSIG");
+               result = dns_request_createvia(requestmgr, soaquery,
+                                              localaddr, addr, 0, NULL,
+                                              FIND_TIMEOUT, global_task,
+                                              recvsoa, reqinfo, &request);
+               check_result(result, "dns_request_createvia");
+               requests++;
+               return;
+       }
        check_result(result, "dns_request_getresponse");
        section = DNS_SECTION_ANSWER;
        if (debugging) {