diff --git a/CHANGES b/CHANGES index 9e843dc630..c7fbf7a647 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3283. [bug] Raw zones with with more than 512 records in a RRset + failed to load. [RT #27863] + 3282. [bug] Restrict the TTL of NS RRset to no more than that of the old NS RRset when replacing it. [RT #27792] diff --git a/bin/tests/system/masterformat/clean.sh b/bin/tests/system/masterformat/clean.sh index 5c2f13d939..b826048023 100755 --- a/bin/tests/system/masterformat/clean.sh +++ b/bin/tests/system/masterformat/clean.sh @@ -14,15 +14,18 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: clean.sh,v 1.10 2011/12/22 07:32:40 each Exp $ +# $Id: clean.sh,v 1.11 2012/02/13 23:46:23 marka Exp $ rm -f named-compilezone rm -f ns1/example.db.raw* rm -f ns1/example.db.compat rm -f ns1/example.db.serial.raw -rm -f ns2/example.db +rm -f ns1/large.db ns1/large.db.raw rm -f dig.out.* +rm -f dig.out rm -f */named.memstats +rm -f ns2/example.db rm -f ns2/transfer.db.* rm -f ns2/formerly-text.db rm -f ns2/db-* +rm -f ns2/large.bk diff --git a/bin/tests/system/masterformat/ns1/compile.sh b/bin/tests/system/masterformat/ns1/compile.sh index e778997b21..886ea5e577 100755 --- a/bin/tests/system/masterformat/ns1/compile.sh +++ b/bin/tests/system/masterformat/ns1/compile.sh @@ -12,7 +12,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: compile.sh,v 1.9 2011/12/22 07:32:40 each Exp $ +# $Id: compile.sh,v 1.10 2012/02/13 23:46:24 marka Exp $ ../named-compilezone -D -F raw -o example.db.raw example \ example.db > /dev/null 2>&1 @@ -22,3 +22,4 @@ example.db > /dev/null 2>&1 ../named-compilezone -D -F raw -L 3333 -o example.db.serial.raw example \ example.db > /dev/null 2>&1 +../named-compilezone -D -F raw -o large.db.raw large large.db > /dev/null 2>&1 diff --git a/bin/tests/system/masterformat/ns1/large.db.in b/bin/tests/system/masterformat/ns1/large.db.in new file mode 100644 index 0000000000..13cc81d2fb --- /dev/null +++ b/bin/tests/system/masterformat/ns1/large.db.in @@ -0,0 +1,27 @@ +; Copyright (C) 2005, 2007 Internet Systems Consortium, Inc. ("ISC") +; +; Permission to use, copy, modify, and/or distribute this software for any +; purpose with or without fee is hereby granted, provided that the above +; copyright notice and this permission notice appear in all copies. +; +; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +; PERFORMANCE OF THIS SOFTWARE. + +; $Id: large.db.in,v 1.2 2012/02/13 23:46:24 marka Exp $ + +$TTL 1D + +@ IN SOA ns hostmaster ( + 1 + 3600 + 1800 + 1814400 + 3 + ) + NS ns +ns A 10.53.0.1 diff --git a/bin/tests/system/masterformat/ns1/named.conf b/bin/tests/system/masterformat/ns1/named.conf index b16c7000ba..8471f8ce9e 100644 --- a/bin/tests/system/masterformat/ns1/named.conf +++ b/bin/tests/system/masterformat/ns1/named.conf @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named.conf,v 1.7 2011/12/08 16:07:20 each Exp $ */ +/* $Id: named.conf,v 1.8 2012/02/13 23:46:24 marka Exp $ */ // NS1 @@ -59,3 +59,10 @@ zone "transfer3" { file "example.db"; allow-transfer { any; }; }; + +zone "large" { + type master; + file "large.db.raw"; + masterfile-format raw; + allow-transfer { any; }; +}; diff --git a/bin/tests/system/masterformat/ns2/named.conf b/bin/tests/system/masterformat/ns2/named.conf index 6f2c0d2756..45c21e94b7 100644 --- a/bin/tests/system/masterformat/ns2/named.conf +++ b/bin/tests/system/masterformat/ns2/named.conf @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named.conf,v 1.6 2011/10/26 23:46:15 tbox Exp $ */ +/* $Id: named.conf,v 1.7 2012/02/13 23:46:24 marka Exp $ */ // NS2 @@ -53,3 +53,10 @@ zone "transfer3" { masters { 10.53.0.1; }; file "formerly-text.db"; }; + +zone "large" { + type slave; + masters { 10.53.0.1; }; + masterfile-format raw; + file "large.bk"; +}; diff --git a/bin/tests/system/masterformat/setup.sh b/bin/tests/system/masterformat/setup.sh index ba014a20b1..fce032bbbe 100755 --- a/bin/tests/system/masterformat/setup.sh +++ b/bin/tests/system/masterformat/setup.sh @@ -12,11 +12,17 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: setup.sh,v 1.9 2011/12/08 16:07:20 each Exp $ +# $Id: setup.sh,v 1.10 2012/02/13 23:46:23 marka Exp $ rm -f named-compilezone ln -s $CHECKZONE named-compilezone rm -f ns1/example.db.raw cp ns1/example.db ns2/ cp ns2/formerly-text.db.in ns2/formerly-text.db +cp ns1/large.db.in ns1/large.db +awk 'END { + for (i = 0; i < 512; i++ ) { print "a TXT", i; } + for (i = 0; i < 1024; i++ ) { print "b TXT", i; } + for (i = 0; i < 2000; i++ ) { print "c TXT", i; } +}' < /dev/null >> ns1/large.db cd ns1 && sh compile.sh diff --git a/bin/tests/system/masterformat/tests.sh b/bin/tests/system/masterformat/tests.sh index f3310c10dd..839ca578da 100755 --- a/bin/tests/system/masterformat/tests.sh +++ b/bin/tests/system/masterformat/tests.sh @@ -14,7 +14,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: tests.sh,v 1.12 2012/02/01 23:46:51 tbox Exp $ +# $Id: tests.sh,v 1.13 2012/02/13 23:46:23 marka Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh @@ -88,7 +88,7 @@ status=`expr $status + $ret` echo "I:waiting for transfers to complete" for i in 0 1 2 3 4 5 6 7 8 9 do - test -f ns2/transfer.db.raw -a -f ns2/transfer.db.txt && break + test -f ns2/transfer.db.raw -a -f ns2/transfer.db.txt && break sleep 1 done @@ -116,5 +116,15 @@ done [ $ret -eq 0 ] || echo "I:failed" status=`expr $status + $ret` +echo "I:checking that large rdatasets loaded" +ret=0 +for a in a b c +do + $DIG +tcp txt ${a}.large @10.53.0.2 -p 5300 > dig.out + grep "status: NOERROR" dig.out > /dev/null || ret=1 +done +[ $ret -eq 0 ] || echo "I:failed" +status=`expr $status + $ret` + echo "I:exit status: $status" exit $status diff --git a/lib/dns/master.c b/lib/dns/master.c index 7fd96a842d..0bf22f0430 100644 --- a/lib/dns/master.c +++ b/lib/dns/master.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: master.c,v 1.183 2012/01/31 23:47:32 tbox Exp $ */ +/* $Id: master.c,v 1.184 2012/02/13 23:46:24 marka Exp $ */ /*! \file */ @@ -2292,14 +2292,14 @@ load_raw(dns_loadctx_t *lctx) { if (rdcount > rdata_size) { dns_rdata_t *new_rdata = NULL; - new_rdata = grow_rdata(rdata_size + RDSZ, rdata, + new_rdata = grow_rdata(rdcount + RDSZ, rdata, rdata_size, &head, &dummy, mctx); if (new_rdata == NULL) { result = ISC_R_NOMEMORY; goto cleanup; } - rdata_size += RDSZ; + rdata_size = rdcount + RDSZ; rdata = new_rdata; } @@ -2756,6 +2756,7 @@ grow_rdatalist(int new_len, dns_rdatalist_t *old, int old_len, } while ((this = ISC_LIST_HEAD(save)) != NULL) { ISC_LIST_UNLINK(save, this, link); + INSIST(rdlcount < new_len); new[rdlcount] = *this; ISC_LIST_APPEND(*current, &new[rdlcount], link); rdlcount++; @@ -2768,6 +2769,7 @@ grow_rdatalist(int new_len, dns_rdatalist_t *old, int old_len, } while ((this = ISC_LIST_HEAD(save)) != NULL) { ISC_LIST_UNLINK(save, this, link); + INSIST(rdlcount < new_len); new[rdlcount] = *this; ISC_LIST_APPEND(*glue, &new[rdlcount], link); rdlcount++; @@ -2811,6 +2813,7 @@ grow_rdata(int new_len, dns_rdata_t *old, int old_len, } while ((rdata = ISC_LIST_HEAD(save)) != NULL) { ISC_LIST_UNLINK(save, rdata, link); + INSIST(rdcount < new_len); new[rdcount] = *rdata; ISC_LIST_APPEND(this->rdata, &new[rdcount], link); rdcount++; @@ -2830,13 +2833,14 @@ grow_rdata(int new_len, dns_rdata_t *old, int old_len, } while ((rdata = ISC_LIST_HEAD(save)) != NULL) { ISC_LIST_UNLINK(save, rdata, link); + INSIST(rdcount < new_len); new[rdcount] = *rdata; ISC_LIST_APPEND(this->rdata, &new[rdcount], link); rdcount++; } this = ISC_LIST_NEXT(this, link); } - INSIST(rdcount == old_len); + INSIST(rdcount == old_len || rdcount == 0); if (old != NULL) isc_mem_put(mctx, old, old_len * sizeof(*old)); return (new);