]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Test NOTIMP being returned to an IXFR request in xfrin
authorMark Andrews <marka@isc.org>
Wed, 18 Oct 2023 07:13:52 +0000 (18:13 +1100)
committerMark Andrews <marka@isc.org>
Fri, 20 Oct 2023 07:16:25 +0000 (18:16 +1100)
The server is expected to retry the transfer using SOA and if
the returned serial is greater than the current serial AXFR.

Check the log that IXFR is request.

.reuse/dep5
bin/tests/system/ans.pl
bin/tests/system/xfer/ans5/ixfrnotimp [new file with mode: 0644]
bin/tests/system/xfer/tests.sh

index 38b1937635c795bce80daede1f32f04da6cf3fb9..4cf9906f81f498df87706bc293e593f6a83a37b9 100644 (file)
@@ -82,6 +82,7 @@ Files: **/*.after*
        bin/tests/system/xfer/ans5/badkeydata
        bin/tests/system/xfer/ans5/badmessageid
        bin/tests/system/xfer/ans5/goodaxfr
+       bin/tests/system/xfer/ans5/ixfrnotimp
        bin/tests/system/xfer/ans5/partial
        bin/tests/system/xfer/ans5/soamismatch
        bin/tests/system/xfer/ans5/unknownkey
index bbae89ef5704a0188a3ee8a865bbe23635b98bee..946d2ae01febc919631b65a2d7e9a5a53cdb5298 100644 (file)
 #  pattern, only this data will be signed. Currently, this is only
 #  done for TCP.
 #
+# /pattern NOTIMP <key> <key_data>/
+# /pattern NOTIMP/
+#
+# Return a NOTIMP response
+#
 # /pattern bad-id <key> <key_data>/
 # /pattern bad-id/
 #
@@ -376,13 +381,20 @@ sub handleTCP {
                if ("$qname $qtype" =~ /$dbtype/) {
                        $count_these++;
                        my $a;
+                       my $done = 0;
                        foreach $a (@{$r->{answer}}) {
                                $packet->push("answer", $a);
                        }
+                       if (defined($key_name) && $key_name eq "NOTIMP") {
+                               $packet->header->rcode('NOTIMP');
+                               $key_name = $key_data;
+                               ($key_data, $tname) = split(/ /,$tname);
+                               $done = 1;
+                       }
                        if (defined($key_name) && $key_name eq "bad-id") {
                                $packet->header->id(($id+50)%0xffff);
                                $key_name = $key_data;
-                               ($key_data, $tname) = split(/ /,$tname)
+                               ($key_data, $tname) = split(/ /,$tname);
                        }
                        if (defined($key_name) && defined($key_data)) {
                                my $tsig;
@@ -453,6 +465,7 @@ sub handleTCP {
                        }
                        #$packet->print;
                        push(@results,$packet->data);
+                       last if ($done);
                        if ($tname eq "") {
                                $tname = $qname;
                        }
diff --git a/bin/tests/system/xfer/ans5/ixfrnotimp b/bin/tests/system/xfer/ans5/ixfrnotimp
new file mode 100644 (file)
index 0000000..a947a63
--- /dev/null
@@ -0,0 +1,11 @@
+/SOA tsig_key LSAnCU+Z/
+nil.           300     SOA     ns.nil. root.nil. 2 300 300 604800 300
+/IXFR NOTIMP tsig_key LSAnCU+Z/
+/AXFR tsig_key LSAnCU+Z/
+nil.           300     SOA     ns.nil. root.nil. 2 300 300 604800 300
+/AXFR tsig_key LSAnCU+Z/
+nil.           300     NS      ns.nil.
+nil.           300     TXT     "IXFR NOTIMP"
+a.nil.         60      A       10.0.0.61
+/AXFR tsig_key LSAnCU+Z/
+nil.           300     SOA     ns.nil. root.nil. 2 300 300 604800 300
index 5acc1c5d23aba6897bb27b8cb3f1fd30ab36b12a..f6984fd4234c005089726b73f810be969979800b 100755 (executable)
@@ -307,6 +307,25 @@ $DIGCMD nil. TXT | grep 'initial AXFR' >/dev/null || {
     status=$((status+1))
 }
 
+n=$((n+1))
+echo_i "handle IXFR NOTIMP ($n)"
+
+sendcmd < ans5/ixfrnotimp
+
+$RNDCCMD 10.53.0.4 refresh nil | sed 's/^/ns4 /' | cat_i
+
+sleep 2
+
+nextpart ns4/named.run | grep "zone nil/IN: requesting IXFR from 10.53.0.5" > /dev/null || {
+    echo_i "failed: expected status was not logged"
+    status=$((status+1))
+}
+
+$DIGCMD nil. TXT | grep 'IXFR NOTIMP' >/dev/null || {
+    echo_i "failed"
+    status=$((status+1))
+}
+
 n=$((n+1))
 echo_i "unsigned transfer ($n)"