From 30be9a55be7e81d805de7cb696b2cbaf06a02350 Mon Sep 17 00:00:00 2001 From: Andreas Gustafsson Date: Thu, 28 Oct 1999 19:11:33 +0000 Subject: [PATCH] allocate message data structures using dns_message_gettemp* in IXFR case, too --- bin/named/xfrin.c | 84 ++++++++++++++++++++++++++++++----------------- lib/dns/xfrin.c | 84 ++++++++++++++++++++++++++++++----------------- 2 files changed, 108 insertions(+), 60 deletions(-) diff --git a/bin/named/xfrin.c b/bin/named/xfrin.c index 079c33c616..acf15a4355 100644 --- a/bin/named/xfrin.c +++ b/bin/named/xfrin.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: xfrin.c,v 1.19 1999/10/28 01:10:38 gson Exp $ */ + /* $Id: xfrin.c,v 1.20 1999/10/28 19:11:33 gson Exp $ */ #include @@ -677,6 +677,47 @@ xfrin_connect_done(isc_task_t *task, isc_event_t *event) { xfrin_fail(xfr, result, "connecting"); } +/* + * Convert a tuple into a dns_name_t suitable for inserting + * into the given dns_message_t. + */ +static isc_result_t +tuple2msgname(dns_difftuple_t *tuple, dns_message_t *msg, dns_name_t **target) +{ + dns_result_t result; + dns_rdata_t *rdata = NULL; + dns_rdatalist_t *rdl = NULL; + dns_rdataset_t *rds = NULL; + dns_name_t *name = NULL; + + REQUIRE(target != NULL && *target == NULL); + + CHECK(dns_message_gettemprdata(msg, &rdata)); + dns_rdata_init(rdata); + *rdata = tuple->rdata; /* Struct assignment. */ + + CHECK(dns_message_gettemprdatalist(msg, &rdl)); + dns_rdatalist_init(rdl); + rdl->type = tuple->rdata.type; + rdl->rdclass = tuple->rdata.rdclass; + rdl->ttl = tuple->ttl; + ISC_LIST_APPEND(rdl->rdata, rdata, link); + + CHECK(dns_message_gettemprdataset(msg, &rds)); + dns_rdataset_init(rds); + CHECK(dns_rdatalist_tordataset(rdl, rds)); + + CHECK(dns_message_gettempname(msg, &name)); + dns_name_init(name, NULL); + dns_name_clone(&tuple->name, name); + ISC_LIST_APPEND(name->list, rds, link); + + *target = name; + failure: + return (result); +} + + /* * Build an *XFR request and send its length prefix. */ @@ -688,10 +729,10 @@ xfrin_send_request(xfrin_ctx_t *xfr) { dns_rdataset_t *qrdataset = NULL; dns_message_t *msg = NULL; unsigned char length[2]; - dns_rdatalist_t soardl; - dns_rdataset_t soards; dns_difftuple_t *soatuple = NULL; dns_name_t *qname = NULL; + dns_dbversion_t *ver = NULL; + dns_name_t *msgsoaname; /* Create the request message */ CHECK(dns_message_create(xfr->mctx, DNS_MESSAGE_INTENTRENDER, &msg)); @@ -711,33 +752,17 @@ xfrin_send_request(xfrin_ctx_t *xfr) { dns_message_addname(msg, qname, DNS_SECTION_QUESTION); if (xfr->reqtype == dns_rdatatype_ixfr) { - /* Get the SOA. */ + /* Get the SOA and add it to the authority section. */ /* XXX is using the current version the right thing? */ - dns_dbversion_t *ver = NULL; dns_db_currentversion(xfr->db, &ver); - dns_db_createsoatuple(xfr->db, ver, xfr->mctx, - DNS_DIFFOP_EXISTS, &soatuple); + CHECK(dns_db_createsoatuple(xfr->db, ver, xfr->mctx, + DNS_DIFFOP_EXISTS, &soatuple)); xfr->ixfr.request_serial = dns_soa_getserial(&soatuple->rdata); - dns_db_closeversion(xfr->db, &ver, ISC_FALSE); - printf("requesting IXFR for serial %u\n", xfr->ixfr.request_serial); - /* Create a dns_rdatalist_t */ - soardl.type = soatuple->rdata.type; - soardl.rdclass = soatuple->rdata.rdclass; - soardl.ttl = soatuple->ttl; - ISC_LIST_INIT(soardl.rdata); - ISC_LINK_INIT(&soardl, link); - ISC_LIST_APPEND(soardl.rdata, &soatuple->rdata, link); - - dns_rdataset_init(&soards); - result = dns_rdatalist_tordataset(&soardl, &soards); - INSIST(result == DNS_R_SUCCESS); - ISC_LIST_APPEND(soatuple->name.list, &soards, link); - - dns_message_addname(msg, &soatuple->name, - DNS_SECTION_AUTHORITY); + CHECK(tuple2msgname(soatuple, msg, &msgsoaname)); + dns_message_addname(msg, msgsoaname, DNS_SECTION_AUTHORITY); } msg->id = ('b' << 8) | '9'; /* Arbitrary */ @@ -748,10 +773,6 @@ xfrin_send_request(xfrin_ctx_t *xfr) { xfr->lasttsig = msg->tsig; msg->tsig = NULL; - dns_message_destroy(&msg); /* XXX in failure case, too*/ - if (soatuple != NULL) - dns_difftuple_free(&soatuple); - isc_buffer_used(&xfr->qbuffer, ®ion); INSIST(region.length <= 65535); @@ -761,11 +782,14 @@ xfrin_send_request(xfrin_ctx_t *xfr) { lregion.length = 2; CHECK(isc_socket_send(xfr->socket, &lregion, xfr->task, xfrin_sendlen_done, xfr)); - return (DNS_R_SUCCESS); - + failure: + if (msg != NULL) + dns_message_destroy(&msg); if (soatuple != NULL) dns_difftuple_free(&soatuple); + if (ver != NULL) + dns_db_closeversion(xfr->db, &ver, ISC_FALSE); return (result); } diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 079c33c616..acf15a4355 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: xfrin.c,v 1.19 1999/10/28 01:10:38 gson Exp $ */ + /* $Id: xfrin.c,v 1.20 1999/10/28 19:11:33 gson Exp $ */ #include @@ -677,6 +677,47 @@ xfrin_connect_done(isc_task_t *task, isc_event_t *event) { xfrin_fail(xfr, result, "connecting"); } +/* + * Convert a tuple into a dns_name_t suitable for inserting + * into the given dns_message_t. + */ +static isc_result_t +tuple2msgname(dns_difftuple_t *tuple, dns_message_t *msg, dns_name_t **target) +{ + dns_result_t result; + dns_rdata_t *rdata = NULL; + dns_rdatalist_t *rdl = NULL; + dns_rdataset_t *rds = NULL; + dns_name_t *name = NULL; + + REQUIRE(target != NULL && *target == NULL); + + CHECK(dns_message_gettemprdata(msg, &rdata)); + dns_rdata_init(rdata); + *rdata = tuple->rdata; /* Struct assignment. */ + + CHECK(dns_message_gettemprdatalist(msg, &rdl)); + dns_rdatalist_init(rdl); + rdl->type = tuple->rdata.type; + rdl->rdclass = tuple->rdata.rdclass; + rdl->ttl = tuple->ttl; + ISC_LIST_APPEND(rdl->rdata, rdata, link); + + CHECK(dns_message_gettemprdataset(msg, &rds)); + dns_rdataset_init(rds); + CHECK(dns_rdatalist_tordataset(rdl, rds)); + + CHECK(dns_message_gettempname(msg, &name)); + dns_name_init(name, NULL); + dns_name_clone(&tuple->name, name); + ISC_LIST_APPEND(name->list, rds, link); + + *target = name; + failure: + return (result); +} + + /* * Build an *XFR request and send its length prefix. */ @@ -688,10 +729,10 @@ xfrin_send_request(xfrin_ctx_t *xfr) { dns_rdataset_t *qrdataset = NULL; dns_message_t *msg = NULL; unsigned char length[2]; - dns_rdatalist_t soardl; - dns_rdataset_t soards; dns_difftuple_t *soatuple = NULL; dns_name_t *qname = NULL; + dns_dbversion_t *ver = NULL; + dns_name_t *msgsoaname; /* Create the request message */ CHECK(dns_message_create(xfr->mctx, DNS_MESSAGE_INTENTRENDER, &msg)); @@ -711,33 +752,17 @@ xfrin_send_request(xfrin_ctx_t *xfr) { dns_message_addname(msg, qname, DNS_SECTION_QUESTION); if (xfr->reqtype == dns_rdatatype_ixfr) { - /* Get the SOA. */ + /* Get the SOA and add it to the authority section. */ /* XXX is using the current version the right thing? */ - dns_dbversion_t *ver = NULL; dns_db_currentversion(xfr->db, &ver); - dns_db_createsoatuple(xfr->db, ver, xfr->mctx, - DNS_DIFFOP_EXISTS, &soatuple); + CHECK(dns_db_createsoatuple(xfr->db, ver, xfr->mctx, + DNS_DIFFOP_EXISTS, &soatuple)); xfr->ixfr.request_serial = dns_soa_getserial(&soatuple->rdata); - dns_db_closeversion(xfr->db, &ver, ISC_FALSE); - printf("requesting IXFR for serial %u\n", xfr->ixfr.request_serial); - /* Create a dns_rdatalist_t */ - soardl.type = soatuple->rdata.type; - soardl.rdclass = soatuple->rdata.rdclass; - soardl.ttl = soatuple->ttl; - ISC_LIST_INIT(soardl.rdata); - ISC_LINK_INIT(&soardl, link); - ISC_LIST_APPEND(soardl.rdata, &soatuple->rdata, link); - - dns_rdataset_init(&soards); - result = dns_rdatalist_tordataset(&soardl, &soards); - INSIST(result == DNS_R_SUCCESS); - ISC_LIST_APPEND(soatuple->name.list, &soards, link); - - dns_message_addname(msg, &soatuple->name, - DNS_SECTION_AUTHORITY); + CHECK(tuple2msgname(soatuple, msg, &msgsoaname)); + dns_message_addname(msg, msgsoaname, DNS_SECTION_AUTHORITY); } msg->id = ('b' << 8) | '9'; /* Arbitrary */ @@ -748,10 +773,6 @@ xfrin_send_request(xfrin_ctx_t *xfr) { xfr->lasttsig = msg->tsig; msg->tsig = NULL; - dns_message_destroy(&msg); /* XXX in failure case, too*/ - if (soatuple != NULL) - dns_difftuple_free(&soatuple); - isc_buffer_used(&xfr->qbuffer, ®ion); INSIST(region.length <= 65535); @@ -761,11 +782,14 @@ xfrin_send_request(xfrin_ctx_t *xfr) { lregion.length = 2; CHECK(isc_socket_send(xfr->socket, &lregion, xfr->task, xfrin_sendlen_done, xfr)); - return (DNS_R_SUCCESS); - + failure: + if (msg != NULL) + dns_message_destroy(&msg); if (soatuple != NULL) dns_difftuple_free(&soatuple); + if (ver != NULL) + dns_db_closeversion(xfr->db, &ver, ISC_FALSE); return (result); }