]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3231. [bug] named could fail to send a uncompressable zone.
authorMark Andrews <marka@isc.org>
Thu, 1 Dec 2011 01:03:08 +0000 (01:03 +0000)
committerMark Andrews <marka@isc.org>
Thu, 1 Dec 2011 01:03:08 +0000 (01:03 +0000)
                        [RT #26796]

3230.   [bug]           'dig axfr' failed to properly handle a multi-message
                        axfr with a serial of 0. [RT #26796]

CHANGES
bin/dig/dighost.c
bin/named/xfrout.c
bin/tests/system/xfer/clean.sh
bin/tests/system/xfer/ns4/named.conf.base
bin/tests/system/xfer/ns4/root.db.in [new file with mode: 0644]
bin/tests/system/xfer/setup.sh
bin/tests/system/xfer/tests.sh

diff --git a/CHANGES b/CHANGES
index 667dc701766bdc64479ccb2a1209b5a89db8ae74..2f565f8149913012ad1be7bbcf8459d504348672 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,11 @@
-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]
index b3838930f419d1e212585f9802d1b7beb1967dc1..152c5521d98ee3c852e67caec93633927f0d6bc5 100644 (file)
@@ -15,7 +15,7 @@
  * 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
@@ -82,6 +82,7 @@
 #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>
@@ -743,7 +744,7 @@ make_empty_lookup(void) {
        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;
@@ -2869,8 +2870,10 @@ check_for_more_data(dig_query_t *query, dns_message_t *msg,
        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()");
 
@@ -2920,6 +2923,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;
                                        goto next_rdata;
                                }
 
@@ -2929,6 +2933,7 @@ check_for_more_data(dig_query_t *query, dns_message_t *msg,
                                 */
                                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);
@@ -2938,15 +2943,17 @@ check_for_more_data(dig_query_t *query, dns_message_t *msg,
                                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;
                                }
@@ -2956,22 +2963,12 @@ check_for_more_data(dig_query_t *query, dns_message_t *msg,
                                                      "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
@@ -2987,7 +2984,7 @@ check_for_more_data(dig_query_t *query, dns_message_t *msg,
                                        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);
index 9dcfed3636e4d3c5d7b1938725e5a1489441b5b5..07adb946997ca9cc073ae35643c442cc2050f92f 100644 (file)
@@ -15,7 +15,7 @@
  * 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>
 
@@ -1306,6 +1306,13 @@ sendstream(xfrout_ctx_t *xfr) {
                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
@@ -1344,9 +1351,13 @@ sendstream(xfrout_ctx_t *xfr) {
                        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;
+               }
        }
 
        /*
index 6f9f2cec4f56144c95c1978c6fc1dbf60097fa37..9aed522bc1e11dd5dea108152c0433b7116f0008 100644 (file)
@@ -15,7 +15,7 @@
 # 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
 
index 89651f5739c99288692413738af58b1f0c5b0db7..f1a747779eacb7005afc6a8bb6a76e59689bb6bd 100644 (file)
@@ -14,7 +14,7 @@
  * 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;
@@ -46,3 +46,8 @@ key tsig_key. {
 controls {
        inet 10.53.0.4 port 9953 allow { any; } keys { rndc_key; };
 };
+
+zone "." {
+       type master;
+       file "root.db";
+};
diff --git a/bin/tests/system/xfer/ns4/root.db.in b/bin/tests/system/xfer/ns4/root.db.in
new file mode 100644 (file)
index 0000000..701dd92
--- /dev/null
@@ -0,0 +1,4 @@
+; Copyright
+@ 0 SOA . . 0 0 0 0 0
+@ 0 NS .
+@ 0 A 10.53.0.4
index da22206ac27d39d4b97c14df2056ee50e65bdce8..df619a815eeb6bcb19cb3dbc76166b4cc79e6cb3 100644 (file)
 # 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
 
@@ -26,4 +29,6 @@ sh ../genzone.sh 6 3 >ns6/master.db
 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
index 7cdbc86f33a132cfca1da8ea9ac57283c9acb651..2949440c53aaf5e163aee955c2e0a80d53b404b4 100644 (file)
@@ -15,7 +15,7 @@
 # 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
@@ -201,6 +201,14 @@ test -f ns7/slave.bk.jnl || tmp=1
 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"