From: Mark Andrews Date: Wed, 7 May 2014 23:38:05 +0000 (+1000) Subject: 3841. [cleanup] Refactor zone.c:add_opt to use dns_message_buildopt. X-Git-Tag: v9.10.1b1~106 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=64f015935f932cfe429e4820140a078999a50b7d;p=thirdparty%2Fbind9.git 3841. [cleanup] Refactor zone.c:add_opt to use dns_message_buildopt. [RT #35924] (cherry picked from commit faa01edd13613c077c3cb663c36f36bd527d1a4b) --- diff --git a/CHANGES b/CHANGES index 7a40a281522..73fd14f79b0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3841. [cleanup] Refactor zone.c:add_opt to use dns_message_buildopt. + [RT #35924] + 3840. [port] Check for arc4random_addrandom() before using it; it's been removed from OpenBSD 5.5. [RT #35907] diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 279a3304040..98fb0c9ea52 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -11395,70 +11395,25 @@ create_query(dns_zone_t *zone, dns_rdatatype_t rdtype, static isc_result_t add_opt(dns_message_t *message, isc_uint16_t udpsize, isc_boolean_t reqnsid) { - dns_rdataset_t *rdataset = NULL; - dns_rdatalist_t *rdatalist = NULL; - dns_rdata_t *rdata = NULL; isc_result_t result; - - result = dns_message_gettemprdatalist(message, &rdatalist); - if (result != ISC_R_SUCCESS) - goto cleanup; - result = dns_message_gettemprdata(message, &rdata); - if (result != ISC_R_SUCCESS) - goto cleanup; - result = dns_message_gettemprdataset(message, &rdataset); - if (result != ISC_R_SUCCESS) - goto cleanup; - dns_rdataset_init(rdataset); - - rdatalist->type = dns_rdatatype_opt; - rdatalist->covers = 0; - - /* - * Set Maximum UDP buffer size. - */ - rdatalist->rdclass = udpsize; - - /* - * Set EXTENDED-RCODE, VERSION, DO and Z to 0. - */ - rdatalist->ttl = 0; + dns_rdataset_t *rdataset = NULL; + dns_ednsopt_t ednsopts[DNS_EDNSOPTIONS]; + int count = 0; /* Set EDNS options if applicable */ if (reqnsid) { - unsigned char data[4]; - isc_buffer_t buf; - - isc_buffer_init(&buf, data, sizeof(data)); - isc_buffer_putuint16(&buf, DNS_OPT_NSID); - isc_buffer_putuint16(&buf, 0); - rdata->data = data; - rdata->length = sizeof(data); - } else { - rdata->data = NULL; - rdata->length = 0; + INSIST(count < DNS_EDNSOPTIONS); + ednsopts[count].code = DNS_OPT_NSID; + ednsopts[count].length = 0; + ednsopts[count].value = NULL; + count++; } - - rdata->rdclass = rdatalist->rdclass; - rdata->type = rdatalist->type; - rdata->flags = 0; - - ISC_LIST_INIT(rdatalist->rdata); - ISC_LIST_APPEND(rdatalist->rdata, rdata, link); - RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset) - == ISC_R_SUCCESS); + result = dns_message_buildopt(message, &rdataset, 0, udpsize, 0, + ednsopts, count); + if (result != ISC_R_SUCCESS) + return (result); return (dns_message_setopt(message, rdataset)); - - cleanup: - if (rdatalist != NULL) - dns_message_puttemprdatalist(message, &rdatalist); - if (rdataset != NULL) - dns_message_puttemprdataset(message, &rdataset); - if (rdata != NULL) - dns_message_puttemprdata(message, &rdata); - - return (result); } static void