Module Name: src Committed By: bouyer Date: Tue Jun 5 19:53:03 UTC 2012
Modified Files: src/dist/bind [netbsd-5-1]: CHANGES version src/dist/bind/bin/tests/system/unknown [netbsd-5-1]: clean.sh tests.sh src/dist/bind/bin/tests/system/unknown/ns1 [netbsd-5-1]: example-in.db src/dist/bind/lib/dns [netbsd-5-1]: rdata.c rdataslab.c Log Message: Apply patch, requested by christos in ticket #1767 src/dist/bind/CHANGES patch src/dist/bind/version patch src/dist/bind/bin/tests/system/unknown/clean.sh patch src/dist/bind/bin/tests/system/unknown/tests.sh patch src/dist/bind/bin/tests/system/unknown/ns1/example-in.db patch src/dist/bind/lib/dns/rdata.c patch src/dist/bind/lib/dns/rdataslab.c patch Update bind to 9.7.3-P4: 3331. [security] dns_rdataslab_fromrdataset could produce bad rdataslabs. [RT #29644] To generate a diff of this commit: cvs rdiff -u -r1.1.1.11.4.2.2.3 -r1.1.1.11.4.2.2.4 src/dist/bind/CHANGES \ src/dist/bind/version cvs rdiff -u -r1.1.1.5.12.1 -r1.1.1.5.12.2 \ src/dist/bind/bin/tests/system/unknown/clean.sh \ src/dist/bind/bin/tests/system/unknown/tests.sh cvs rdiff -u -r1.1.1.5.12.1 -r1.1.1.5.12.2 \ src/dist/bind/bin/tests/system/unknown/ns1/example-in.db cvs rdiff -u -r1.1.1.5.4.1.2.2 -r1.1.1.5.4.1.2.3 \ src/dist/bind/lib/dns/rdata.c src/dist/bind/lib/dns/rdataslab.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/dist/bind/CHANGES diff -u src/dist/bind/CHANGES:1.1.1.11.4.2.2.3 src/dist/bind/CHANGES:1.1.1.11.4.2.2.4 --- src/dist/bind/CHANGES:1.1.1.11.4.2.2.3 Fri Jul 8 21:04:03 2011 +++ src/dist/bind/CHANGES Tue Jun 5 19:53:02 2012 @@ -1,3 +1,8 @@ + --- 9.7.3-P4 released --- + +3331. [security] dns_rdataslab_fromrdataset could produce bad + rdataslabs. [RT #29644] + --- 9.7.3-P3 released --- 3124. [bug] Use an rdataset attribute flag to indicate Index: src/dist/bind/version diff -u src/dist/bind/version:1.1.1.11.4.2.2.3 src/dist/bind/version:1.1.1.11.4.2.2.4 --- src/dist/bind/version:1.1.1.11.4.2.2.3 Fri Jul 8 21:04:03 2011 +++ src/dist/bind/version Tue Jun 5 19:53:02 2012 @@ -7,4 +7,4 @@ MAJORVER=9 MINORVER=7 PATCHVER=3 RELEASETYPE=-P -RELEASEVER=3 +RELEASEVER=4 Index: src/dist/bind/bin/tests/system/unknown/clean.sh diff -u src/dist/bind/bin/tests/system/unknown/clean.sh:1.1.1.5.12.1 src/dist/bind/bin/tests/system/unknown/clean.sh:1.1.1.5.12.2 --- src/dist/bind/bin/tests/system/unknown/clean.sh:1.1.1.5.12.1 Sat Jun 18 11:27:46 2011 +++ src/dist/bind/bin/tests/system/unknown/clean.sh Tue Jun 5 19:53:02 2012 @@ -19,3 +19,6 @@ rm -f dig.out rm -f */named.memstats +rm -f */*.bk +rm -f */*.bk.* +rm -f ns3/Kexample.* Index: src/dist/bind/bin/tests/system/unknown/tests.sh diff -u src/dist/bind/bin/tests/system/unknown/tests.sh:1.1.1.5.12.1 src/dist/bind/bin/tests/system/unknown/tests.sh:1.1.1.5.12.2 --- src/dist/bind/bin/tests/system/unknown/tests.sh:1.1.1.5.12.1 Sat Jun 18 11:27:46 2011 +++ src/dist/bind/bin/tests/system/unknown/tests.sh Tue Jun 5 19:53:02 2012 @@ -22,13 +22,13 @@ SYSTEMTESTTOP=.. status=0 -DIGOPTS="@10.53.0.1 -p 5300" +DIGOPTS="-p 5300" echo "I:querying for various representations of an IN A record" for i in 1 2 3 4 5 6 7 8 9 10 11 12 do ret=0 - $DIG +short $DIGOPTS a$i.example a in > dig.out || ret=1 + $DIG +short $DIGOPTS @10.53.0.1 a$i.example a in > dig.out || ret=1 echo 10.0.0.1 | diff - dig.out || ret=1 if [ $ret != 0 ] then @@ -41,7 +41,7 @@ echo "I:querying for various representat for i in 1 2 3 4 5 6 7 do ret=0 - $DIG +short $DIGOPTS txt$i.example txt in > dig.out || ret=1 + $DIG +short $DIGOPTS @10.53.0.1 txt$i.example txt in > dig.out || ret=1 echo '"hello"' | diff - dig.out || ret=1 if [ $ret != 0 ] then @@ -54,7 +54,7 @@ echo "I:querying for various representat for i in 1 2 3 do ret=0 - $DIG +short $DIGOPTS unk$i.example type123 in > dig.out || ret=1 + $DIG +short $DIGOPTS @10.53.0.1 unk$i.example type123 in > dig.out || ret=1 echo '\# 1 00' | diff - dig.out || ret=1 if [ $ret != 0 ] then @@ -67,7 +67,7 @@ echo "I:querying for various representat for i in 1 2 do ret=0 - $DIG +short $DIGOPTS a$i.example a class10 > dig.out || ret=1 + $DIG +short $DIGOPTS @10.53.0.1 a$i.example a class10 > dig.out || ret=1 echo '\# 4 0A000001' | diff - dig.out || ret=1 if [ $ret != 0 ] then @@ -80,7 +80,7 @@ echo "I:querying for various representat for i in 1 2 3 4 do ret=0 - $DIG +short $DIGOPTS txt$i.example txt class10 > dig.out || ret=1 + $DIG +short $DIGOPTS @10.53.0.1 txt$i.example txt class10 > dig.out || ret=1 echo '"hello"' | diff - dig.out || ret=1 if [ $ret != 0 ] then @@ -93,7 +93,7 @@ echo "I:querying for various representat for i in 1 2 do ret=0 - $DIG +short $DIGOPTS unk$i.example type123 class10 > dig.out || ret=1 + $DIG +short $DIGOPTS @10.53.0.1 unk$i.example type123 class10 > dig.out || ret=1 echo '\# 1 00' | diff - dig.out || ret=1 if [ $ret != 0 ] then @@ -102,11 +102,25 @@ do status=`expr $status + $ret` done +echo "I:querying for NULL record" +ret=0 +$DIG +short $DIGOPTS @10.53.0.1 null.example null in > dig.out || ret=1 +echo '\# 1 00' | diff - dig.out || ret=1 +[ $ret = 0 ] || echo "I: failed" +status=`expr $status + $ret` + +echo "I:querying for empty NULL record" +ret=0 +$DIG +short $DIGOPTS @10.53.0.1 empty.example null in > dig.out || ret=1 +echo '\# 0' | diff - dig.out || ret=1 +[ $ret = 0 ] || echo "I: failed" +status=`expr $status + $ret` + echo "I:querying for SOAs of zone that should have failed to load" for i in 1 2 3 4 do ret=0 - $DIG $DIGOPTS broken$i. soa in > dig.out || ret=1 + $DIG $DIGOPTS @10.53.0.1 broken$i. soa in > dig.out || ret=1 grep "SERVFAIL" dig.out > /dev/null || ret=1 if [ $ret != 0 ] then @@ -115,5 +129,30 @@ do status=`expr $status + $ret` done +echo "I:checking large unknown record loading on master" +ret=0 +$DIG $DIGOPTS @10.53.0.1 +tcp +short large.example TYPE45234 > dig.out || { ret=1 ; echo I: dig failed ; } +diff -s large.out dig.out > /dev/null || { ret=1 ; echo "I: diff failed"; } +[ $ret = 0 ] || echo "I: failed" +status=`expr $status + $ret` + +echo "I:checking large unknown record loading on slave" +ret=0 +$DIG $DIGOPTS @10.53.0.2 +tcp +short large.example TYPE45234 > dig.out || { ret=1 ; echo I: dig failed ; } +diff -s large.out dig.out > /dev/null || { ret=1 ; echo "I: diff failed"; } +[ $ret = 0 ] || echo "I: failed" +status=`expr $status + $ret` + +echo "I:stop and restart slave" +$PERL $SYSTEMTESTTOP/stop.pl . ns2 +$PERL $SYSTEMTESTTOP/start.pl --noclean --restart . ns2 + +echo "I:checking large unknown record loading on slave" +ret=0 +$DIG $DIGOPTS @10.53.0.2 +tcp +short large.example TYPE45234 > dig.out || { ret=1 ; echo I: dig failed ; } +diff -s large.out dig.out > /dev/null || { ret=1 ; echo "I: diff failed"; } +[ $ret = 0 ] || echo "I: failed" +status=`expr $status + $ret` + echo "I:exit status: $status" exit $status Index: src/dist/bind/bin/tests/system/unknown/ns1/example-in.db diff -u src/dist/bind/bin/tests/system/unknown/ns1/example-in.db:1.1.1.5.12.1 src/dist/bind/bin/tests/system/unknown/ns1/example-in.db:1.1.1.5.12.2 --- src/dist/bind/bin/tests/system/unknown/ns1/example-in.db:1.1.1.5.12.1 Sat Jun 18 11:27:47 2011 +++ src/dist/bind/bin/tests/system/unknown/ns1/example-in.db Tue Jun 5 19:53:02 2012 @@ -39,6 +39,13 @@ a10 IN TYPE1 \# 4 0A000001 a11 IN TYPE1 \# 4 0a000001 a12 IN A \# 4 0A000001 +null IN NULL \# 1 00 +empty IN NULL \# 0 +empty IN TYPE124 \# 0 + +emptyplus IN TYPE125 \# 0 +emptyplus IN TYPE125 \# 1 11 + txt1 IN TXT "hello" txt2 CLASS1 TXT "hello" txt3 IN TYPE16 "hello" @@ -50,3 +57,4 @@ txt7 IN TXT \# 6 0568656C6C6F unk1 TYPE123 \# 1 00 unk2 CLASS1 TYPE123 \# 1 00 unk3 IN TYPE123 \# 1 00 +$INCLUDE large.db Index: src/dist/bind/lib/dns/rdata.c diff -u src/dist/bind/lib/dns/rdata.c:1.1.1.5.4.1.2.2 src/dist/bind/lib/dns/rdata.c:1.1.1.5.4.1.2.3 --- src/dist/bind/lib/dns/rdata.c:1.1.1.5.4.1.2.2 Sat Jun 18 11:28:27 2011 +++ src/dist/bind/lib/dns/rdata.c Tue Jun 5 19:53:03 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: rdata.c,v 1.1.1.5.4.1.2.2 2011/06/18 11:28:27 bouyer Exp $ */ +/* $NetBSD: rdata.c,v 1.1.1.5.4.1.2.3 2012/06/05 19:53:03 bouyer Exp $ */ /* * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC") @@ -327,8 +327,8 @@ dns_rdata_compare(const dns_rdata_t *rda REQUIRE(rdata1 != NULL); REQUIRE(rdata2 != NULL); - REQUIRE(rdata1->data != NULL); - REQUIRE(rdata2->data != NULL); + REQUIRE(rdata1->length == 0 || rdata1->data != NULL); + REQUIRE(rdata2->length == 0 || rdata2->data != NULL); REQUIRE(DNS_RDATA_VALIDFLAGS(rdata1)); REQUIRE(DNS_RDATA_VALIDFLAGS(rdata2)); @@ -358,8 +358,8 @@ dns_rdata_casecompare(const dns_rdata_t REQUIRE(rdata1 != NULL); REQUIRE(rdata2 != NULL); - REQUIRE(rdata1->data != NULL); - REQUIRE(rdata2->data != NULL); + REQUIRE(rdata1->length == 0 || rdata1->data != NULL); + REQUIRE(rdata2->length == 0 || rdata2->data != NULL); REQUIRE(DNS_RDATA_VALIDFLAGS(rdata1)); REQUIRE(DNS_RDATA_VALIDFLAGS(rdata2)); Index: src/dist/bind/lib/dns/rdataslab.c diff -u src/dist/bind/lib/dns/rdataslab.c:1.1.1.5.4.1.2.2 src/dist/bind/lib/dns/rdataslab.c:1.1.1.5.4.1.2.3 --- src/dist/bind/lib/dns/rdataslab.c:1.1.1.5.4.1.2.2 Sat Jun 18 11:28:28 2011 +++ src/dist/bind/lib/dns/rdataslab.c Tue Jun 5 19:53:03 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: rdataslab.c,v 1.1.1.5.4.1.2.2 2011/06/18 11:28:28 bouyer Exp $ */ +/* $NetBSD: rdataslab.c,v 1.1.1.5.4.1.2.3 2012/06/05 19:53:03 bouyer Exp $ */ /* * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") @@ -127,6 +127,11 @@ isc_result_t dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region, unsigned int reservelen) { + /* + * Use &removed as a sentinal pointer for duplicate + * rdata as rdata.data == NULL is valid. + */ + static unsigned char removed; struct xrdata *x; unsigned char *rawbuf; #if DNS_RDATASET_FIXED @@ -166,6 +171,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_ INSIST(result == ISC_R_SUCCESS); dns_rdata_init(&x[i].rdata); dns_rdataset_current(rdataset, &x[i].rdata); + INSIST(x[i].rdata.data != &removed); #if DNS_RDATASET_FIXED x[i].order = i; #endif @@ -198,8 +204,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_ */ for (i = 1; i < nalloc; i++) { if (compare_rdata(&x[i-1].rdata, &x[i].rdata) == 0) { - x[i-1].rdata.data = NULL; - x[i-1].rdata.length = 0; + x[i-1].rdata.data = &removed; #if DNS_RDATASET_FIXED /* * Preserve the least order so A, B, A -> A, B @@ -286,7 +291,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_ #endif for (i = 0; i < nalloc; i++) { - if (x[i].rdata.data == NULL) + if (x[i].rdata.data == &removed) continue; #if DNS_RDATASET_FIXED offsettable[x[i].order] = rawbuf - offsetbase;