]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
move provide-ixfr testing after the serial has been checked
authorMark Andrews <marka@isc.org>
Mon, 30 Mar 2020 03:21:48 +0000 (14:21 +1100)
committerMark Andrews <marka@isc.org>
Sun, 17 May 2020 23:40:13 +0000 (09:40 +1000)
(cherry picked from commit c7cdc47cc5ff64bef5a6ed53824206d524ea78ec)
(cherry picked from commit 89c1bc58e43a5a3096687cfbc086f0b2a0a307bc)

bin/named/xfrout.c
bin/tests/system/ixfr/ns3/mytest2.db
bin/tests/system/ixfr/tests.sh

index ce659f5b701c325b271e24ee8e89d0ccdb427b32..ab662be9699026c267707cb22fee11e74664a109 100644 (file)
@@ -961,26 +961,8 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) {
 
        current_serial = dns_soa_getserial(&current_soa_tuple->rdata);
        if (reqtype == dns_rdatatype_ixfr) {
-               /*
-                * Outgoing IXFR may have been disabled for this peer
-                * or globally.
-                */
-               if ((client->attributes & NS_CLIENTATTR_TCP) != 0) {
-                       bool provide_ixfr;
-
-                       provide_ixfr = client->view->provideixfr;
-                       if (peer != NULL) {
-                               (void) dns_peer_getprovideixfr(peer,
-                                                              &provide_ixfr);
-                       }
-                       if (provide_ixfr == false) {
-                               goto axfr_fallback;
-                       }
-               }
-
-               if (! have_soa) {
-                       FAILC(DNS_R_FORMERR,
-                             "IXFR request missing SOA");
+               if (!have_soa) {
+                       FAILC(DNS_R_FORMERR, "IXFR request missing SOA");
                }
 
                begin_serial = dns_soa_getserial(&soa_rdata);
@@ -1003,6 +985,29 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) {
                        is_poll = true;
                        goto have_stream;
                }
+
+               /*
+                * Outgoing IXFR may have been disabled for this peer
+                * or globally.
+                */
+               if ((client->attributes & NS_CLIENTATTR_TCP) != 0) {
+                       bool provide_ixfr;
+
+                       provide_ixfr = client->view->provideixfr;
+                       if (peer != NULL) {
+                               (void)dns_peer_getprovideixfr(peer,
+                                                             &provide_ixfr);
+                       }
+                       if (!provide_ixfr) {
+                               xfrout_log1(client, question_name,
+                                           question_class, ISC_LOG_DEBUG(4),
+                                           "IXFR delta response disabled due "
+                                           "to 'provide-ixfr no;' being set");
+                               mnemonic = "AXFR-style IXFR";
+                               goto axfr_fallback;
+                       }
+               }
+
                journalfile = is_dlz ? NULL : dns_zone_getjournal(zone);
                if (journalfile != NULL) {
                        result = ixfr_rrstream_create(mctx,
index 080f3358b10c3369b50463efcd64cf568eabe4fb..6ea7cf94660742c64d724f4e53afdd0e995ed4d0 100644 (file)
@@ -10,7 +10,7 @@
 $ORIGIN test.
 $TTL    15
 test.  15  IN        SOA ns1.test.  hostmaster.test. (
-                              4 ; serial
+                              3 ; serial
                               3H ; refresh
                               15 ; retry
                               1w ; expire
index f8387fb9421d09967997116425fc5efa9f8bac2a..a62404276120abdbd20e4728cb9ba0d92df5ec0e 100644 (file)
@@ -67,7 +67,7 @@ done
 
 $DIG $DIGOPTS @10.53.0.1 nil. TXT | grep 'initial AXFR' >/dev/null || {
     echo_i "failed"
-    status=1
+    status=`expr $status + 1`
 }
 
 n=`expr $n + 1`
@@ -100,7 +100,7 @@ sleep 2
 
 $DIG $DIGOPTS @10.53.0.1 nil. TXT | grep 'successful IXFR' >/dev/null || {
     echo_i "failed"
-    status=1
+    status=`expr $status + 1`
 }
 
 n=`expr $n + 1`
@@ -135,7 +135,7 @@ sleep 2
 
 $DIG $DIGOPTS @10.53.0.1 nil. TXT | grep 'fallback AXFR' >/dev/null || {
     echo_i "failed"
-    status=1
+    status=`expr $status + 1`
 }
 
 n=`expr $n + 1`
@@ -196,7 +196,7 @@ done
 if [ $INCR -ne 1 ]
 then
     echo_i "failed to get incremental response"
-    status=1
+    status=`expr $status + 1`
 fi
 
 n=`expr $n + 1`
@@ -243,7 +243,7 @@ then
     echo_ic "failed to get nonincremental response in 2nd AXFR test"
 
     echo_i "failed"
-    status=1
+    status=`expr $status + 1`
 else
     echo_ic "success: AXFR it was"
 fi
@@ -284,7 +284,7 @@ then
     echo_ic "failed to get incremental response in 2nd IXFR test"
 
     echo_i "failed"
-    status=1
+    status=`expr $status + 1`
 else
     echo_ic "success: IXFR it was"
 fi
@@ -298,9 +298,9 @@ $DIG -p ${PORT} ixfr=0 large @10.53.0.3 > dig.out.test$n
 kill $sub
 )
 lines=`grep hostmaster.large dig.out.test$n | wc -l`
-test ${lines:-0} -eq 2 || { echo_i "failed"; status=1; }
+test ${lines:-0} -eq 2 || { echo_i "failed"; status=`expr $status + 1`; }
 messages=`sed -n 's/^;;.*messages \([0-9]*\),.*/\1/p' dig.out.test$n`
-test ${messages:-0} -gt 1 || { echo_i "failed"; status=1; }
+test ${messages:-0} -gt 1 || { echo_i "failed"; status=`expr $status + 1`; }
 
 n=`expr $n + 1`
 echo_i "test 'dig +notcp ixfr=<value>' vs 'dig ixfr=<value> +notcp' vs 'dig ixfr=<value>' ($n)"
@@ -310,13 +310,13 @@ $DIG $DIGOPTS +notcp ixfr=1 test @10.53.0.4 > dig.out1.test$n || ret=1
 $DIG $DIGOPTS ixfr=1 +notcp test @10.53.0.4 > dig.out2.test$n || ret=1
 digcomp dig.out1.test$n dig.out2.test$n || ret=1
 awk '$4 == "SOA" { soacnt++} END {if (soacnt == 1) exit(0); else exit(1);}' dig.out1.test$n || ret=1
-awk '$4 == "SOA" { if ($7 == 4) exit(0); else exit(1);}' dig.out1.test$n || ret=1
+awk '$4 == "SOA" { if ($7 == 3) exit(0); else exit(1);}' dig.out1.test$n || ret=1
 # Should be incremental transfer.
 $DIG $DIGOPTS ixfr=1 test @10.53.0.4 > dig.out3.test$n || ret=1
 awk '$4 == "SOA" { soacnt++} END { if (soacnt == 6) exit(0); else exit(1);}' dig.out3.test$n || ret=1
 if [ ${ret} != 0 ]; then
        echo_i "failed"
-       status=1
+       status=`expr $status + 1`
 fi
 
 # wait for slave to transfer zone
@@ -333,18 +333,43 @@ do
 done
 
 n=`expr $n + 1`
-echo_i "test 'provide-ixfr no;' ($n)"
+echo_i "test 'provide-ixfr no;' (serial < current) ($n)"
 ret=0
+nextpart ns5/named.run > /dev/null
 # Should be "AXFR style" response
 $DIG $DIGOPTS ixfr=1 test @10.53.0.5 > dig.out1.test$n || ret=1
 # Should be "switch to TCP" response
 $DIG $DIGOPTS ixfr=1 +notcp test @10.53.0.5 > dig.out2.test$n || ret=1
 awk '$4 == "SOA" { soacnt++} END {if (soacnt == 2) exit(0); else exit(1);}' dig.out1.test$n || ret=1
 awk '$4 == "SOA" { soacnt++} END {if (soacnt == 1) exit(0); else exit(1);}' dig.out2.test$n || ret=1
-if [ ${ret} != 0 ]; then
-       echo_i "failed"
-       status=1
-fi
+msg="IXFR delta response disabled due to 'provide-ixfr no;' being set"
+nextpart ns5/named.run | grep "$msg" > /dev/null || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo_i "test 'provide-ixfr no;' (serial = current) ($n)"
+ret=0
+# Should be "AXFR style" response
+$DIG $DIGOPTS ixfr=3 test @10.53.0.5 > dig.out1.test$n || ret=1
+# Should be "switch to TCP" response
+$DIG $DIGOPTS ixfr=3 +notcp test @10.53.0.5 > dig.out2.test$n || ret=1
+awk '$4 == "SOA" { soacnt++} END {if (soacnt == 1) exit(0); else exit(1);}' dig.out1.test$n || ret=1
+awk '$4 == "SOA" { soacnt++} END {if (soacnt == 1) exit(0); else exit(1);}' dig.out2.test$n || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo_i "test 'provide-ixfr no;' (serial > current) ($n)"
+ret=0
+# Should be "AXFR style" response
+$DIG $DIGOPTS ixfr=4 test @10.53.0.5 > dig.out1.test$n || ret=1
+# Should be "switch to TCP" response
+$DIG $DIGOPTS ixfr=4 +notcp test @10.53.0.5 > dig.out2.test$n || ret=1
+awk '$4 == "SOA" { soacnt++} END {if (soacnt == 1) exit(0); else exit(1);}' dig.out1.test$n || ret=1
+awk '$4 == "SOA" { soacnt++} END {if (soacnt == 1) exit(0); else exit(1);}' dig.out2.test$n || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
 
 echo_i "exit status: $status"
 [ $status -eq 0 ] || exit 1