dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
dns_rdatatype_t qtype;
dns_name_t *name;
+ isc_boolean_t wantcname;
REQUIRE(trans != NULL);
resstate = trans->resstate;
goto done;
}
+ wantcname = ISC_TF((resstate->head->ai_flags & AI_CANONNAME) != 0);
+
/* Parse the response and construct the addrinfo chain */
for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
name = ISC_LIST_NEXT(name, link)) {
isc_result_t result;
dns_rdataset_t *rdataset;
- isc_buffer_t b;
- isc_region_t r;
- char t[1024];
+ char cname[1024];
+
+ if (wantcname) {
+ isc_buffer_t b;
+
+ isc_buffer_init(&b, cname, sizeof(cname));
+ result = dns_name_totext(name, ISC_TRUE, &b);
+ if (result != ISC_R_SUCCESS) {
+ error = EAI_FAIL;
+ goto done;
+ }
+ isc_buffer_putuint8(&b, '\0');
+ }
for (rdataset = ISC_LIST_HEAD(name->list);
rdataset != NULL;
if (rdataset->type != qtype)
continue;
- if ((resstate->head->ai_flags & AI_CANONNAME) != 0) {
- isc_buffer_init(&b, t, sizeof(t));
- result = dns_name_totext(name, ISC_TRUE, &b);
- if (result != ISC_R_SUCCESS) {
- error = EAI_FAIL;
- goto done;
- }
- isc_buffer_putuint8(&b, '\0');
- isc_buffer_usedregion(&b, &r);
- }
-
for (result = dns_rdataset_first(rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(rdataset)) {
switch (family) {
case AF_INET:
dns_rdataset_current(rdataset, &rdata);
- result = dns_rdata_tostruct(&rdata, &rdata_a,
+ result = dns_rdata_tostruct(&rdata,
+ &rdata_a,
NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
SIN(ai->ai_addr)->sin_port =
break;
case AF_INET6:
dns_rdataset_current(rdataset, &rdata);
- result = dns_rdata_tostruct(&rdata, &rdata_aaaa,
+ result = dns_rdata_tostruct(&rdata,
+ &rdata_aaaa,
NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
SIN6(ai->ai_addr)->sin6_port =
break;
}
- if ((resstate->head->ai_flags & AI_CANONNAME)
- != 0) {
- ai->ai_canonname =
- strdup((const char *)r.base);
+ if (wantcname) {
+ ai->ai_canonname = strdup(cname);
if (ai->ai_canonname == NULL) {
error = EAI_MEMORY;
goto done;