diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 88616db1b4..b1ed60c58a 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -1681,7 +1681,7 @@ destroy_lookup(dig_lookup_t *lookup) { isc_mem_free(mctx, ptr); } if (lookup->sendmsg != NULL) { - dns_message_destroy(&lookup->sendmsg); + dns_message_detach(&lookup->sendmsg); } if (lookup->querysig != NULL) { debug("freeing buffer %p", lookup->querysig); @@ -3817,7 +3817,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { hex_dump(&b); } query->waiting_connect = false; - dns_message_destroy(&msg); + dns_message_detach(&msg); isc_event_free(&event); clear_query(query); cancel_lookup(l); @@ -3839,7 +3839,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { dighost_warning("Warning: Opcode mismatch: expected %s, got %s", expect, got); - dns_message_destroy(&msg); + dns_message_detach(&msg); if (l->tcp_mode) { isc_event_free(&event); clear_query(query); @@ -3891,7 +3891,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { } } if (!match) { - dns_message_destroy(&msg); + dns_message_detach(&msg); if (l->tcp_mode) { isc_event_free(&event); clear_query(query); @@ -3917,7 +3917,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { if (l->trace && l->trace_root) { n->rdtype = l->qrdtype; } - dns_message_destroy(&msg); + dns_message_detach(&msg); isc_event_free(&event); clear_query(query); cancel_lookup(l); @@ -3936,7 +3936,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { if (l->trace && l->trace_root) { n->rdtype = l->qrdtype; } - dns_message_destroy(&msg); + dns_message_detach(&msg); isc_event_free(&event); clear_query(query); cancel_lookup(l); @@ -3960,7 +3960,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { if (l->trace && l->trace_root) { n->rdtype = l->qrdtype; } - dns_message_destroy(&msg); + dns_message_detach(&msg); isc_event_free(&event); clear_query(query); cancel_lookup(l); @@ -4001,7 +4001,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { query->servname); clear_query(query); check_next_lookup(l); - dns_message_destroy(&msg); + dns_message_detach(&msg); isc_event_free(&event); UNLOCK_LOOKUP; return; @@ -4134,7 +4134,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { } if (l->doing_xfr) { if (query != l->xfr_q) { - dns_message_destroy(&msg); + dns_message_detach(&msg); isc_event_free(&event); query->waiting_connect = false; UNLOCK_LOOKUP; @@ -4144,7 +4144,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { docancel = check_for_more_data(query, msg, sevent); } if (docancel) { - dns_message_destroy(&msg); + dns_message_detach(&msg); clear_query(query); cancel_lookup(l); check_next_lookup(l); @@ -4160,14 +4160,14 @@ recv_done(isc_task_t *task, isc_event_t *event) { } if (!query->lookup->ns_search_only || query->lookup->trace_root || docancel) { - dns_message_destroy(&msg); + dns_message_detach(&msg); cancel_lookup(l); } clear_query(query); check_next_lookup(l); } if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } isc_event_free(&event); UNLOCK_LOOKUP; diff --git a/bin/dig/nslookup.c b/bin/dig/nslookup.c index d0e270e048..1e99a3dae2 100644 --- a/bin/dig/nslookup.c +++ b/bin/dig/nslookup.c @@ -935,7 +935,7 @@ flush_lookup_list(void) { isc_mem_free(mctx, sp); } if (l->sendmsg != NULL) { - dns_message_destroy(&l->sendmsg); + dns_message_detach(&l->sendmsg); } lp = l; l = ISC_LIST_NEXT(l, link); diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c index e9d524dd5f..b3fed5d500 100644 --- a/bin/nsupdate/nsupdate.c +++ b/bin/nsupdate/nsupdate.c @@ -720,7 +720,7 @@ doshutdown(void) { } if (updatemsg != NULL) { - dns_message_destroy(&updatemsg); + dns_message_detach(&updatemsg); } if (is_dst_up) { @@ -2580,7 +2580,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) { if (shuttingdown) { dns_request_destroy(&request); - dns_message_destroy(&soaquery); + dns_message_detach(&soaquery); isc_mem_put(gmctx, reqinfo, sizeof(nsu_requestinfo_t)); isc_event_free(&event); maybeshutdown(); @@ -2611,7 +2611,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) { result = dns_request_getresponse(request, rcvmsg, DNS_MESSAGEPARSE_PRESERVEORDER); if (result == DNS_R_TSIGERRORSET && servers != NULL) { - dns_message_destroy(&rcvmsg); + dns_message_detach(&rcvmsg); ddebug("Destroying request [%p]", request); dns_request_destroy(&request); reqinfo = isc_mem_get(gmctx, sizeof(nsu_requestinfo_t)); @@ -2650,9 +2650,9 @@ recvsoa(isc_task_t *task, isc_event_t *event) { char namebuf[DNS_NAME_FORMATSIZE]; dns_name_format(userzone, namebuf, sizeof(namebuf)); error("specified zone '%s' does not exist (NXDOMAIN)", namebuf); - dns_message_destroy(&rcvmsg); + dns_message_detach(&rcvmsg); dns_request_destroy(&request); - dns_message_destroy(&soaquery); + dns_message_detach(&soaquery); ddebug("Out of recvsoa"); done_update(); seenerror = true; @@ -2786,11 +2786,11 @@ lookforsoa: setzoneclass(dns_rdataclass_none); #endif /* HAVE_GSSAPI */ - dns_message_destroy(&soaquery); + dns_message_detach(&soaquery); dns_request_destroy(&request); out: - dns_message_destroy(&rcvmsg); + dns_message_detach(&rcvmsg); ddebug("Out of recvsoa"); return; @@ -3003,7 +3003,7 @@ start_gssrequest(dns_name_t *master) { failure: if (rmsg != NULL) { - dns_message_destroy(&rmsg); + dns_message_detach(&rmsg); } if (err_message != NULL) { isc_mem_free(gmctx, err_message); @@ -3078,7 +3078,7 @@ recvgss(isc_task_t *task, isc_event_t *event) { if (shuttingdown) { dns_request_destroy(&request); - dns_message_destroy(&tsigquery); + dns_message_detach(&tsigquery); isc_mem_put(gmctx, reqinfo, sizeof(nsu_gssinfo_t)); isc_event_free(&event); maybeshutdown(); @@ -3089,7 +3089,7 @@ recvgss(isc_task_t *task, isc_event_t *event) { ddebug("Destroying request [%p]", request); dns_request_destroy(&request); if (!next_master("recvgss", addr, eresult)) { - dns_message_destroy(&tsigquery); + dns_message_detach(&tsigquery); failed_gssrequest(); } else { dns_message_renderreset(tsigquery); @@ -3149,7 +3149,7 @@ recvgss(isc_task_t *task, isc_event_t *event) { &err_message); switch (result) { case DNS_R_CONTINUE: - dns_message_destroy(&rcvmsg); + dns_message_detach(&rcvmsg); dns_request_destroy(&request); send_gssrequest(kserver, tsigquery, &request, context); ddebug("Out of recvgss"); @@ -3196,9 +3196,9 @@ recvgss(isc_task_t *task, isc_event_t *event) { done: dns_request_destroy(&request); - dns_message_destroy(&tsigquery); + dns_message_detach(&tsigquery); - dns_message_destroy(&rcvmsg); + dns_message_detach(&rcvmsg); ddebug("Out of recvgss"); } #endif /* HAVE_GSSAPI */ @@ -3217,7 +3217,7 @@ start_update(void) { LOCK(&answer_lock); if (answer != NULL) { - dns_message_destroy(&answer); + dns_message_detach(&answer); } UNLOCK(&answer_lock); @@ -3262,7 +3262,7 @@ start_update(void) { dns_message_puttempname(soaquery, &name); dns_rdataset_disassociate(rdataset); dns_message_puttemprdataset(soaquery, &rdataset); - dns_message_destroy(&soaquery); + dns_message_detach(&soaquery); done_update(); return; } @@ -3300,7 +3300,7 @@ cleanup(void) { LOCK(&answer_lock); if (answer != NULL) { - dns_message_destroy(&answer); + dns_message_detach(&answer); } UNLOCK(&answer_lock); diff --git a/bin/tests/system/pipelined/pipequeries.c b/bin/tests/system/pipelined/pipequeries.c index 668594e026..7bafdc66b0 100644 --- a/bin/tests/system/pipelined/pipequeries.c +++ b/bin/tests/system/pipelined/pipequeries.c @@ -114,8 +114,8 @@ recvresponse(isc_task_t *task, isc_event_t *event) { (char *)isc_buffer_base(&outbuf)); fflush(stdout); - dns_message_destroy(&query); - dns_message_destroy(&response); + dns_message_detach(&query); + dns_message_detach(&response); dns_request_destroy(&reqev->request); isc_event_free(&event); diff --git a/bin/tests/system/tkey/keycreate.c b/bin/tests/system/tkey/keycreate.c index 0527fb11fe..8fa5a7d2f1 100644 --- a/bin/tests/system/tkey/keycreate.c +++ b/bin/tests/system/tkey/keycreate.c @@ -118,8 +118,8 @@ recvquery(isc_task_t *task, isc_event_t *event) { result = dst_key_tofile(tsigkey->key, type, ""); CHECK("dst_key_tofile", result); - dns_message_destroy(&query); - dns_message_destroy(&response); + dns_message_detach(&query); + dns_message_detach(&response); dns_request_destroy(&reqev->request); isc_event_free(&event); isc_app_shutdown(); diff --git a/bin/tests/system/tkey/keydelete.c b/bin/tests/system/tkey/keydelete.c index dff499f0b5..15fb84b2f0 100644 --- a/bin/tests/system/tkey/keydelete.c +++ b/bin/tests/system/tkey/keydelete.c @@ -96,8 +96,8 @@ recvquery(isc_task_t *task, isc_event_t *event) { result = dns_tkey_processdeleteresponse(query, response, ring); CHECK("dns_tkey_processdhresponse", result); - dns_message_destroy(&query); - dns_message_destroy(&response); + dns_message_detach(&query); + dns_message_detach(&response); dns_request_destroy(&reqev->request); isc_event_free(&event); isc_app_shutdown(); diff --git a/bin/tests/wire_test.c b/bin/tests/wire_test.c index b972e98cca..f420d8992c 100644 --- a/bin/tests/wire_test.c +++ b/bin/tests/wire_test.c @@ -341,7 +341,7 @@ process_message(isc_buffer_t *source) { dns_compress_invalidate(&cctx); message->from_to_wire = DNS_MESSAGE_INTENTPARSE; - dns_message_destroy(&message); + dns_message_detach(&message); printf("Message rendered.\n"); if (printmemstats) { @@ -358,5 +358,5 @@ process_message(isc_buffer_t *source) { result = printmessage(message); CHECKRESULT(result, "printmessage() failed"); } - dns_message_destroy(&message); + dns_message_detach(&message); } diff --git a/bin/tools/dnstap-read.c b/bin/tools/dnstap-read.c index f952e9bf25..5b15fa8153 100644 --- a/bin/tools/dnstap-read.c +++ b/bin/tools/dnstap-read.c @@ -417,7 +417,7 @@ cleanup: dns_dt_close(&handle); } if (message != NULL) { - dns_message_destroy(&message); + dns_message_detach(&message); } if (b != NULL) { isc_buffer_free(&b); diff --git a/bin/tools/mdig.c b/bin/tools/mdig.c index 3183758e37..0f7ddcdffb 100644 --- a/bin/tools/mdig.c +++ b/bin/tools/mdig.c @@ -534,10 +534,10 @@ cleanup: dns_master_styledestroy(&style, mctx); } if (query != NULL) { - dns_message_destroy(&query); + dns_message_detach(&query); } if (response != NULL) { - dns_message_destroy(&response); + dns_message_detach(&response); } dns_request_destroy(&reqev->request); isc_event_free(&event); diff --git a/fuzz/dns_message_parse.c b/fuzz/dns_message_parse.c index dc90e8d4e1..0f80465b43 100644 --- a/fuzz/dns_message_parse.c +++ b/fuzz/dns_message_parse.c @@ -60,7 +60,7 @@ parse_message(isc_buffer_t *input, dns_message_t **messagep) { if (result == ISC_R_SUCCESS && messagep != NULL) { *messagep = message; } else { - dns_message_destroy(&message); + dns_message_detach(&message); } return (result); @@ -128,7 +128,7 @@ render_message(dns_message_t **messagep) { message->from_to_wire = DNS_MESSAGE_INTENTPARSE; - dns_message_destroy(messagep); + dns_message_detach(messagep); result = parse_message(&buffer, messagep); @@ -171,7 +171,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { cleanup: if (message != NULL) { - dns_message_destroy(&message); + dns_message_detach(&message); } return (0); diff --git a/lib/dns/client.c b/lib/dns/client.c index f7a5cdb683..2f18855188 100644 --- a/lib/dns/client.c +++ b/lib/dns/client.c @@ -1893,7 +1893,7 @@ static void update_sendevent(updatectx_t *uctx, isc_result_t result) { isc_task_t *task; - dns_message_destroy(&uctx->updatemsg); + dns_message_detach(&uctx->updatemsg); if (uctx->tsigkey != NULL) { dns_tsigkey_detach(&uctx->tsigkey); } @@ -1950,7 +1950,7 @@ update_done(isc_task_t *task, isc_event_t *event) { out: if (answer != NULL) { - dns_message_destroy(&answer); + dns_message_detach(&answer); } isc_event_free(&event); @@ -2282,7 +2282,7 @@ receive_soa(isc_task_t *task, isc_event_t *event) { dns_request_t *newrequest = NULL; /* Retry SOA request without TSIG */ - dns_message_destroy(&rcvmsg); + dns_message_detach(&rcvmsg); dns_message_renderreset(uctx->soaquery); reqoptions = 0; if (uctx->want_tcp) { @@ -2397,14 +2397,14 @@ out: } if (!droplabel || result != ISC_R_SUCCESS) { - dns_message_destroy(&uctx->soaquery); + dns_message_detach(&uctx->soaquery); LOCK(&uctx->lock); dns_request_destroy(&uctx->soareq); UNLOCK(&uctx->lock); } if (rcvmsg != NULL) { - dns_message_destroy(&rcvmsg); + dns_message_detach(&rcvmsg); } if (result != ISC_R_SUCCESS) { @@ -2466,7 +2466,7 @@ fail: if (name != NULL) { dns_message_puttempname(soaquery, &name); } - dns_message_destroy(&soaquery); + dns_message_detach(&soaquery); return (result); } @@ -2956,7 +2956,7 @@ fail: UNLOCK(&client->lock); } if (uctx->updatemsg != NULL) { - dns_message_destroy(&uctx->updatemsg); + dns_message_detach(&uctx->updatemsg); } while ((sa = ISC_LIST_HEAD(uctx->servers)) != NULL) { ISC_LIST_UNLINK(uctx->servers, sa, link); diff --git a/lib/dns/dnstap.c b/lib/dns/dnstap.c index cd58b9b2a8..064f1b2586 100644 --- a/lib/dns/dnstap.c +++ b/lib/dns/dnstap.c @@ -1147,7 +1147,7 @@ dns_dt_parse(isc_mem_t *mctx, isc_region_t *src, dns_dtdata_t **destp) { result = dns_message_parse(d->msg, &b, 0); if (result != ISC_R_SUCCESS) { if (result != DNS_R_RECOVERABLE) { - dns_message_destroy(&d->msg); + dns_message_detach(&d->msg); } result = ISC_R_SUCCESS; } @@ -1370,7 +1370,7 @@ dns_dtdata_free(dns_dtdata_t **dp) { *dp = NULL; if (d->msg != NULL) { - dns_message_destroy(&d->msg); + dns_message_detach(&d->msg); } if (d->frame != NULL) { dnstap__dnstap__free_unpacked(d->frame, NULL); diff --git a/lib/dns/include/dns/message.h b/lib/dns/include/dns/message.h index b89cc6b6d5..1f13bcf2fd 100644 --- a/lib/dns/include/dns/message.h +++ b/lib/dns/include/dns/message.h @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -203,6 +204,7 @@ struct dns_sortlist_arg { struct dns_message { /* public from here down */ unsigned int magic; + isc_refcount_t refcount; dns_messageid_t id; unsigned int flags; @@ -324,8 +326,8 @@ dns_message_reset(dns_message_t *msg, unsigned int intent); /*%< * Reset a message structure to default state. All internal lists are freed * or reset to a default state as well. This is simply a more efficient - * way to call dns_message_destroy() followed by dns_message_allocate(), - * since it avoid many memory allocations. + * way to call dns_message_detach() (assuming last reference is hold), + * followed by dns_message_create(), since it avoid many memory allocations. * * If any data loanouts (buffers, names, rdatas, etc) were requested, * the caller must no longer use them after this call. @@ -340,16 +342,23 @@ dns_message_reset(dns_message_t *msg, unsigned int intent); */ void -dns_message_destroy(dns_message_t **msgp); +dns_message_attach(dns_message_t *source, dns_message_t **target); /*%< - * Destroy all state in the message. + * Attach to message 'source'. * * Requires: + *\li 'source' to be a valid message. + *\li 'target' to be non NULL and '*target' to be NULL. + */ + +void +dns_message_detach(dns_message_t **messagep); +/*%< + * Detach *messagep from its message. + * list. * - *\li 'msgp' be valid. - * - * Ensures: - *\li '*msgp' == NULL + * Requires: + *\li '*messagep' to be a valid message. */ isc_result_t diff --git a/lib/dns/message.c b/lib/dns/message.c index 98fa9177e8..b8fd4dee93 100644 --- a/lib/dns/message.c +++ b/lib/dns/message.c @@ -539,7 +539,7 @@ msgresetsigs(dns_message_t *msg, bool replying) { /* * Free all but one (or everything) for this message. This is used by - * both dns_message_reset() and dns_message_destroy(). + * both dns_message_reset() and dns__message_destroy(). */ static void msgreset(dns_message_t *msg, bool everything) { @@ -774,6 +774,8 @@ dns_message_create(isc_mem_t *mctx, unsigned int intent, dns_message_t **msgp) { m->cctx = NULL; + isc_refcount_init(&m->refcount, 1); + *msgp = m; return (ISC_R_SUCCESS); } @@ -788,23 +790,38 @@ dns_message_reset(dns_message_t *msg, unsigned int intent) { msg->from_to_wire = intent; } -void -dns_message_destroy(dns_message_t **msgp) { - dns_message_t *msg; - - REQUIRE(msgp != NULL); - REQUIRE(DNS_MESSAGE_VALID(*msgp)); - - msg = *msgp; - *msgp = NULL; +static void +dns__message_destroy(dns_message_t *msg) { + REQUIRE(msg != NULL); + REQUIRE(DNS_MESSAGE_VALID(msg)); msgreset(msg, true); isc_mempool_destroy(&msg->namepool); isc_mempool_destroy(&msg->rdspool); + isc_refcount_destroy(&msg->refcount); msg->magic = 0; isc_mem_putanddetach(&msg->mctx, msg, sizeof(dns_message_t)); } +void +dns_message_attach(dns_message_t *source, dns_message_t **target) { + REQUIRE(DNS_MESSAGE_VALID(source)); + + isc_refcount_increment(&source->refcount); + *target = source; +} + +void +dns_message_detach(dns_message_t **messagep) { + REQUIRE(messagep != NULL && DNS_MESSAGE_VALID(*messagep)); + dns_message_t *msg = *messagep; + *messagep = NULL; + + if (isc_refcount_decrement(&msg->refcount) == 1) { + dns__message_destroy(msg); + } +} + static isc_result_t findname(dns_name_t **foundname, const dns_name_t *target, dns_namelist_t *section) { diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index b2737562bc..5f5cafce7b 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -4561,8 +4561,8 @@ fctx_destroy(fetchctx_t *fctx) { isc_counter_detach(&fctx->qc); fcount_decr(fctx); isc_timer_detach(&fctx->timer); - dns_message_destroy(&fctx->rmessage); - dns_message_destroy(&fctx->qmessage); + dns_message_detach(&fctx->rmessage); + dns_message_detach(&fctx->qmessage); if (dns_name_countlabels(&fctx->domain) > 0) { dns_name_free(&fctx->domain, fctx->mctx); } @@ -5217,10 +5217,10 @@ cleanup_mctx: isc_timer_detach(&fctx->timer); cleanup_rmessage: - dns_message_destroy(&fctx->rmessage); + dns_message_detach(&fctx->rmessage); cleanup_qmessage: - dns_message_destroy(&fctx->qmessage); + dns_message_detach(&fctx->qmessage); cleanup_fcount: fcount_decr(fctx); diff --git a/lib/dns/tests/tsig_test.c b/lib/dns/tests/tsig_test.c index eec284758e..85821b1258 100644 --- a/lib/dns/tests/tsig_test.c +++ b/lib/dns/tests/tsig_test.c @@ -262,7 +262,7 @@ render(isc_buffer_t *buf, unsigned flags, dns_tsigkey_t *key, } dns_compress_invalidate(&cctx); - dns_message_destroy(&msg); + dns_message_detach(&msg); } /* @@ -353,7 +353,7 @@ tsig_tcp_test(void **state) { tsigctx = msg->tsigctx; msg->tsigctx = NULL; isc_buffer_free(&buf); - dns_message_destroy(&msg); + dns_message_detach(&msg); result = dst_context_create(key->key, dt_mctx, DNS_LOGCATEGORY_DNSSEC, false, 0, &outctx); @@ -410,7 +410,7 @@ tsig_tcp_test(void **state) { tsigctx = msg->tsigctx; msg->tsigctx = NULL; isc_buffer_free(&buf); - dns_message_destroy(&msg); + dns_message_detach(&msg); /* * Create response message 3. @@ -461,7 +461,7 @@ tsig_tcp_test(void **state) { assert_int_equal(result, ISC_R_SUCCESS); isc_buffer_free(&buf); - dns_message_destroy(&msg); + dns_message_detach(&msg); if (outctx != NULL) { dst_context_destroy(&outctx); diff --git a/lib/dns/win32/libdns.def.in b/lib/dns/win32/libdns.def.in index e3f6aed4ea..c8f308dec9 100644 --- a/lib/dns/win32/libdns.def.in +++ b/lib/dns/win32/libdns.def.in @@ -522,12 +522,13 @@ dns_master_stylecreate dns_master_styledestroy dns_master_styleflags dns_message_addname +dns_message_attach dns_message_buildopt dns_message_checksig dns_message_clonebuffer dns_message_create dns_message_currentname -dns_message_destroy +dns_message_detach dns_message_find dns_message_findname dns_message_findtype diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 9d96c24fcf..d24816af28 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -1187,7 +1187,7 @@ failure: dns_message_puttemprdataset(msg, &qrdataset); } if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } if (soatuple != NULL) { dns_difftuple_free(&soatuple); @@ -1304,7 +1304,7 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) { xfrin_log(xfr, ISC_LOG_DEBUG(3), "got %s, retrying with AXFR", isc_result_totext(result)); try_axfr: - dns_message_destroy(&msg); + dns_message_detach(&msg); xfrin_reset(xfr); xfr->reqtype = dns_rdatatype_soa; xfr->state = XFRST_SOAQUERY; @@ -1464,7 +1464,7 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) { xfr->tsigctx = msg->tsigctx; msg->tsigctx = NULL; - dns_message_destroy(&msg); + dns_message_detach(&msg); switch (xfr->state) { case XFRST_GOTSOA: @@ -1510,7 +1510,7 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) { failure: if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } if (result != ISC_R_SUCCESS) { xfrin_fail(xfr, result, "failed while receiving responses"); diff --git a/lib/dns/zone.c b/lib/dns/zone.c index fc522a9074..267735ee5d 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -12182,7 +12182,7 @@ cleanup_key: dns_tsigkey_detach(&key); } cleanup_message: - dns_message_destroy(&message); + dns_message_detach(&message); cleanup: UNLOCK_ZONE(notify->zone); isc_event_free(&event); @@ -12761,7 +12761,7 @@ stub_callback(isc_task_t *task, isc_event_t *event) { ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_write); dns_db_detach(&stub->db); - dns_message_destroy(&msg); + dns_message_detach(&msg); isc_event_free(&event); dns_request_destroy(&zone->request); @@ -12786,7 +12786,7 @@ next_master: dns_db_detach(&stub->db); } if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } isc_event_free(&event); dns_request_destroy(&zone->request); @@ -12840,7 +12840,7 @@ next_master: same_master: if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } isc_event_free(&event); dns_request_destroy(&zone->request); @@ -13266,7 +13266,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { ns_query(zone, rdataset, NULL); } if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } } else if (isc_serial_eq(soa.serial, oldserial)) { isc_time_t expiretime; @@ -13305,13 +13305,13 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { goto next_master; } if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } goto detach; next_master: if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } isc_event_free(&event); dns_request_destroy(&zone->request); @@ -13370,7 +13370,7 @@ requeue: same_master: if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } isc_event_free(&event); dns_request_destroy(&zone->request); @@ -13469,7 +13469,7 @@ cleanup: dns_message_puttemprdataset(message, &qrdataset); } if (message != NULL) { - dns_message_destroy(&message); + dns_message_detach(&message); } return (result); } @@ -13699,7 +13699,7 @@ cleanup: DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH); } if (message != NULL) { - dns_message_destroy(&message); + dns_message_detach(&message); } if (cancel) { cancel_refresh(zone); @@ -13713,7 +13713,7 @@ skip_master: if (key != NULL) { dns_tsigkey_detach(&key); } - dns_message_destroy(&message); + dns_message_detach(&message); /* * Skip to next failed / untried master. */ @@ -13941,7 +13941,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { dns_result_totext(result)); goto cleanup; } - dns_message_destroy(&message); + dns_message_detach(&message); goto unlock; cleanup: @@ -13958,7 +13958,7 @@ cleanup: } isc_mem_put(stub->mctx, stub, sizeof(*stub)); if (message != NULL) { - dns_message_destroy(&message); + dns_message_detach(&message); } unlock: if (key != NULL) { @@ -14453,7 +14453,7 @@ cleanup: if (temprdataset != NULL) { dns_message_puttemprdataset(message, &temprdataset); } - dns_message_destroy(&message); + dns_message_detach(&message); return (result); } @@ -15294,7 +15294,7 @@ notify_done(isc_task_t *task, isc_event_t *event) { notify_destroy(notify, false); } if (message != NULL) { - dns_message_destroy(&message); + dns_message_detach(&message); } } @@ -17327,7 +17327,7 @@ forward_callback(isc_task_t *task, isc_event_t *event) { next_master: if (msg != NULL) { - dns_message_destroy(&msg); + dns_message_detach(&msg); } isc_event_free(&event); forward->which++; diff --git a/lib/ns/client.c b/lib/ns/client.c index 480928105b..021d19eec1 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -1581,7 +1581,7 @@ ns__client_put_cb(void *client0) { dns_message_puttemprdataset(client->message, &client->opt); } - dns_message_destroy(&client->message); + dns_message_detach(&client->message); /* * Detaching the task must be done after unlinking from @@ -2342,7 +2342,7 @@ cleanup: } if (client->message != NULL) { - dns_message_destroy(&client->message); + dns_message_detach(&client->message); } if (client->task != NULL) { diff --git a/lib/ns/tests/notify_test.c b/lib/ns/tests/notify_test.c index 88f9eccbcc..ce97dd9fdc 100644 --- a/lib/ns/tests/notify_test.c +++ b/lib/ns/tests/notify_test.c @@ -78,7 +78,7 @@ check_response(isc_buffer_t *buf) { assert_int_equal(message->rcode, dns_rcode_noerror); - dns_message_destroy(&message); + dns_message_detach(&message); } /* test ns_notify_start() */ @@ -126,7 +126,7 @@ notify_start(void **state) { * handler. */ if (client->message != NULL) { - dns_message_destroy(&client->message); + dns_message_detach(&client->message); } client->message = nmsg; nmsg = NULL; diff --git a/lib/ns/tests/nstest.c b/lib/ns/tests/nstest.c index 9b7d7e04e9..17989147b3 100644 --- a/lib/ns/tests/nstest.c +++ b/lib/ns/tests/nstest.c @@ -677,7 +677,7 @@ attach_query_msg_to_client(ns_client_t *client, const char *qnamestr, * Destroy the created message as it was rendered into "querybuf" and * the latter is all we are going to need from now on. */ - dns_message_destroy(&message); + dns_message_detach(&message); /* * Parse the rendered query, storing results in client->message. @@ -690,7 +690,7 @@ put_name: put_rdataset: dns_message_puttemprdataset(message, &qrdataset); destroy_message: - dns_message_destroy(&message); + dns_message_detach(&message); return (result); } @@ -829,7 +829,7 @@ ns_test_qctx_create(const ns_test_qctx_create_params_t *params, */ result = create_qctx_for_client(client, qctxp); if (result != ISC_R_SUCCESS) { - goto destroy_query; + goto detach_query; } /* @@ -842,8 +842,8 @@ ns_test_qctx_create(const ns_test_qctx_create_params_t *params, return (ISC_R_SUCCESS); -destroy_query: - dns_message_destroy(&client->message); +detach_query: + dns_message_detach(&client->message); detach_view: dns_view_detach(&client->view); detach_client: diff --git a/lib/ns/update.c b/lib/ns/update.c index ce424ca87f..54d67c114a 100644 --- a/lib/ns/update.c +++ b/lib/ns/update.c @@ -3596,7 +3596,7 @@ forward_done(isc_task_t *task, isc_event_t *event) { INSIST(client->nupdates > 0); client->nupdates--; ns_client_sendraw(client, uev->answer); - dns_message_destroy(&uev->answer); + dns_message_detach(&uev->answer); isc_event_free(&event); isc_nmhandle_detach(&client->updatehandle); } diff --git a/lib/ns/xfrout.c b/lib/ns/xfrout.c index 4bbb884ed2..3118e70942 100644 --- a/lib/ns/xfrout.c +++ b/lib/ns/xfrout.c @@ -1602,7 +1602,7 @@ failure: } if (tcpmsg != NULL) { - dns_message_destroy(&tcpmsg); + dns_message_detach(&tcpmsg); } if (cleanup_cctx) { diff --git a/lib/samples/nsprobe.c b/lib/samples/nsprobe.c index 0ecb6b0937..141d481bc0 100644 --- a/lib/samples/nsprobe.c +++ b/lib/samples/nsprobe.c @@ -1228,8 +1228,8 @@ main(int argc, char *argv[]) { /* Cleanup */ for (i = 0; i < MAX_PROBES; i++) { - dns_message_destroy(&probes[i].qmessage); - dns_message_destroy(&probes[i].rmessage); + dns_message_detach(&probes[i].qmessage); + dns_message_detach(&probes[i].rmessage); } isc_task_detach(&probe_task); dns_client_destroy(&client); diff --git a/lib/samples/sample-request.c b/lib/samples/sample-request.c index 07a63ae06a..af5ec1e2d9 100644 --- a/lib/samples/sample-request.c +++ b/lib/samples/sample-request.c @@ -113,7 +113,7 @@ cleanup: if (qrdataset != NULL) { dns_message_puttemprdataset(message, &qrdataset); } - dns_message_destroy(&message); + dns_message_detach(&message); return (result); } @@ -246,8 +246,8 @@ main(int argc, char *argv[]) { isc_buffer_free(&outputbuf); /* Cleanup */ - dns_message_destroy(&qmessage); - dns_message_destroy(&rmessage); + dns_message_detach(&qmessage); + dns_message_detach(&rmessage); isc_mem_destroy(&mctx); dns_client_destroy(&client); dns_lib_shutdown();