]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3558. [bug] IXFR of a DLZ stored zone was broken. [RT #33331]
authorMark Andrews <marka@isc.org>
Mon, 29 Apr 2013 05:46:54 +0000 (15:46 +1000)
committerMark Andrews <marka@isc.org>
Mon, 29 Apr 2013 05:46:54 +0000 (15:46 +1000)
CHANGES
bin/named/xfrout.c
bin/tests/system/dlz/tests.sh

diff --git a/CHANGES b/CHANGES
index fbd697d902b34f8e71bdc4688c87b87630ddcbf8..e50573af38e084f531874305435382120a6a90af 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+3558.  [bug]           IXFR of a DLZ stored zone was broken. [RT #33331]
+
 3557.  [bug]           Reloading redirect zones was broken. [RT #33292]
 
 3556.  [maint]         Added AAAA for D.ROOT-SERVERS.NET.
index 857df75b1e11b8f48062008f0fe94b52f3987832..40be669f67cf01422854c2e5c3c611989636abf5 100644 (file)
@@ -838,14 +838,6 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) {
                                FAILQ(DNS_R_NOTAUTH, "non-authoritative zone",
                                      question_name, question_class);
                        is_dlz = ISC_TRUE;
-                       /*
-                        * DLZ only support full zone transfer, not incremental
-                        */
-                       if (reqtype != dns_rdatatype_axfr) {
-                               mnemonic = "AXFR-style IXFR";
-                               reqtype = dns_rdatatype_axfr;
-                       }
-
                } else {
                        /*
                         * not DLZ and not in normal zone table, we are
@@ -857,12 +849,14 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) {
        } else {
                /* zone table has a match */
                switch(dns_zone_gettype(zone)) {
+                       /* Master and slave zones are OK for transfer. */
                        case dns_zone_master:
                        case dns_zone_slave:
                        case dns_zone_dlz:
-                               break;  /* Master and slave zones are OK for transfer. */
+                               break;
                        default:
-                               FAILQ(DNS_R_NOTAUTH, "non-authoritative zone", question_name, question_class);
+                               FAILQ(DNS_R_NOTAUTH, "non-authoritative zone",
+                                     question_name, question_class);
                        }
                CHECK(dns_zone_getdb(zone, &db));
                dns_db_currentversion(db, &ver);
@@ -997,7 +991,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) {
                        is_poll = ISC_TRUE;
                        goto have_stream;
                }
-               journalfile = dns_zone_getjournal(zone);
+               journalfile = is_dlz ? NULL : dns_zone_getjournal(zone);
                if (journalfile != NULL)
                        result = ixfr_rrstream_create(mctx,
                                                      journalfile,
index fd11048da65c6af495857272beca3d290292e274..dbdc7ea0e3dfae82eed9d697eb4b2adac9e84232 100644 (file)
@@ -40,5 +40,35 @@ n=`expr $n + 1`
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
+echo "I:checking DLZ IXFR=2010062899 (less than serial) ($n)"
+ret=0
+$DIG $DIGOPTS ixfr=2010062899 example.com @10.53.0.1 +all > dig.out.ns1.test$n 
+grep "example.com..*IN.IXFR" dig.out.ns1.test$n > /dev/null || ret=1
+grep "example.com..*10.IN.DNAME.example.net." dig.out.ns1.test$n > /dev/null || ret=1
+grep "example.com..*10.IN.NS.example.com." dig.out.ns1.test$n > /dev/null || ret=1
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+echo "I:checking DLZ IXFR=2010062900 (equal serial) ($n)"
+ret=0
+$DIG $DIGOPTS ixfr=2010062900 example.com @10.53.0.1 +all > dig.out.ns1.test$n
+grep "example.com..*IN.IXFR" dig.out.ns1.test$n > /dev/null || ret=1
+grep "example.com..*10.IN.DNAME.example.net." dig.out.ns1.test$n > /dev/null && ret=1
+grep "example.com..*10.IN.NS.example.com." dig.out.ns1.test$n > /dev/null && ret=1
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+echo "I:checking DLZ IXFR=2010062901 (greater than serial) ($n)"
+ret=0
+$DIG $DIGOPTS ixfr=2010062901 example.com @10.53.0.1 +all > dig.out.ns1.test$n
+grep "example.com..*IN.IXFR" dig.out.ns1.test$n > /dev/null || ret=1
+grep "example.com..*10.IN.DNAME.example.net." dig.out.ns1.test$n > /dev/null && ret=1
+grep "example.com..*10.IN.NS.example.com." dig.out.ns1.test$n > /dev/null && ret=1
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
 echo "I:exit status: $status"
 exit $status