-3229. [bug] Fix local variable to struct var assignment
- found by CLANG warning.
+3231. [bug] named could fail to send a uncompressable zone.
+ [RT #26796]
+
+3230. [bug] 'dig axfr' failed to properly handle a multi-message
+ axfr with a serial of 0. [RT #26796]
+
+3229. [bug] Fix local variable to struct var assignment
+ found by CLANG warning.
3228. [tuning] Dynamically grow symbol table to improve zone
loading performance. [RT #26523]
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dighost.c,v 1.328.22.13 2011/11/30 00:53:34 marka Exp $ */
+/* $Id: dighost.c,v 1.328.22.14 2011/12/01 01:03:07 marka Exp $ */
/*! \file
* \note
#include <isc/print.h>
#include <isc/random.h>
#include <isc/result.h>
+#include <isc/serial.h>
#include <isc/string.h>
#include <isc/task.h>
#include <isc/timer.h>
looknew->xfr_q = NULL;
looknew->current_query = NULL;
looknew->doing_xfr = ISC_FALSE;
- looknew->ixfr_serial = ISC_FALSE;
+ looknew->ixfr_serial = 0;
looknew->trace = ISC_FALSE;
looknew->trace_root = ISC_FALSE;
looknew->identify = ISC_FALSE;
dns_rdataset_t *rdataset = NULL;
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdata_soa_t soa;
- isc_uint32_t serial;
+ isc_uint32_t ixfr_serial = query->lookup->ixfr_serial, serial;
isc_result_t result;
+ isc_boolean_t ixfr = query->lookup->rdtype == dns_rdatatype_ixfr;
+ isc_boolean_t axfr = query->lookup->rdtype == dns_rdatatype_axfr;
debug("check_for_more_data()");
query->second_rr_rcvd = ISC_TRUE;
query->second_rr_serial = 0;
debug("got the second rr as nonsoa");
+ axfr = ISC_TRUE;
goto next_rdata;
}
*/
if (rdata.type != dns_rdatatype_soa)
goto next_rdata;
+
/* Now we have an SOA. Work with it. */
debug("got an SOA");
result = dns_rdata_tostruct(&rdata, &soa, NULL);
if (!query->first_soa_rcvd) {
query->first_soa_rcvd = ISC_TRUE;
query->first_rr_serial = serial;
- debug("this is the first %d",
- query->lookup->ixfr_serial);
- if (query->lookup->ixfr_serial >=
- serial)
+ debug("this is the first serial %u",
+ serial);
+ if (ixfr && isc_serial_ge(ixfr_serial,
+ serial)) {
+ debug("got up to date "
+ "response");
goto doexit;
+ }
goto next_rdata;
}
- if (query->lookup->rdtype ==
- dns_rdatatype_axfr) {
+ if (axfr) {
debug("doing axfr, got second SOA");
goto doexit;
}
"empty zone");
goto doexit;
}
- debug("this is the second %d",
- query->lookup->ixfr_serial);
+ debug("this is the second serial %u",
+ serial);
query->second_rr_rcvd = ISC_TRUE;
query->second_rr_serial = serial;
goto next_rdata;
}
- if (query->second_rr_serial == 0) {
- /*
- * If the second RR was a non-SOA
- * record, and we're getting any
- * other SOA, then this is an
- * AXFR, and we're done.
- */
- debug("done, since axfr");
- goto doexit;
- }
/*
* If we get to this point, we're doing an
* IXFR and have to start really looking
debug("done with ixfr");
goto doexit;
}
- debug("meaningless soa %d", serial);
+ debug("meaningless soa %u", serial);
next_rdata:
result = dns_rdataset_next(rdataset);
} while (result == ISC_R_SUCCESS);
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: xfrout.c,v 1.136.132.4 2011/07/28 23:46:44 tbox Exp $ */
+/* $Id: xfrout.c,v 1.136.132.5 2011/12/01 01:03:07 marka Exp $ */
#include <config.h>
if (xfr->lasttsig != NULL)
isc_buffer_free(&xfr->lasttsig);
+ /*
+ * Account for reserved space.
+ */
+ if (xfr->tsigkey != NULL)
+ INSIST(msg->reserved != 0U);
+ isc_buffer_add(&xfr->buf, msg->reserved);
+
/*
* Include a question section in the first message only.
* BIND 8.2.1 will not recognize an IXFR if it does not
ISC_LIST_APPEND(qname->list, qrdataset, link);
dns_message_addname(msg, qname, DNS_SECTION_QUESTION);
- }
- else
+ } else {
+ /*
+ * Reserve space for the 12-byte message header
+ */
+ isc_buffer_add(&xfr->buf, 12);
msg->tcp_continuation = 1;
+ }
}
/*
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: clean.sh,v 1.14.476.2 2011/03/12 04:58:26 tbox Exp $
+# $Id: clean.sh,v 1.14.476.3 2011/12/01 01:03:07 marka Exp $
#
# Clean up after zone transfer tests.
rm -f dig.out.ns1 dig.out.ns2 dig.out.ns3
rm -f dig.out.ns5 dig.out.ns6 dig.out.ns7
+rm -f axfr.out
rm -f ns1/slave.db
rm -f ns2/example.db ns2/tsigzone.db ns2/example.db.jnl
rm -f ns3/example.bk ns3/tsigzone.bk ns3/example.bk.jnl
rm -f ns3/master.bk ns3/master.bk.jnl
-rm -f ns4/named.conf ns4/nil.db
+rm -f ns4/named.conf ns4/nil.db ns4/root.db
rm -f ns6/*.db ns6/*.bk ns6/*.jnl
rm -f ns7/*.db ns7/*.bk ns7/*.jnl
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: named.conf.base,v 1.2.4.2 2011/03/04 22:07:37 each Exp $ */
+/* $Id: named.conf.base,v 1.2.4.3 2011/12/01 01:03:07 marka Exp $ */
options {
query-source address 10.53.0.4;
controls {
inet 10.53.0.4 port 9953 allow { any; } keys { rndc_key; };
};
+
+zone "." {
+ type master;
+ file "root.db";
+};
--- /dev/null
+; Copyright
+@ 0 SOA . . 0 0 0 0 0
+@ 0 NS .
+@ 0 A 10.53.0.4
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: setup.sh,v 1.5.558.3 2011/03/11 00:50:42 marka Exp $
+# $Id: setup.sh,v 1.5.558.4 2011/12/01 01:03:07 marka Exp $
+
+SYSTEMTESTTOP=..
+. $SYSTEMTESTTOP/conf.sh
sh clean.sh
sh ../genzone.sh 7 >ns7/master2.db
rm -f ns4/*.db ns4/*.jnl
+cp -f ns4/root.db.in ns4/root.db
+$PERL -e 'for ($i=0;$i<10000;$i++){ printf("x%u 0 in a 10.53.0.1\n", $i);}' >> ns4/root.db
cp -f ns4/named.conf.base ns4/named.conf
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: tests.sh,v 1.31.558.3 2011/03/11 00:50:42 marka Exp $
+# $Id: tests.sh,v 1.31.558.4 2011/12/01 01:03:07 marka Exp $
SYSTEMTESTTOP=..
. $SYSTEMTESTTOP/conf.sh
if test $tmp != 0 ; then echo "I:failed"; fi
status=`expr $status + $tmp`
+echo "I:check that a multi-message uncompressable zone transfers"
+$DIG axfr . -p 5300 @10.53.0.4 | grep SOA > axfr.out
+if test `wc -l < axfr.out` != 2
+then
+ echo "I:failed"
+ status=`expr $status + 1`
+fi
+
# now we test transfers with assorted TSIG glitches
DIGCMD="$DIG $DIGOPTS @10.53.0.4 -p 5300"
SENDCMD="$PERL ../send.pl 10.53.0.5 5301"