]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3655. [cleanup] Simplify TCP message processing when requesting a
authorMark Andrews <marka@isc.org>
Tue, 24 Sep 2013 23:57:34 +0000 (09:57 +1000)
committerMark Andrews <marka@isc.org>
Tue, 24 Sep 2013 23:57:34 +0000 (09:57 +1000)
                        zone transfer.  [RT #34825]

CHANGES
bin/tests/bigtest/buildzones.sh
lib/dns/xfrin.c

diff --git a/CHANGES b/CHANGES
index 407659b5547e4d8241f55a4ae822419e2eb2ead3..fda8d476668d4803be931035abda589a91c29f46 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3655.  [cleanup]       Simplify TCP message processing when requesting a
+                       zone transfer.  [RT #34825]
+
 3654.  [bug]           Address race condition with manual notify requests.
                        [RT #34806]
 
index 1ef7038afd11898044038ea571eb2f908997ef16..ac85d13d6902ac8fbb0aab8133be31e6b94aac14 100644 (file)
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-TOP=$( (cd ../../.. && pwd) )
+SYSTEMTESTTOP=..
+. ../conf.sh
 
 addr=127.127.0.0
 ttl=300
-named=${TOP}/bin/named/named
-keygen=${TOP}/bin/dnssec/dnssec-keygen
-dsfromkey=${TOP}/bin/dnssec/dnssec-dsfromkey
+named=${NAMED}
+keygen=${KEYGEN}
+dsfromkey=${DSFROMKEY}
 
 nextaddr() {
        OLDIF="$IFS"
index 08d71219519226eef2ee3011455d9b69aaf0def8..744f87802c087d481b94e4fb288b8a5b0bf02cdc 100644 (file)
@@ -221,7 +221,6 @@ static isc_result_t xfrin_start(dns_xfrin_ctx_t *xfr);
 static void xfrin_connect_done(isc_task_t *task, isc_event_t *event);
 static isc_result_t xfrin_send_request(dns_xfrin_ctx_t *xfr);
 static void xfrin_send_done(isc_task_t *task, isc_event_t *event);
-static void xfrin_sendlen_done(isc_task_t *task, isc_event_t *event);
 static void xfrin_recv_done(isc_task_t *task, isc_event_t *event);
 static void xfrin_timeout(isc_task_t *task, isc_event_t *event);
 
@@ -881,8 +880,11 @@ xfrin_create(isc_mem_t *mctx,
        xfr->sourceaddr = *sourceaddr;
        isc_sockaddr_setport(&xfr->sourceaddr, 0);
 
-       isc_buffer_init(&xfr->qbuffer, xfr->qbuffer_data,
-                       sizeof(xfr->qbuffer_data));
+       /*
+        * Reserve 2 bytes for TCP length at the begining of the buffer.
+        */
+       isc_buffer_init(&xfr->qbuffer, &xfr->qbuffer_data[2],
+                       sizeof(xfr->qbuffer_data) - 2);
 
        xfr->magic = XFRIN_MAGIC;
        *xfrp = xfr;
@@ -1065,10 +1067,8 @@ static isc_result_t
 xfrin_send_request(dns_xfrin_ctx_t *xfr) {
        isc_result_t result;
        isc_region_t region;
-       isc_region_t lregion;
        dns_rdataset_t *qrdataset = NULL;
        dns_message_t *msg = NULL;
-       unsigned char length[2];
        dns_difftuple_t *soatuple = NULL;
        dns_name_t *qname = NULL;
        dns_dbversion_t *ver = NULL;
@@ -1137,12 +1137,16 @@ xfrin_send_request(dns_xfrin_ctx_t *xfr) {
        isc_buffer_usedregion(&xfr->qbuffer, &region);
        INSIST(region.length <= 65535);
 
-       length[0] = region.length >> 8;
-       length[1] = region.length & 0xFF;
-       lregion.base = length;
-       lregion.length = 2;
-       CHECK(isc_socket_send(xfr->socket, &lregion, xfr->task,
-                             xfrin_sendlen_done, xfr));
+       /*
+        * Record message length and adjust region to include TCP
+        * length field.
+        */
+       xfr->qbuffer_data[0] = (region.length >> 8) & 0xff;
+       xfr->qbuffer_data[1] = region.length & 0xff;
+       region.base -= 2;
+       region.length += 2;
+       CHECK(isc_socket_send(xfr->socket, &region, xfr->task,
+                             xfrin_send_done, xfr));
        xfr->sends++;
 
  failure:
@@ -1159,42 +1163,6 @@ xfrin_send_request(dns_xfrin_ctx_t *xfr) {
        return (result);
 }
 
-/* XXX there should be library support for sending DNS TCP messages */
-
-static void
-xfrin_sendlen_done(isc_task_t *task, isc_event_t *event) {
-       isc_socketevent_t *sev = (isc_socketevent_t *) event;
-       dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *) event->ev_arg;
-       isc_result_t evresult = sev->result;
-       isc_result_t result;
-       isc_region_t region;
-
-       REQUIRE(VALID_XFRIN(xfr));
-
-       UNUSED(task);
-
-       INSIST(event->ev_type == ISC_SOCKEVENT_SENDDONE);
-       isc_event_free(&event);
-
-       xfr->sends--;
-       if (xfr->shuttingdown) {
-               maybe_free(xfr);
-               return;
-       }
-
-       xfrin_log(xfr, ISC_LOG_DEBUG(3), "sent request length prefix");
-       CHECK(evresult);
-
-       isc_buffer_usedregion(&xfr->qbuffer, &region);
-       CHECK(isc_socket_send(xfr->socket, &region, xfr->task,
-                             xfrin_send_done, xfr));
-       xfr->sends++;
- failure:
-       if (result != ISC_R_SUCCESS)
-               xfrin_fail(xfr, result, "failed sending request length prefix");
-}
-
-
 static void
 xfrin_send_done(isc_task_t *task, isc_event_t *event) {
        isc_socketevent_t *sev = (isc_socketevent_t *) event;