diff --git a/lib/dns/message.c b/lib/dns/message.c index bc4d127..0ba559f 100644 --- a/lib/dns/message.c +++ b/lib/dns/message.c @@ -2582,9 +2582,9 @@ dns_message_setopt(dns_message_t *msg, dns_rdataset_t *opt) { return (ISC_R_SUCCESS); cleanup: + dns_rdataset_disassociate(opt); dns_message_puttemprdataset(msg, &opt); return (result); - } dns_rdataset_t * diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 20e19f9..21fcd36 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -946,23 +946,20 @@ resquery_senddone(isc_task_t *task, isc_event_t *event) { static inline isc_result_t fctx_addopt(dns_message_t *message, dns_resolver_t *res) { - dns_rdataset_t *rdataset; - dns_rdatalist_t *rdatalist; - dns_rdata_t *rdata; + dns_rdataset_t *rdataset = NULL; + dns_rdatalist_t *rdatalist = NULL; + dns_rdata_t *rdata = NULL; isc_result_t result; - rdatalist = NULL; result = dns_message_gettemprdatalist(message, &rdatalist); if (result != ISC_R_SUCCESS) return (result); - rdata = NULL; result = dns_message_gettemprdata(message, &rdata); if (result != ISC_R_SUCCESS) - return (result); - rdataset = NULL; + goto cleanup; result = dns_message_gettemprdataset(message, &rdataset); if (result != ISC_R_SUCCESS) - return (result); + goto cleanup; dns_rdataset_init(rdataset); rdatalist->type = dns_rdatatype_opt; @@ -977,7 +974,6 @@ fctx_addopt(dns_message_t *message, dns_resolver_t *res) { * Set EXTENDED-RCODE, VERSION, and Z to 0, and the DO bit to 1. */ rdatalist->ttl = DNS_MESSAGEEXTFLAG_DO; - /* * No EDNS options. */ @@ -992,6 +988,15 @@ fctx_addopt(dns_message_t *message, dns_resolver_t *res) { RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset) == ISC_R_SUCCESS); return (dns_message_setopt(message, rdataset)); + + cleanup: + if (rdata != NULL) + dns_message_puttemprdata(message, &rdata); + if (rdataset != NULL) + dns_message_puttemprdataset(message, &rdataset); + if (rdatalist != NULL) + dns_message_puttemprdatalist(message, &rdatalist); + return (result); } static inline void