]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Check that bad message id's are caught by named
authorMark Andrews <marka@isc.org>
Thu, 19 Mar 2020 01:26:37 +0000 (12:26 +1100)
committerMark Andrews <marka@isc.org>
Mon, 20 Apr 2020 08:24:12 +0000 (18:24 +1000)
bin/tests/system/ans.pl
bin/tests/system/xfer/ans5/badmessageid [new file with mode: 0644]
bin/tests/system/xfer/clean.sh
bin/tests/system/xfer/tests.sh
util/copyrights

index d7f9f63cfac444ec6ed5ac48044bcefa118f715a..9d77eb45755587573ff0083472ee22de63656e9e 100644 (file)
 #  Note that this data will still be sent with any request for
 #  pattern, only this data will be signed. Currently, this is only
 #  done for TCP.
+#
+# /pattern bad-id <key> <key_data>/
+# /pattern bad-id/
+#
+# will add 50 to the message id of the response.
 
 
 use IO::File;
@@ -361,7 +366,7 @@ sub handleTCP {
        my $r;
        foreach $r (@rules) {
                my $pattern = $r->{pattern};
-               my($dbtype, $key_name, $key_data) = split(/ /,$pattern);
+               my($dbtype, $key_name, $key_data, $extra) = split(/ /,$pattern);
                print "[handleTCP] $dbtype, $key_name, $key_data \n";
                if ("$qname $qtype" =~ /$dbtype/) {
                        $count_these++;
@@ -369,6 +374,11 @@ sub handleTCP {
                        foreach $a (@{$r->{answer}}) {
                                $packet->push("answer", $a);
                        }
+                       if(defined($key_name) && $key_name eq "bad-id") {
+                               $packet->header->id(($id+50)%0xffff);
+                               $key_name = $key_data;
+                               $key_data = $extra;
+                       }
                        if (defined($key_name) && defined($key_data)) {
                                my $tsig;
                                # sign the packet
diff --git a/bin/tests/system/xfer/ans5/badmessageid b/bin/tests/system/xfer/ans5/badmessageid
new file mode 100644 (file)
index 0000000..e0dc041
--- /dev/null
@@ -0,0 +1,10 @@
+/SOA tsig_key LSAnCU+Z/
+nil.           300     SOA     ns.nil. root.nil. 1 300 300 604800 300
+/AXFR tsig_key LSAnCU+Z/
+nil.           300     SOA     ns.nil. root.nil. 1 300 300 604800 300
+/AXFR bad-id tsig_key LSAnCU+Z/
+nil.           300     NS      ns.nil.
+nil.           300     TXT     "bad message id"
+a.nil.         60      A       10.0.0.61
+/AXFR bad-id tsig_key LSAnCU+Z/
+nil.           300     SOA     ns.nil. root.nil. 1 300 300 604800 300
index e1729222539cdd02f73a5f9137d23998393a1339..f6de806024be619f723a05b62036de65c790213f 100644 (file)
 # Clean up after zone transfer tests.
 #
 
-rm -f dig.out.*
+rm -f */ans.run
+rm -f */named.conf
+rm -f */named.memstats
+rm -f */named.run
+rm -f */named.run.prev
 rm -f axfr.out
-rm -f stats.*
-rm -f ns1/slave.db ns2/slave.db
+rm -f dig.out.*
+rm -f ns*/managed-keys.bind*
+rm -f ns*/named.lock
 rm -f ns1/edns-expire.db
+rm -f ns1/ixfr-too-big.db ns1/ixfr-too-big.db.jnl
+rm -f ns1/slave.db ns2/slave.db
 rm -f ns2/example.db ns2/tsigzone.db ns2/example.db.jnl
+rm -f ns2/mapped.db
 rm -f ns3/example.bk ns3/xfer-stats.bk ns3/tsigzone.bk ns3/example.bk.jnl
+rm -f ns3/mapped.bk
 rm -f ns3/master.bk ns3/master.bk.jnl
 rm -f ns4/*.db ns4/*.jnl
 rm -f ns6/*.db ns6/*.bk ns6/*.jnl
 rm -f ns7/*.db ns7/*.bk ns7/*.jnl
 rm -f ns8/large.db ns8/small.db
-rm -f */named.conf
-rm -f */named.run
-rm -f */named.memstats
-rm -f */named.run
-rm -f */ans.run
-rm -f ns*/named.lock
-rm -f ns2/mapped.db
-rm -f ns3/mapped.bk
-rm -f ns1/ixfr-too-big.db ns1/ixfr-too-big.db.jnl
-rm -f ns*/managed-keys.bind*
+rm -f stats.*
index d0aaca6256d3a7093bccbc5a340928dcbcfca12b..c88de9e679e2c8e5722fb5faa8213ce363d26222 100755 (executable)
@@ -384,6 +384,28 @@ $DIGCMD nil. TXT | grep 'incorrect key AXFR' >/dev/null && {
     status=$((status+1))
 }
 
+n=$((n+1))
+echo_i "bad message id ($n)"
+
+$SENDCMD < ans5/badmessageid
+
+# Uncomment to see AXFR stream with mismatching IDs.
+# $DIG $DIGOPTS @10.53.0.5 -y tsig_key:LSAnCU+Z nil. AXFR +all
+
+$RNDCCMD 10.53.0.4 retransfer nil | sed 's/^/ns4 /' | cat_i
+
+sleep 2
+
+nextpart ns4/named.run | grep "unexpected message id" > /dev/null || {
+    echo_i "failed: expected status was not logged"
+    status=$((status+1))
+}
+
+$DIGCMD nil. TXT | grep 'bad message id' >/dev/null && {
+    echo_i "failed"
+    status=$((status+1))
+}
+
 n=$((n+1))
 echo_i "check that we ask for and get a EDNS EXPIRE response ($n)"
 # force a refresh query
index d176a9c783d06d6b17f4193459c579eb20ef4957..1297eb8bd3b765f3ed74211e9dfc3ed1c5ed67f1 100644 (file)
 ./bin/tests/system/win32/pipequeries.vcxproj.in        X       2016,2017,2018,2019,2020
 ./bin/tests/system/win32/pipequeries.vcxproj.user      X       2016,2018,2019,2020
 ./bin/tests/system/xfer/ans5/badkeydata                X       2011,2018,2019,2020
+./bin/tests/system/xfer/ans5/badmessageid      X       2020
 ./bin/tests/system/xfer/ans5/goodaxfr          X       2011,2018,2019,2020
 ./bin/tests/system/xfer/ans5/partial           X       2011,2018,2019,2020
 ./bin/tests/system/xfer/ans5/unknownkey                X       2011,2018,2019,2020