]> 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:47:49 +0000 (15:47 +1000)
(cherry picked from commit 9a785712f1eaccba2b43d29a76f4c02ef2c391d0)

CHANGES
bin/named/xfrout.c
bin/tests/system/dlz/tests.sh

diff --git a/CHANGES b/CHANGES
index 589d1e3cb2213248d893124f98cfbe2877311982..73120a632da83b45a33662d9c08451eca957a41f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+3558.  [bug]           IXFR of a DLZ stored zone was broken. [RT #33331]
+
 3556.  [maint]         Added AAAA for D.ROOT-SERVERS.NET.
 
 3555.  [bug]           Address theoretical race conditions in acache.c
index 6cda6589e1c9217aa856238666c325ac42e3816e..06e8ab9010e8d80ae42fc5fb6126345eaefebc15 100644 (file)
@@ -833,14 +833,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
@@ -852,12 +844,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);
@@ -992,7 +986,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 85df19fdd56515afb1441f39997d490fd77a1b7a..9eb1d38e17121c632c95af034f81d86bc86059bd 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