diff --git a/CHANGES b/CHANGES index 29cceb65bc..8ebdc36345 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3696. [bug] dig failed to handle AXFR style IXFR responses which + span multiple messages. [RT #35137] + 3695. [bug] Address a possible race in dispatch.c. [RT #35107] 3694. [bug] Warn when a key-directory is configured for a zone, diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 6878902f5e..425fad4f47 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -2330,6 +2330,7 @@ setup_lookup(dig_lookup_t *lookup) { query->rr_count = 0; query->msg_count = 0; query->byte_count = 0; + query->ixfr_axfr = ISC_FALSE; ISC_LIST_INIT(query->recvlist); ISC_LIST_INIT(query->lengthlist); query->sock = NULL; @@ -2982,6 +2983,9 @@ check_for_more_data(dig_query_t *query, dns_message_t *msg, isc_boolean_t ixfr = query->lookup->rdtype == dns_rdatatype_ixfr; isc_boolean_t axfr = query->lookup->rdtype == dns_rdatatype_axfr; + if (ixfr) + axfr = query->ixfr_axfr; + debug("check_for_more_data()"); /* @@ -3030,7 +3034,7 @@ check_for_more_data(dig_query_t *query, dns_message_t *msg, query->second_rr_rcvd = ISC_TRUE; query->second_rr_serial = 0; debug("got the second rr as nonsoa"); - axfr = ISC_TRUE; + axfr = query->ixfr_axfr = ISC_TRUE; goto next_rdata; } diff --git a/bin/dig/include/dig/dig.h b/bin/dig/include/dig/dig.h index 0046639146..bab18828bd 100644 --- a/bin/dig/include/dig/dig.h +++ b/bin/dig/include/dig/dig.h @@ -202,6 +202,7 @@ struct dig_query { isc_uint32_t second_rr_serial; isc_uint32_t msg_count; isc_uint32_t rr_count; + isc_boolean_t ixfr_axfr; char *servname; char *userarg; isc_bufferlist_t sendlist, diff --git a/bin/tests/system/ixfr/clean.sh b/bin/tests/system/ixfr/clean.sh index a714584546..3268b07aa8 100644 --- a/bin/tests/system/ixfr/clean.sh +++ b/bin/tests/system/ixfr/clean.sh @@ -22,3 +22,4 @@ rm -f ns3/*.jnl ns3/mytest.db ns3/subtest.db rm -f ns4/*.jnl ns4/*.db rm -f */named.memstats rm -f dig.out +rm -f ns3/large.db diff --git a/bin/tests/system/ixfr/ns3/named.conf b/bin/tests/system/ixfr/ns3/named.conf index 9593970229..d49ee345ee 100644 --- a/bin/tests/system/ixfr/ns3/named.conf +++ b/bin/tests/system/ixfr/ns3/named.conf @@ -50,4 +50,8 @@ view "primary" { file "subtest.db"; request-ixfr no; }; + zone "large" IN { + type master; + file "large.db"; + }; }; diff --git a/bin/tests/system/ixfr/setup.sh b/bin/tests/system/ixfr/setup.sh index fb00b18334..9826df0898 100644 --- a/bin/tests/system/ixfr/setup.sh +++ b/bin/tests/system/ixfr/setup.sh @@ -45,3 +45,5 @@ EOF # Setup initial db files for ns3 cp ns3/mytest0.db ns3/mytest.db cp ns3/subtest0.db ns3/subtest.db +sh ../genzone.sh 3 > ns3/large.db +awk 'END { for (i = 0; i < 10000; i++) printf("record%d 10 IN TXT this is record %d\n", i, i) }' < /dev/null >> ns3/large.db diff --git a/bin/tests/system/ixfr/tests.sh b/bin/tests/system/ixfr/tests.sh index 46ffe1ef5e..1a885322a8 100644 --- a/bin/tests/system/ixfr/tests.sh +++ b/bin/tests/system/ixfr/tests.sh @@ -237,6 +237,17 @@ else echo "I: success: IXFR it was" fi +echo "I:testing DiG's handling of a multi message AXFR style IXFR response" +( +(sleep 10 && kill $$) 2>/dev/null & +sub=$! +$DIG ixfr=0 large -p 5300 @10.53.0.3 > dig.out +kill $sub +) +lines=`grep hostmaster.large dig.out | wc -l` +test ${lines:-0} -eq 2 || { echo "I:failed"; status=1; } +messages=`sed -n 's/^;;.*messages \([0-9]*\),.*/\1/p' dig.out` +test ${messages:-0} -gt 1 || { echo "I:failed"; status=1; } echo "I:exit status: $status" exit $status