#define msgblock_get(block, type) \
((type *)msgblock_internalget(block, sizeof(type)))
+/*
+ * This function differs from public dns_message_puttemprdataset() that it
+ * requires the *rdatasetp to be associated, and it will disassociate and
+ * put it back to the memory pool.
+ */
+static void
+dns__message_putassociatedrdataset(dns_message_t *msg,
+ dns_rdataset_t **rdatasetp);
+
static void *
msgblock_internalget(dns_msgblock_t *, unsigned int);
next_rds = ISC_LIST_NEXT(rds, link);
ISC_LIST_UNLINK(name->list, rds, link);
- INSIST(dns_rdataset_isassociated(rds));
- dns_rdataset_disassociate(rds);
- isc_mempool_put(msg->rdspool, rds);
+ dns__message_putassociatedrdataset(msg, &rds);
rds = next_rds;
}
dns_message_puttempname(msg, &name);
dns_message_renderrelease(msg, msg->opt_reserved);
msg->opt_reserved = 0;
}
- INSIST(dns_rdataset_isassociated(msg->opt));
- dns_rdataset_disassociate(msg->opt);
- isc_mempool_put(msg->rdspool, msg->opt);
+ dns__message_putassociatedrdataset(msg, &msg->opt);
msg->opt = NULL;
msg->cc_ok = 0;
msg->cc_bad = 0;
INSIST(msg->querytsig == NULL);
msg->querytsig = msg->tsig;
} else {
- dns_rdataset_disassociate(msg->tsig);
- isc_mempool_put(msg->rdspool, msg->tsig);
+ dns__message_putassociatedrdataset(msg, &msg->tsig);
if (msg->querytsig != NULL) {
- dns_rdataset_disassociate(msg->querytsig);
- isc_mempool_put(msg->rdspool, msg->querytsig);
+ dns__message_putassociatedrdataset(
+ msg, &msg->querytsig);
}
}
dns_message_puttempname(msg, &msg->tsigname);
msg->tsig = NULL;
} else if (msg->querytsig != NULL && !replying) {
- dns_rdataset_disassociate(msg->querytsig);
- isc_mempool_put(msg->rdspool, msg->querytsig);
+ dns__message_putassociatedrdataset(msg, &msg->querytsig);
msg->querytsig = NULL;
}
if (msg->sig0 != NULL) {
- INSIST(dns_rdataset_isassociated(msg->sig0));
- dns_rdataset_disassociate(msg->sig0);
- isc_mempool_put(msg->rdspool, msg->sig0);
+ dns__message_putassociatedrdataset(msg, &msg->sig0);
msg->sig0 = NULL;
}
if (msg->sig0name != NULL) {
cleanup:
if (rdataset != NULL) {
- INSIST(!dns_rdataset_isassociated(rdataset));
- isc_mempool_put(msg->rdspool, rdataset);
+ dns_message_puttemprdataset(msg, &rdataset);
}
if (free_name) {
dns_message_puttempname(msg, &name);
dns_message_puttempname(msg, &name);
}
if (free_rdataset) {
- isc_mempool_put(msg->rdspool, rdataset);
+ dns__message_putassociatedrdataset(msg,
+ &rdataset);
}
free_name = free_rdataset = false;
}
dns_message_puttempname(msg, &name);
}
if (free_rdataset) {
- isc_mempool_put(msg->rdspool, rdataset);
+ dns__message_putassociatedrdataset(msg, &rdataset);
}
return (result);
*item = NULL;
}
+static void
+dns__message_putassociatedrdataset(dns_message_t *msg, dns_rdataset_t **item) {
+ dns_rdataset_disassociate(*item);
+ isc_mempool_put(msg->rdspool, *item);
+ *item = NULL;
+}
+
void
dns_message_puttemprdataset(dns_message_t *msg, dns_rdataset_t **item) {
REQUIRE(DNS_MESSAGE_VALID(msg));