Commit 0790cce439 for bind

commit 0790cce439065e28bcf280b910ab1a306c780c21
Author: OndÅ™ej Surý <ondrej@isc.org>
Date:   Wed Sep 16 22:32:25 2026 +0200

    Drop the mctx member from the rdata structs

    Since dns_rdata_tostruct() no longer allocates, the per-type structs
    never own any memory: every pointer in them aliases the wire-format
    rdata they were converted from.  The mctx member, the dup-or-clone
    helpers, and the bodies of all the freestruct callbacks were dead, so
    remove them together with the mctx parameter of the KEYDATA<->DNSKEY
    conversion helpers, which only ever received NULL.

    The string-like members of HINFO, GPOS, ISDN and NAPTR become
    unsigned char * to match the wire data they now point into.  The TKEY
    processing code was the one place that used the struct's mctx for a
    real allocation; it now uses the message's context explicitly.

diff --git a/bin/delv/delv.c b/bin/delv/delv.c
index 0436fbfcd1..b5d12f122b 100644
--- a/bin/delv/delv.c
+++ b/bin/delv/delv.c
@@ -705,7 +705,6 @@ key_fromconfig(const cfg_obj_t *key, dns_client_t *client, dns_view_t *toview) {
 	case TRUSTED:
 		dnskey.common.rdclass = dns_rdataclass_in;
 		dnskey.common.rdtype = dns_rdatatype_dnskey;
-		dnskey.mctx = NULL;

 		dnskey.flags = (uint16_t)rdata1;
 		dnskey.protocol = (uint8_t)rdata2;
@@ -734,7 +733,6 @@ key_fromconfig(const cfg_obj_t *key, dns_client_t *client, dns_view_t *toview) {
 	case STATIC_DS:
 		ds.common.rdclass = dns_rdataclass_in;
 		ds.common.rdtype = dns_rdatatype_ds;
-		ds.mctx = NULL;

 		ds.key_tag = (uint16_t)rdata1;
 		ds.algorithm = (uint8_t)rdata2;
diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c
index 3c73dd4b62..2f0985bd49 100644
--- a/bin/dig/dighost.c
+++ b/bin/dig/dighost.c
@@ -2010,7 +2010,6 @@ insert_soa(dig_lookup_t *lookup) {
 	dns_name_t *soaname = NULL;

 	debug("insert_soa()");
-	soa.mctx = isc_g_mctx;
 	soa.serial = lookup->ixfr_serial;
 	soa.refresh = 0;
 	soa.retry = 0;
diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c
index 8ef0cca1b8..58a5b29f41 100644
--- a/bin/dnssec/dnssec-signzone.c
+++ b/bin/dnssec/dnssec-signzone.c
@@ -1959,7 +1959,6 @@ addnsec3param(const unsigned char *salt, size_t salt_len,

 	nsec3param.common.rdclass = gclass;
 	nsec3param.common.rdtype = dns_rdatatype_nsec3param;
-	nsec3param.mctx = NULL;
 	nsec3param.flags = 0;
 	nsec3param.hash = unknownalg ? DNS_NSEC3_UNKNOWNALG : dns_hash_sha1;
 	nsec3param.iterations = iterations;
diff --git a/bin/named/server.c b/bin/named/server.c
index aba3b7d63e..73413a4e2e 100644
--- a/bin/named/server.c
+++ b/bin/named/server.c
@@ -705,8 +705,6 @@ ta_fromconfig(const cfg_obj_t *key, bool *initialp, const char **namestrp,
 		/*
 		 * The key data in keystruct is not dynamically allocated.
 		 */
-		keystruct.mctx = NULL;
-
 		if (rdata1 > 0xffff) {
 			CHECKM(ISC_R_RANGE, "key flags");
 		}
@@ -3017,7 +3015,6 @@ add_ns(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,

 	ns.common.rdtype = dns_rdatatype_ns;
 	ns.common.rdclass = dns_db_class(db);
-	ns.mctx = NULL;
 	dns_name_init(&ns.name);
 	dns_name_clone(nsname, &ns.name);
 	CHECK(dns_rdata_fromstruct(&rdata, dns_db_class(db), dns_rdatatype_ns,
diff --git a/bin/plugins/synthrecord.c b/bin/plugins/synthrecord.c
index 9001d8f3be..dbc90b6744 100644
--- a/bin/plugins/synthrecord.c
+++ b/bin/plugins/synthrecord.c
@@ -373,7 +373,7 @@ synthrecord_reverse(synthrecord_t *inst, query_ctx_t *qctx,
 	}

 	synthptrdata = (dns_rdata_ptr_t){
-		.mctx = qctx->client->inner.view->mctx, .ptr = aname
+		.ptr = aname,
 	};
 	DNS_RDATACOMMON_INIT(&synthptrdata, dns_rdatatype_ptr,
 			     dns_rdataclass_in);
diff --git a/bin/tests/system/dyndb/driver/db.c b/bin/tests/system/dyndb/driver/db.c
index 3c356334a2..aaf8a2e797 100644
--- a/bin/tests/system/dyndb/driver/db.c
+++ b/bin/tests/system/dyndb/driver/db.c
@@ -440,7 +440,6 @@ add_ns(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,
 	dns_rdatalist_init(&rdatalist);
 	ns.common.rdtype = dns_rdatatype_ns;
 	ns.common.rdclass = dns_db_class(db);
-	ns.mctx = NULL;
 	dns_name_init(&ns.name);
 	dns_name_clone(nsname, &ns.name);
 	CHECK(dns_rdata_fromstruct(&rdata, dns_db_class(db), dns_rdatatype_ns,
diff --git a/doc/dev/dev.md b/doc/dev/dev.md
index ac083cc357..8a9773642c 100644
--- a/doc/dev/dev.md
+++ b/doc/dev/dev.md
@@ -1228,17 +1228,15 @@ wrapper around `memcmp()`.
 `tostruct()`, below) and turns it into a record in wire format.

         static isc_result_t
-        tostruct[_<class>]_<type>(dns_rdata_t *rdata, void *target,
-                                  isc_mem_t *mctx);
+        tostruct[_<class>]_<type>(const dns_rdata_t *rdata, void *target);

 "tostruct" take a record in wire format and breaks it down into
 a type-specific C structure defined in the header file.  The name of this
 structure is `dns_rdata_<type>[_<class>]_t`; the first element of
 the structure must be `"dns_rdatacommon_t common;"`.
-If no memory context is passed in, then the caller will preserve the
-contents of the record in wire form until the structure is freed or no
-longer in use.  If a memory context is passed, in then memory should
-be allocated for anything not directly part of the structure.
+The structure does not own any memory: its pointers refer directly
+into the wire-format record, so the caller must preserve the record
+for as long as the structure is in use.

         static void
         freestruct[_<class>]_<type>(void *source);
diff --git a/lib/dns/dnssec.c b/lib/dns/dnssec.c
index a0171cca5b..9b3bfcc897 100644
--- a/lib/dns/dnssec.c
+++ b/lib/dns/dnssec.c
@@ -234,7 +234,6 @@ dns_dnssec_sign(const dns_name_t *name, dns_rdataset_t *set, dst_key_t *key,
 		return DNS_R_INVALIDTIME;
 	}

-	sig.mctx = mctx;
 	sig.common.rdclass = set->rdclass;
 	sig.common.rdtype = dns_rdatatype_rrsig;

@@ -822,7 +821,6 @@ dns_dnssec_signmessage(dns_message_t *msg, dst_key_t *key) {

 	memset(&sig, 0, sizeof(sig));

-	sig.mctx = mctx;
 	sig.common.rdclass = dns_rdataclass_any;
 	sig.common.rdtype = dns_rdatatype_sig; /* SIG(0) */

diff --git a/lib/dns/ds.c b/lib/dns/ds.c
index e1896c1990..e3a0b429b0 100644
--- a/lib/dns/ds.c
+++ b/lib/dns/ds.c
@@ -163,7 +163,6 @@ dns_ds_fromkeyrdata(const dns_name_t *owner, dns_rdata_t *key,
 		goto end;
 	}

-	dsrdata->mctx = NULL;
 	dsrdata->common.rdclass = key->rdclass;
 	dsrdata->common.rdtype = dns_rdatatype_ds;
 	dsrdata->algorithm = r.base[3];
diff --git a/lib/dns/gen.c b/lib/dns/gen.c
index 19789eb393..bca02e7028 100644
--- a/lib/dns/gen.c
+++ b/lib/dns/gen.c
@@ -66,7 +66,7 @@
 #define FROMSTRUCTTYPE	"type"
 #define FROMSTRUCTDEF	"use_default = true"

-#define TOSTRUCTARGS  "rdata, target, mctx"
+#define TOSTRUCTARGS  "rdata, target"
 #define TOSTRUCTCLASS "rdata->rdclass"
 #define TOSTRUCTTYPE  "rdata->type"
 #define TOSTRUCTDEF   "use_default = true"
diff --git a/lib/dns/include/dns/keydata.h b/lib/dns/include/dns/keydata.h
index 8456a451e4..12418a4033 100644
--- a/lib/dns/include/dns/keydata.h
+++ b/lib/dns/include/dns/keydata.h
@@ -34,10 +34,8 @@
 #include <dns/types.h>

 isc_result_t
-dns_keydata_todnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey,
-		     isc_mem_t *mctx);
+dns_keydata_todnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey);

 isc_result_t
 dns_keydata_fromdnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey,
-		       uint32_t refresh, uint32_t addhd, uint32_t removehd,
-		       isc_mem_t *mctx);
+		       uint32_t refresh, uint32_t addhd, uint32_t removehd);
diff --git a/lib/dns/keydata.c b/lib/dns/keydata.c
index 7dde94a283..e0d0670075 100644
--- a/lib/dns/keydata.c
+++ b/lib/dns/keydata.c
@@ -25,38 +25,29 @@
 #include <dns/rdatastruct.h>

 isc_result_t
-dns_keydata_todnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey,
-		     isc_mem_t *mctx) {
+dns_keydata_todnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey) {
 	REQUIRE(keydata != NULL && dnskey != NULL);

 	dnskey->common.rdtype = dns_rdatatype_dnskey;
 	dnskey->common.rdclass = keydata->common.rdclass;
-	dnskey->mctx = mctx;
 	dnskey->flags = keydata->flags;
 	dnskey->protocol = keydata->protocol;
 	dnskey->algorithm = keydata->algorithm;

 	dnskey->datalen = keydata->datalen;

-	if (mctx == NULL) {
-		dnskey->data = keydata->data;
-	} else {
-		dnskey->data = isc_mem_allocate(mctx, dnskey->datalen);
-		memmove(dnskey->data, keydata->data, dnskey->datalen);
-	}
+	dnskey->data = keydata->data;

 	return ISC_R_SUCCESS;
 }

 isc_result_t
 dns_keydata_fromdnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey,
-		       uint32_t refresh, uint32_t addhd, uint32_t removehd,
-		       isc_mem_t *mctx) {
+		       uint32_t refresh, uint32_t addhd, uint32_t removehd) {
 	REQUIRE(keydata != NULL && dnskey != NULL);

 	keydata->common.rdtype = dns_rdatatype_keydata;
 	keydata->common.rdclass = dnskey->common.rdclass;
-	keydata->mctx = mctx;
 	keydata->refresh = refresh;
 	keydata->addhd = addhd;
 	keydata->removehd = removehd;
@@ -65,12 +56,7 @@ dns_keydata_fromdnskey(dns_rdata_keydata_t *keydata, dns_rdata_dnskey_t *dnskey,
 	keydata->algorithm = dnskey->algorithm;

 	keydata->datalen = dnskey->datalen;
-	if (mctx == NULL) {
-		keydata->data = dnskey->data;
-	} else {
-		keydata->data = isc_mem_allocate(mctx, keydata->datalen);
-		memmove(keydata->data, dnskey->data, keydata->datalen);
-	}
+	keydata->data = dnskey->data;

 	return ISC_R_SUCCESS;
 }
diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c
index 32b73d82e8..43ac5a6e29 100644
--- a/lib/dns/rdata.c
+++ b/lib/dns/rdata.c
@@ -104,9 +104,9 @@

 #define CALL_FROMSTRUCT rdclass, type, source, target

-#define ARGS_TOSTRUCT const dns_rdata_t *rdata, void *target, isc_mem_t *mctx
+#define ARGS_TOSTRUCT const dns_rdata_t *rdata, void *target

-#define CALL_TOSTRUCT rdata, target, mctx
+#define CALL_TOSTRUCT rdata, target

 #define ARGS_FREESTRUCT void *source

@@ -389,31 +389,6 @@ locator_pton(const char *src, unsigned char *dst) {
 	return 1;
 }

-static void
-name_duporclone(const dns_name_t *source, isc_mem_t *mctx, dns_name_t *target) {
-	if (mctx != NULL) {
-		dns_name_dup(source, mctx, target);
-	} else {
-		dns_name_clone(source, target);
-	}
-}
-
-static void *
-mem_maybedup(isc_mem_t *mctx, void *source, size_t length) {
-	void *copy = NULL;
-
-	REQUIRE(source != NULL);
-
-	if (mctx == NULL) {
-		return source;
-	}
-
-	copy = isc_mem_allocate(mctx, length);
-	memmove(copy, source, length);
-
-	return copy;
-}
-
 static isc_result_t
 typemap_fromtext(isc_lex_t *lexer, isc_buffer_t *target, bool allow_empty) {
 	isc_token_t token;
@@ -1414,7 +1389,6 @@ isc_result_t
 dns_rdata_tostruct(const dns_rdata_t *rdata, void *target) {
 	isc_result_t result = ISC_R_NOTIMPLEMENTED;
 	bool use_default = false;
-	isc_mem_t *mctx = NULL; /* Intentionally NULL */

 	REQUIRE(rdata != NULL);
 	REQUIRE(DNS_RDATA_VALIDFLAGS(rdata));
diff --git a/lib/dns/rdata/any_255/tsig_250.c b/lib/dns/rdata/any_255/tsig_250.c
index 2428ca26ff..83632bee41 100644
--- a/lib/dns/rdata/any_255/tsig_250.c
+++ b/lib/dns/rdata/any_255/tsig_250.c
@@ -461,7 +461,7 @@ tostruct_any_tsig(ARGS_TOSTRUCT) {
 	dns_name_init(&alg);
 	dns_name_fromregion(&alg, &sr);
 	dns_name_init(&tsig->algorithm);
-	name_duporclone(&alg, mctx, &tsig->algorithm);
+	dns_name_clone(&alg, &tsig->algorithm);

 	isc_region_consume(&sr, name_length(&tsig->algorithm));

@@ -492,7 +492,7 @@ tostruct_any_tsig(ARGS_TOSTRUCT) {
 	 * Signature.
 	 */
 	INSIST(sr.length >= tsig->siglen);
-	tsig->signature = mem_maybedup(mctx, sr.base, tsig->siglen);
+	tsig->signature = sr.base;
 	isc_region_consume(&sr, tsig->siglen);

 	/*
@@ -517,9 +517,8 @@ tostruct_any_tsig(ARGS_TOSTRUCT) {
 	 * Other.
 	 */
 	INSIST(sr.length == tsig->otherlen);
-	tsig->other = mem_maybedup(mctx, sr.base, tsig->otherlen);
+	tsig->other = sr.base;

-	tsig->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -530,19 +529,6 @@ freestruct_any_tsig(ARGS_FREESTRUCT) {
 	REQUIRE(tsig != NULL);
 	REQUIRE(tsig->common.rdtype == dns_rdatatype_tsig);
 	REQUIRE(tsig->common.rdclass == dns_rdataclass_any);
-
-	if (tsig->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&tsig->algorithm, tsig->mctx);
-	if (tsig->signature != NULL) {
-		isc_mem_free(tsig->mctx, tsig->signature);
-	}
-	if (tsig->other != NULL) {
-		isc_mem_free(tsig->mctx, tsig->other);
-	}
-	tsig->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/any_255/tsig_250.h b/lib/dns/rdata/any_255/tsig_250.h
index ca7806e880..5273e5e8bf 100644
--- a/lib/dns/rdata/any_255/tsig_250.h
+++ b/lib/dns/rdata/any_255/tsig_250.h
@@ -16,7 +16,6 @@
 /*% RFC2845 */
 typedef struct dns_rdata_any_tsig {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t algorithm;
 	uint64_t timesigned;
 	uint16_t fudge;
diff --git a/lib/dns/rdata/ch_3/a_1.c b/lib/dns/rdata/ch_3/a_1.c
index 8a4d7d2833..5ab93c22b5 100644
--- a/lib/dns/rdata/ch_3/a_1.c
+++ b/lib/dns/rdata/ch_3/a_1.c
@@ -235,9 +235,8 @@ tostruct_ch_a(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, name_length(&name));

 	dns_name_init(&a->ch_addr_dom);
-	name_duporclone(&name, mctx, &a->ch_addr_dom);
+	dns_name_clone(&name, &a->ch_addr_dom);
 	a->ch_addr = htons(uint16_fromregion(&region));
-	a->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -247,13 +246,6 @@ freestruct_ch_a(ARGS_FREESTRUCT) {

 	REQUIRE(a != NULL);
 	REQUIRE(a->common.rdtype == dns_rdatatype_a);
-
-	if (a->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&a->ch_addr_dom, a->mctx);
-	a->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/ch_3/a_1.h b/lib/dns/rdata/ch_3/a_1.h
index 4ac616916c..ed1ea1f659 100644
--- a/lib/dns/rdata/ch_3/a_1.h
+++ b/lib/dns/rdata/ch_3/a_1.h
@@ -20,7 +20,6 @@ typedef uint16_t ch_addr_t;

 typedef struct dns_rdata_ch_a {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t ch_addr_dom; /* ch-addr domain for back mapping
 				 * */
 	ch_addr_t ch_addr;	/* chaos address (16 bit) network
diff --git a/lib/dns/rdata/generic/afsdb_18.c b/lib/dns/rdata/generic/afsdb_18.c
index bdd54d5d37..6fcaf22800 100644
--- a/lib/dns/rdata/generic/afsdb_18.c
+++ b/lib/dns/rdata/generic/afsdb_18.c
@@ -223,8 +223,7 @@ tostruct_afsdb(ARGS_TOSTRUCT) {
 	dns_name_init(&name);
 	dns_name_fromregion(&name, &region);

-	name_duporclone(&name, mctx, &afsdb->server);
-	afsdb->mctx = mctx;
+	dns_name_clone(&name, &afsdb->server);
 	return ISC_R_SUCCESS;
 }

@@ -234,13 +233,6 @@ freestruct_afsdb(ARGS_FREESTRUCT) {

 	REQUIRE(afsdb != NULL);
 	REQUIRE(afsdb->common.rdtype == dns_rdatatype_afsdb);
-
-	if (afsdb->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&afsdb->server, afsdb->mctx);
-	afsdb->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/afsdb_18.h b/lib/dns/rdata/generic/afsdb_18.h
index 16b390cb15..1179362731 100644
--- a/lib/dns/rdata/generic/afsdb_18.h
+++ b/lib/dns/rdata/generic/afsdb_18.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_afsdb {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t subtype;
 	dns_name_t server;
 } dns_rdata_afsdb_t;
diff --git a/lib/dns/rdata/generic/amtrelay_260.c b/lib/dns/rdata/generic/amtrelay_260.c
index 0adec2ff84..8429d81cd1 100644
--- a/lib/dns/rdata/generic/amtrelay_260.c
+++ b/lib/dns/rdata/generic/amtrelay_260.c
@@ -344,18 +344,16 @@ tostruct_amtrelay(ARGS_TOSTRUCT) {

 	case 3:
 		dns_name_fromregion(&name, &region);
-		name_duporclone(&name, mctx, &amtrelay->gateway);
+		dns_name_clone(&name, &amtrelay->gateway);
 		isc_region_consume(&region, name_length(&name));
 		break;

 	default:
 		if (region.length != 0) {
-			amtrelay->data = mem_maybedup(mctx, region.base,
-						      region.length);
+			amtrelay->data = region.base;
 		}
 		amtrelay->length = region.length;
 	}
-	amtrelay->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -365,20 +363,6 @@ freestruct_amtrelay(ARGS_FREESTRUCT) {

 	REQUIRE(amtrelay != NULL);
 	REQUIRE(amtrelay->common.rdtype == dns_rdatatype_amtrelay);
-
-	if (amtrelay->mctx == NULL) {
-		return;
-	}
-
-	if (amtrelay->gateway_type == 3) {
-		dns_name_free(&amtrelay->gateway, amtrelay->mctx);
-	}
-
-	if (amtrelay->data != NULL) {
-		isc_mem_free(amtrelay->mctx, amtrelay->data);
-	}
-
-	amtrelay->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/amtrelay_260.h b/lib/dns/rdata/generic/amtrelay_260.h
index 8680c358a5..ac11651d20 100644
--- a/lib/dns/rdata/generic/amtrelay_260.h
+++ b/lib/dns/rdata/generic/amtrelay_260.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_amtrelay {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint8_t precedence;
 	bool discovery;
 	uint8_t gateway_type;
diff --git a/lib/dns/rdata/generic/avc_258.h b/lib/dns/rdata/generic/avc_258.h
index b3128a87ff..5bbddc7057 100644
--- a/lib/dns/rdata/generic/avc_258.h
+++ b/lib/dns/rdata/generic/avc_258.h
@@ -17,7 +17,6 @@ typedef dns_rdata_txt_string_t dns_rdata_avc_string_t;

 typedef struct dns_rdata_avc {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *data;
 	uint16_t length;
 	/* private */
diff --git a/lib/dns/rdata/generic/brid_68.c b/lib/dns/rdata/generic/brid_68.c
index cf8b50fba0..c716fac019 100644
--- a/lib/dns/rdata/generic/brid_68.c
+++ b/lib/dns/rdata/generic/brid_68.c
@@ -136,8 +136,7 @@ tostruct_brid(ARGS_TOSTRUCT) {

 	/* Data */
 	brid->datalen = sr.length;
-	brid->data = mem_maybedup(mctx, sr.base, brid->datalen);
-	brid->mctx = mctx;
+	brid->data = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -147,15 +146,6 @@ freestruct_brid(ARGS_FREESTRUCT) {

 	REQUIRE(brid != NULL);
 	REQUIRE(brid->common.rdtype == dns_rdatatype_brid);
-
-	if (brid->mctx == NULL) {
-		return;
-	}
-
-	if (brid->data != NULL) {
-		isc_mem_free(brid->mctx, brid->data);
-	}
-	brid->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/brid_68.h b/lib/dns/rdata/generic/brid_68.h
index 41caa0b4aa..6fc60e14cc 100644
--- a/lib/dns/rdata/generic/brid_68.h
+++ b/lib/dns/rdata/generic/brid_68.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_brid_t {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t datalen;
 	unsigned char *data;
 } dns_rdata_brid_t;
diff --git a/lib/dns/rdata/generic/caa_257.c b/lib/dns/rdata/generic/caa_257.c
index e1381b31a9..49489eb57d 100644
--- a/lib/dns/rdata/generic/caa_257.c
+++ b/lib/dns/rdata/generic/caa_257.c
@@ -518,16 +518,15 @@ tostruct_caa(ARGS_TOSTRUCT) {
 	 * Tag
 	 */
 	INSIST(sr.length >= caa->tag_len);
-	caa->tag = mem_maybedup(mctx, sr.base, caa->tag_len);
+	caa->tag = sr.base;
 	isc_region_consume(&sr, caa->tag_len);

 	/*
 	 * Value
 	 */
 	caa->value_len = sr.length;
-	caa->value = mem_maybedup(mctx, sr.base, sr.length);
+	caa->value = sr.base;

-	caa->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -537,18 +536,6 @@ freestruct_caa(ARGS_FREESTRUCT) {

 	REQUIRE(caa != NULL);
 	REQUIRE(caa->common.rdtype == dns_rdatatype_caa);
-
-	if (caa->mctx == NULL) {
-		return;
-	}
-
-	if (caa->tag != NULL) {
-		isc_mem_free(caa->mctx, caa->tag);
-	}
-	if (caa->value != NULL) {
-		isc_mem_free(caa->mctx, caa->value);
-	}
-	caa->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/caa_257.h b/lib/dns/rdata/generic/caa_257.h
index f5f348dcb1..a9bfcb2b77 100644
--- a/lib/dns/rdata/generic/caa_257.h
+++ b/lib/dns/rdata/generic/caa_257.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_caa {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint8_t flags;
 	unsigned char *tag;
 	uint8_t tag_len;
diff --git a/lib/dns/rdata/generic/cds_59.c b/lib/dns/rdata/generic/cds_59.c
index d1ededbe4a..15bb21c4f5 100644
--- a/lib/dns/rdata/generic/cds_59.c
+++ b/lib/dns/rdata/generic/cds_59.c
@@ -100,15 +100,6 @@ freestruct_cds(ARGS_FREESTRUCT) {

 	REQUIRE(cds != NULL);
 	REQUIRE(cds->common.rdtype == dns_rdatatype_cds);
-
-	if (cds->mctx == NULL) {
-		return;
-	}
-
-	if (cds->digest != NULL) {
-		isc_mem_free(cds->mctx, cds->digest);
-	}
-	cds->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/cert_37.c b/lib/dns/rdata/generic/cert_37.c
index d901f44b63..6a8abbeeae 100644
--- a/lib/dns/rdata/generic/cert_37.c
+++ b/lib/dns/rdata/generic/cert_37.c
@@ -203,8 +203,7 @@ tostruct_cert(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 1);
 	cert->length = region.length;

-	cert->certificate = mem_maybedup(mctx, region.base, region.length);
-	cert->mctx = mctx;
+	cert->certificate = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -214,15 +213,6 @@ freestruct_cert(ARGS_FREESTRUCT) {

 	REQUIRE(cert != NULL);
 	REQUIRE(cert->common.rdtype == dns_rdatatype_cert);
-
-	if (cert->mctx == NULL) {
-		return;
-	}
-
-	if (cert->certificate != NULL) {
-		isc_mem_free(cert->mctx, cert->certificate);
-	}
-	cert->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/cert_37.h b/lib/dns/rdata/generic/cert_37.h
index a905a2bb9a..ed72835883 100644
--- a/lib/dns/rdata/generic/cert_37.h
+++ b/lib/dns/rdata/generic/cert_37.h
@@ -16,7 +16,6 @@
 /*% RFC2538 */
 typedef struct dns_rdata_cert {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t type;
 	uint16_t key_tag;
 	uint8_t algorithm;
diff --git a/lib/dns/rdata/generic/cname_5.c b/lib/dns/rdata/generic/cname_5.c
index 57554ca978..9a670bf6bc 100644
--- a/lib/dns/rdata/generic/cname_5.c
+++ b/lib/dns/rdata/generic/cname_5.c
@@ -150,8 +150,7 @@ tostruct_cname(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&cname->cname);
-	name_duporclone(&name, mctx, &cname->cname);
-	cname->mctx = mctx;
+	dns_name_clone(&name, &cname->cname);
 	return ISC_R_SUCCESS;
 }

@@ -160,13 +159,6 @@ freestruct_cname(ARGS_FREESTRUCT) {
 	dns_rdata_cname_t *cname = source;

 	REQUIRE(cname != NULL);
-
-	if (cname->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&cname->cname, cname->mctx);
-	cname->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/cname_5.h b/lib/dns/rdata/generic/cname_5.h
index 1525fa0d8c..02e8453824 100644
--- a/lib/dns/rdata/generic/cname_5.h
+++ b/lib/dns/rdata/generic/cname_5.h
@@ -15,6 +15,5 @@

 typedef struct dns_rdata_cname {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t cname;
 } dns_rdata_cname_t;
diff --git a/lib/dns/rdata/generic/csync_62.c b/lib/dns/rdata/generic/csync_62.c
index 10557aade7..77e34d56f3 100644
--- a/lib/dns/rdata/generic/csync_62.c
+++ b/lib/dns/rdata/generic/csync_62.c
@@ -179,8 +179,7 @@ tostruct_csync(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 2);

 	csync->len = region.length;
-	csync->typebits = mem_maybedup(mctx, region.base, region.length);
-	csync->mctx = mctx;
+	csync->typebits = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -190,15 +189,6 @@ freestruct_csync(ARGS_FREESTRUCT) {

 	REQUIRE(csync != NULL);
 	REQUIRE(csync->common.rdtype == dns_rdatatype_csync);
-
-	if (csync->mctx == NULL) {
-		return;
-	}
-
-	if (csync->typebits != NULL) {
-		isc_mem_free(csync->mctx, csync->typebits);
-	}
-	csync->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/csync_62.h b/lib/dns/rdata/generic/csync_62.h
index a7b3c1ee10..11d5dfb51f 100644
--- a/lib/dns/rdata/generic/csync_62.h
+++ b/lib/dns/rdata/generic/csync_62.h
@@ -19,7 +19,6 @@

 typedef struct dns_rdata_csync {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint32_t serial;
 	uint16_t flags;
 	unsigned char *typebits;
diff --git a/lib/dns/rdata/generic/dlv_32769.c b/lib/dns/rdata/generic/dlv_32769.c
index 8a0e7727e9..30f825ba86 100644
--- a/lib/dns/rdata/generic/dlv_32769.c
+++ b/lib/dns/rdata/generic/dlv_32769.c
@@ -96,15 +96,6 @@ freestruct_dlv(ARGS_FREESTRUCT) {

 	REQUIRE(dlv != NULL);
 	REQUIRE(dlv->common.rdtype == dns_rdatatype_dlv);
-
-	if (dlv->mctx == NULL) {
-		return;
-	}
-
-	if (dlv->digest != NULL) {
-		isc_mem_free(dlv->mctx, dlv->digest);
-	}
-	dlv->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/dname_39.c b/lib/dns/rdata/generic/dname_39.c
index 3254f3502c..7606e1a85b 100644
--- a/lib/dns/rdata/generic/dname_39.c
+++ b/lib/dns/rdata/generic/dname_39.c
@@ -150,8 +150,7 @@ tostruct_dname(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&dname->dname);
-	name_duporclone(&name, mctx, &dname->dname);
-	dname->mctx = mctx;
+	dns_name_clone(&name, &dname->dname);
 	return ISC_R_SUCCESS;
 }

@@ -161,13 +160,6 @@ freestruct_dname(ARGS_FREESTRUCT) {

 	REQUIRE(dname != NULL);
 	REQUIRE(dname->common.rdtype == dns_rdatatype_dname);
-
-	if (dname->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&dname->dname, dname->mctx);
-	dname->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/dname_39.h b/lib/dns/rdata/generic/dname_39.h
index 14c71fb0f7..9fe64d616b 100644
--- a/lib/dns/rdata/generic/dname_39.h
+++ b/lib/dns/rdata/generic/dname_39.h
@@ -18,6 +18,5 @@

 typedef struct dns_rdata_dname {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t dname;
 } dns_rdata_dname_t;
diff --git a/lib/dns/rdata/generic/doa_259.c b/lib/dns/rdata/generic/doa_259.c
index 1398c782b6..cd54856b7a 100644
--- a/lib/dns/rdata/generic/doa_259.c
+++ b/lib/dns/rdata/generic/doa_259.c
@@ -242,7 +242,7 @@ tostruct_doa(ARGS_TOSTRUCT) {
 	doa->mediatype_len = uint8_fromregion(&region);
 	isc_region_consume(&region, 1);
 	INSIST(doa->mediatype_len <= region.length);
-	doa->mediatype = mem_maybedup(mctx, region.base, doa->mediatype_len);
+	doa->mediatype = region.base;
 	isc_region_consume(&region, doa->mediatype_len);

 	/*
@@ -251,12 +251,10 @@ tostruct_doa(ARGS_TOSTRUCT) {
 	doa->data_len = region.length;
 	doa->data = NULL;
 	if (doa->data_len > 0) {
-		doa->data = mem_maybedup(mctx, region.base, doa->data_len);
+		doa->data = region.base;
 		isc_region_consume(&region, doa->data_len);
 	}

-	doa->mctx = mctx;
-
 	return ISC_R_SUCCESS;
 }

@@ -266,19 +264,6 @@ freestruct_doa(ARGS_FREESTRUCT) {

 	REQUIRE(doa != NULL);
 	REQUIRE(doa->common.rdtype == dns_rdatatype_doa);
-
-	if (doa->mctx == NULL) {
-		return;
-	}
-
-	if (doa->mediatype != NULL) {
-		isc_mem_free(doa->mctx, doa->mediatype);
-	}
-	if (doa->data != NULL) {
-		isc_mem_free(doa->mctx, doa->data);
-	}
-
-	doa->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/doa_259.h b/lib/dns/rdata/generic/doa_259.h
index 320bd7a0ce..68caeef96d 100644
--- a/lib/dns/rdata/generic/doa_259.h
+++ b/lib/dns/rdata/generic/doa_259.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_doa {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *mediatype;
 	unsigned char *data;
 	uint32_t enterprise;
diff --git a/lib/dns/rdata/generic/ds_43.c b/lib/dns/rdata/generic/ds_43.c
index d98b26434d..7f183c7e79 100644
--- a/lib/dns/rdata/generic/ds_43.c
+++ b/lib/dns/rdata/generic/ds_43.c
@@ -290,8 +290,7 @@ generic_tostruct_ds(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 1);
 	ds->length = region.length;

-	ds->digest = mem_maybedup(mctx, region.base, region.length);
-	ds->mctx = mctx;
+	ds->digest = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -313,15 +312,6 @@ freestruct_ds(ARGS_FREESTRUCT) {

 	REQUIRE(ds != NULL);
 	REQUIRE(ds->common.rdtype == dns_rdatatype_ds);
-
-	if (ds->mctx == NULL) {
-		return;
-	}
-
-	if (ds->digest != NULL) {
-		isc_mem_free(ds->mctx, ds->digest);
-	}
-	ds->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/ds_43.h b/lib/dns/rdata/generic/ds_43.h
index 57e8494c36..5b5e06c6ba 100644
--- a/lib/dns/rdata/generic/ds_43.h
+++ b/lib/dns/rdata/generic/ds_43.h
@@ -17,7 +17,6 @@
  *  \brief per draft-ietf-dnsext-delegation-signer-05.txt */
 typedef struct dns_rdata_ds {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t key_tag;
 	dns_secalg_t algorithm;
 	dns_dsdigest_t digest_type;
diff --git a/lib/dns/rdata/generic/dsync_66.c b/lib/dns/rdata/generic/dsync_66.c
index 2056a7260c..cc49171648 100644
--- a/lib/dns/rdata/generic/dsync_66.c
+++ b/lib/dns/rdata/generic/dsync_66.c
@@ -266,8 +266,7 @@ tostruct_dsync(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 2);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&dsync->target);
-	name_duporclone(&name, mctx, &dsync->target);
-	dsync->mctx = mctx;
+	dns_name_clone(&name, &dsync->target);
 	return ISC_R_SUCCESS;
 }

@@ -277,13 +276,6 @@ freestruct_dsync(ARGS_FREESTRUCT) {

 	REQUIRE(dsync != NULL);
 	REQUIRE(dsync->common.rdtype == dns_rdatatype_dsync);
-
-	if (dsync->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&dsync->target, dsync->mctx);
-	dsync->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/dsync_66.h b/lib/dns/rdata/generic/dsync_66.h
index 4ec9eec2ab..a1bd3c84b5 100644
--- a/lib/dns/rdata/generic/dsync_66.h
+++ b/lib/dns/rdata/generic/dsync_66.h
@@ -16,7 +16,6 @@

 typedef struct dns_rdata_dsync {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t type;
 	uint8_t scheme;
 	uint16_t port;
diff --git a/lib/dns/rdata/generic/eui48_108.c b/lib/dns/rdata/generic/eui48_108.c
index 004c6aafc1..bd53015d55 100644
--- a/lib/dns/rdata/generic/eui48_108.c
+++ b/lib/dns/rdata/generic/eui48_108.c
@@ -145,8 +145,6 @@ tostruct_eui48(ARGS_TOSTRUCT) {
 	REQUIRE(eui48 != NULL);
 	REQUIRE(rdata->length == 6);

-	UNUSED(mctx);
-
 	DNS_RDATACOMMON_INIT(eui48, rdata->type, rdata->rdclass);

 	memmove(eui48->eui48, rdata->data, rdata->length);
diff --git a/lib/dns/rdata/generic/eui64_109.c b/lib/dns/rdata/generic/eui64_109.c
index eafbfbb115..124100b7f1 100644
--- a/lib/dns/rdata/generic/eui64_109.c
+++ b/lib/dns/rdata/generic/eui64_109.c
@@ -149,8 +149,6 @@ tostruct_eui64(ARGS_TOSTRUCT) {
 	REQUIRE(eui64 != NULL);
 	REQUIRE(rdata->length == 8);

-	UNUSED(mctx);
-
 	DNS_RDATACOMMON_INIT(eui64, rdata->type, rdata->rdclass);

 	memmove(eui64->eui64, rdata->data, rdata->length);
diff --git a/lib/dns/rdata/generic/gpos_27.c b/lib/dns/rdata/generic/gpos_27.c
index 32a2284bbc..a2da83c347 100644
--- a/lib/dns/rdata/generic/gpos_27.c
+++ b/lib/dns/rdata/generic/gpos_27.c
@@ -137,23 +137,22 @@ tostruct_gpos(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	gpos->long_len = uint8_fromregion(&region);
 	isc_region_consume(&region, 1);
-	gpos->longitude = mem_maybedup(mctx, region.base, gpos->long_len);
+	gpos->longitude = region.base;
 	isc_region_consume(&region, gpos->long_len);

 	gpos->lat_len = uint8_fromregion(&region);
 	isc_region_consume(&region, 1);
-	gpos->latitude = mem_maybedup(mctx, region.base, gpos->lat_len);
+	gpos->latitude = region.base;
 	isc_region_consume(&region, gpos->lat_len);

 	gpos->alt_len = uint8_fromregion(&region);
 	isc_region_consume(&region, 1);
 	if (gpos->lat_len > 0) {
-		gpos->altitude = mem_maybedup(mctx, region.base, gpos->alt_len);
+		gpos->altitude = region.base;
 	} else {
 		gpos->altitude = NULL;
 	}

-	gpos->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -163,21 +162,6 @@ freestruct_gpos(ARGS_FREESTRUCT) {

 	REQUIRE(gpos != NULL);
 	REQUIRE(gpos->common.rdtype == dns_rdatatype_gpos);
-
-	if (gpos->mctx == NULL) {
-		return;
-	}
-
-	if (gpos->longitude != NULL) {
-		isc_mem_free(gpos->mctx, gpos->longitude);
-	}
-	if (gpos->latitude != NULL) {
-		isc_mem_free(gpos->mctx, gpos->latitude);
-	}
-	if (gpos->altitude != NULL) {
-		isc_mem_free(gpos->mctx, gpos->altitude);
-	}
-	gpos->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/gpos_27.h b/lib/dns/rdata/generic/gpos_27.h
index b09a69f2f7..18d37dfcba 100644
--- a/lib/dns/rdata/generic/gpos_27.h
+++ b/lib/dns/rdata/generic/gpos_27.h
@@ -18,10 +18,9 @@

 typedef struct dns_rdata_gpos {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
-	char *longitude;
-	char *latitude;
-	char *altitude;
+	unsigned char *longitude;
+	unsigned char *latitude;
+	unsigned char *altitude;
 	uint8_t long_len;
 	uint8_t lat_len;
 	uint8_t alt_len;
diff --git a/lib/dns/rdata/generic/hhit_67.c b/lib/dns/rdata/generic/hhit_67.c
index 44331bcfe0..ff182f3b7c 100644
--- a/lib/dns/rdata/generic/hhit_67.c
+++ b/lib/dns/rdata/generic/hhit_67.c
@@ -136,8 +136,7 @@ tostruct_hhit(ARGS_TOSTRUCT) {

 	/* Data */
 	hhit->datalen = sr.length;
-	hhit->data = mem_maybedup(mctx, sr.base, hhit->datalen);
-	hhit->mctx = mctx;
+	hhit->data = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -147,15 +146,6 @@ freestruct_hhit(ARGS_FREESTRUCT) {

 	REQUIRE(hhit != NULL);
 	REQUIRE(hhit->common.rdtype == dns_rdatatype_hhit);
-
-	if (hhit->mctx == NULL) {
-		return;
-	}
-
-	if (hhit->data != NULL) {
-		isc_mem_free(hhit->mctx, hhit->data);
-	}
-	hhit->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/hhit_67.h b/lib/dns/rdata/generic/hhit_67.h
index 040ef345d8..2cf74379fa 100644
--- a/lib/dns/rdata/generic/hhit_67.h
+++ b/lib/dns/rdata/generic/hhit_67.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_hhit_t {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t datalen;
 	unsigned char *data;
 } dns_rdata_hhit_t;
diff --git a/lib/dns/rdata/generic/hinfo_13.c b/lib/dns/rdata/generic/hinfo_13.c
index fde40b4bec..771c9df715 100644
--- a/lib/dns/rdata/generic/hinfo_13.c
+++ b/lib/dns/rdata/generic/hinfo_13.c
@@ -121,13 +121,12 @@ tostruct_hinfo(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	hinfo->cpu_len = uint8_fromregion(&region);
 	isc_region_consume(&region, 1);
-	hinfo->cpu = mem_maybedup(mctx, region.base, hinfo->cpu_len);
+	hinfo->cpu = region.base;
 	isc_region_consume(&region, hinfo->cpu_len);

 	hinfo->os_len = uint8_fromregion(&region);
 	isc_region_consume(&region, 1);
-	hinfo->os = mem_maybedup(mctx, region.base, hinfo->os_len);
-	hinfo->mctx = mctx;
+	hinfo->os = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -136,18 +135,6 @@ freestruct_hinfo(ARGS_FREESTRUCT) {
 	dns_rdata_hinfo_t *hinfo = source;

 	REQUIRE(hinfo != NULL);
-
-	if (hinfo->mctx == NULL) {
-		return;
-	}
-
-	if (hinfo->cpu != NULL) {
-		isc_mem_free(hinfo->mctx, hinfo->cpu);
-	}
-	if (hinfo->os != NULL) {
-		isc_mem_free(hinfo->mctx, hinfo->os);
-	}
-	hinfo->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/hinfo_13.h b/lib/dns/rdata/generic/hinfo_13.h
index a477d47170..728c561cea 100644
--- a/lib/dns/rdata/generic/hinfo_13.h
+++ b/lib/dns/rdata/generic/hinfo_13.h
@@ -15,9 +15,8 @@

 typedef struct dns_rdata_hinfo {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
-	char *cpu;
-	char *os;
+	unsigned char *cpu;
+	unsigned char *os;
 	uint8_t cpu_len;
 	uint8_t os_len;
 } dns_rdata_hinfo_t;
diff --git a/lib/dns/rdata/generic/hip_55.c b/lib/dns/rdata/generic/hip_55.c
index 1152894683..a17283e8fa 100644
--- a/lib/dns/rdata/generic/hip_55.c
+++ b/lib/dns/rdata/generic/hip_55.c
@@ -318,21 +318,20 @@ tostruct_hip(ARGS_TOSTRUCT) {

 	hip->hit = hip->key = hip->servers = NULL;

-	hip->hit = mem_maybedup(mctx, region.base, hip->hit_len);
+	hip->hit = region.base;
 	isc_region_consume(&region, hip->hit_len);

 	INSIST(hip->key_len <= region.length);

-	hip->key = mem_maybedup(mctx, region.base, hip->key_len);
+	hip->key = region.base;
 	isc_region_consume(&region, hip->key_len);

 	hip->servers_len = region.length;
 	if (hip->servers_len != 0) {
-		hip->servers = mem_maybedup(mctx, region.base, region.length);
+		hip->servers = region.base;
 	}

 	hip->offset = hip->servers_len;
-	hip->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -341,17 +340,6 @@ freestruct_hip(ARGS_FREESTRUCT) {
 	dns_rdata_hip_t *hip = source;

 	REQUIRE(hip != NULL);
-
-	if (hip->mctx == NULL) {
-		return;
-	}
-
-	isc_mem_free(hip->mctx, hip->hit);
-	isc_mem_free(hip->mctx, hip->key);
-	if (hip->servers != NULL) {
-		isc_mem_free(hip->mctx, hip->servers);
-	}
-	hip->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/hip_55.h b/lib/dns/rdata/generic/hip_55.h
index 617e9c9fed..49d5091193 100644
--- a/lib/dns/rdata/generic/hip_55.h
+++ b/lib/dns/rdata/generic/hip_55.h
@@ -17,7 +17,6 @@

 typedef struct dns_rdata_hip {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *hit;
 	unsigned char *key;
 	unsigned char *servers;
diff --git a/lib/dns/rdata/generic/ipseckey_45.c b/lib/dns/rdata/generic/ipseckey_45.c
index 7ef3663ffe..b96b733f59 100644
--- a/lib/dns/rdata/generic/ipseckey_45.c
+++ b/lib/dns/rdata/generic/ipseckey_45.c
@@ -383,20 +383,18 @@ tostruct_ipseckey(ARGS_TOSTRUCT) {
 	case 3:
 		dns_name_init(&ipseckey->gateway);
 		dns_name_fromregion(&name, &region);
-		name_duporclone(&name, mctx, &ipseckey->gateway);
+		dns_name_clone(&name, &ipseckey->gateway);
 		isc_region_consume(&region, name_length(&name));
 		break;
 	}

 	ipseckey->keylength = region.length;
 	if (ipseckey->keylength != 0U) {
-		ipseckey->key = mem_maybedup(mctx, region.base,
-					     ipseckey->keylength);
+		ipseckey->key = region.base;
 	} else {
 		ipseckey->key = NULL;
 	}

-	ipseckey->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -406,20 +404,6 @@ freestruct_ipseckey(ARGS_FREESTRUCT) {

 	REQUIRE(ipseckey != NULL);
 	REQUIRE(ipseckey->common.rdtype == dns_rdatatype_ipseckey);
-
-	if (ipseckey->mctx == NULL) {
-		return;
-	}
-
-	if (ipseckey->gateway_type == 3) {
-		dns_name_free(&ipseckey->gateway, ipseckey->mctx);
-	}
-
-	if (ipseckey->key != NULL) {
-		isc_mem_free(ipseckey->mctx, ipseckey->key);
-	}
-
-	ipseckey->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/ipseckey_45.h b/lib/dns/rdata/generic/ipseckey_45.h
index 829e9b4f44..a86eb5b356 100644
--- a/lib/dns/rdata/generic/ipseckey_45.h
+++ b/lib/dns/rdata/generic/ipseckey_45.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_ipseckey {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint8_t precedence;
 	uint8_t gateway_type;
 	uint8_t algorithm;
diff --git a/lib/dns/rdata/generic/isdn_20.c b/lib/dns/rdata/generic/isdn_20.c
index 433527aa58..f1d7842606 100644
--- a/lib/dns/rdata/generic/isdn_20.c
+++ b/lib/dns/rdata/generic/isdn_20.c
@@ -143,7 +143,7 @@ tostruct_isdn(ARGS_TOSTRUCT) {

 	isdn->isdn_len = uint8_fromregion(&r);
 	isc_region_consume(&r, 1);
-	isdn->isdn = mem_maybedup(mctx, r.base, isdn->isdn_len);
+	isdn->isdn = r.base;
 	isc_region_consume(&r, isdn->isdn_len);

 	if (r.length == 0) {
@@ -152,11 +152,9 @@ tostruct_isdn(ARGS_TOSTRUCT) {
 	} else {
 		isdn->subaddress_len = uint8_fromregion(&r);
 		isc_region_consume(&r, 1);
-		isdn->subaddress = mem_maybedup(mctx, r.base,
-						isdn->subaddress_len);
+		isdn->subaddress = r.base;
 	}

-	isdn->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -165,18 +163,6 @@ freestruct_isdn(ARGS_FREESTRUCT) {
 	dns_rdata_isdn_t *isdn = source;

 	REQUIRE(isdn != NULL);
-
-	if (isdn->mctx == NULL) {
-		return;
-	}
-
-	if (isdn->isdn != NULL) {
-		isc_mem_free(isdn->mctx, isdn->isdn);
-	}
-	if (isdn->subaddress != NULL) {
-		isc_mem_free(isdn->mctx, isdn->subaddress);
-	}
-	isdn->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/isdn_20.h b/lib/dns/rdata/generic/isdn_20.h
index d18aa63287..045994bed4 100644
--- a/lib/dns/rdata/generic/isdn_20.h
+++ b/lib/dns/rdata/generic/isdn_20.h
@@ -18,9 +18,8 @@

 typedef struct dns_rdata_isdn {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
-	char *isdn;
-	char *subaddress;
+	unsigned char *isdn;
+	unsigned char *subaddress;
 	uint8_t isdn_len;
 	uint8_t subaddress_len;
 } dns_rdata_isdn_t;
diff --git a/lib/dns/rdata/generic/key_25.c b/lib/dns/rdata/generic/key_25.c
index bc807107a3..3d168b50a3 100644
--- a/lib/dns/rdata/generic/key_25.c
+++ b/lib/dns/rdata/generic/key_25.c
@@ -341,8 +341,7 @@ generic_tostruct_key(ARGS_TOSTRUCT) {

 	/* Data */
 	key->datalen = sr.length;
-	key->data = mem_maybedup(mctx, sr.base, key->datalen);
-	key->mctx = mctx;
+	key->data = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -351,15 +350,6 @@ generic_freestruct_key(ARGS_FREESTRUCT) {
 	dns_rdata_key_t *key = (dns_rdata_key_t *)source;

 	REQUIRE(key != NULL);
-
-	if (key->mctx == NULL) {
-		return;
-	}
-
-	if (key->data != NULL) {
-		isc_mem_free(key->mctx, key->data);
-	}
-	key->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/key_25.h b/lib/dns/rdata/generic/key_25.h
index 47024345dd..90f5266245 100644
--- a/lib/dns/rdata/generic/key_25.h
+++ b/lib/dns/rdata/generic/key_25.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_key {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t flags;
 	dns_secproto_t protocol;
 	dns_secalg_t algorithm;
diff --git a/lib/dns/rdata/generic/keydata_65533.c b/lib/dns/rdata/generic/keydata_65533.c
index cffe24de60..775057cc38 100644
--- a/lib/dns/rdata/generic/keydata_65533.c
+++ b/lib/dns/rdata/generic/keydata_65533.c
@@ -384,8 +384,7 @@ tostruct_keydata(ARGS_TOSTRUCT) {

 	/* Data */
 	keydata->datalen = sr.length;
-	keydata->data = mem_maybedup(mctx, sr.base, keydata->datalen);
-	keydata->mctx = mctx;
+	keydata->data = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -395,15 +394,6 @@ freestruct_keydata(ARGS_FREESTRUCT) {

 	REQUIRE(keydata != NULL);
 	REQUIRE(keydata->common.rdtype == dns_rdatatype_keydata);
-
-	if (keydata->mctx == NULL) {
-		return;
-	}
-
-	if (keydata->data != NULL) {
-		isc_mem_free(keydata->mctx, keydata->data);
-	}
-	keydata->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/keydata_65533.h b/lib/dns/rdata/generic/keydata_65533.h
index 598b31b694..3d3b433b1f 100644
--- a/lib/dns/rdata/generic/keydata_65533.h
+++ b/lib/dns/rdata/generic/keydata_65533.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_keydata {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint32_t refresh;  /* Timer for refreshing data */
 	uint32_t addhd;	   /* Hold-down timer for adding */
 	uint32_t removehd; /* Hold-down timer for removing */
diff --git a/lib/dns/rdata/generic/l32_105.c b/lib/dns/rdata/generic/l32_105.c
index 5f2d8933bb..e7b7ce5330 100644
--- a/lib/dns/rdata/generic/l32_105.c
+++ b/lib/dns/rdata/generic/l32_105.c
@@ -150,8 +150,6 @@ tostruct_l32(ARGS_TOSTRUCT) {
 	REQUIRE(l32 != NULL);
 	REQUIRE(rdata->length == 6);

-	UNUSED(mctx);
-
 	DNS_RDATACOMMON_INIT(l32, rdata->type, rdata->rdclass);

 	dns_rdata_toregion(rdata, &region);
diff --git a/lib/dns/rdata/generic/l64_106.c b/lib/dns/rdata/generic/l64_106.c
index 493264fa55..a1706d77f8 100644
--- a/lib/dns/rdata/generic/l64_106.c
+++ b/lib/dns/rdata/generic/l64_106.c
@@ -145,8 +145,6 @@ tostruct_l64(ARGS_TOSTRUCT) {
 	REQUIRE(l64 != NULL);
 	REQUIRE(rdata->length == 10);

-	UNUSED(mctx);
-
 	DNS_RDATACOMMON_INIT(l64, rdata->type, rdata->rdclass);

 	dns_rdata_toregion(rdata, &region);
diff --git a/lib/dns/rdata/generic/loc_29.c b/lib/dns/rdata/generic/loc_29.c
index 7a6ef37c4d..c500c27253 100644
--- a/lib/dns/rdata/generic/loc_29.c
+++ b/lib/dns/rdata/generic/loc_29.c
@@ -745,8 +745,6 @@ tostruct_loc(ARGS_TOSTRUCT) {
 	REQUIRE(loc != NULL);
 	REQUIRE(rdata->length != 0);

-	UNUSED(mctx);
-
 	dns_rdata_toregion(rdata, &r);
 	version = uint8_fromregion(&r);
 	if (version != 0) {
diff --git a/lib/dns/rdata/generic/lp_107.c b/lib/dns/rdata/generic/lp_107.c
index 293822e340..d3d81a657d 100644
--- a/lib/dns/rdata/generic/lp_107.c
+++ b/lib/dns/rdata/generic/lp_107.c
@@ -161,8 +161,7 @@ tostruct_lp(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 2);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&lp->lp);
-	name_duporclone(&name, mctx, &lp->lp);
-	lp->mctx = mctx;
+	dns_name_clone(&name, &lp->lp);
 	return ISC_R_SUCCESS;
 }

@@ -172,13 +171,6 @@ freestruct_lp(ARGS_FREESTRUCT) {

 	REQUIRE(lp != NULL);
 	REQUIRE(lp->common.rdtype == dns_rdatatype_lp);
-
-	if (lp->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&lp->lp, lp->mctx);
-	lp->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/lp_107.h b/lib/dns/rdata/generic/lp_107.h
index 09031c44f2..53ec576c16 100644
--- a/lib/dns/rdata/generic/lp_107.h
+++ b/lib/dns/rdata/generic/lp_107.h
@@ -16,7 +16,6 @@

 typedef struct dns_rdata_lp {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t pref;
 	dns_name_t lp;
 } dns_rdata_lp_t;
diff --git a/lib/dns/rdata/generic/mb_7.c b/lib/dns/rdata/generic/mb_7.c
index 9282507d15..9b1193d7b1 100644
--- a/lib/dns/rdata/generic/mb_7.c
+++ b/lib/dns/rdata/generic/mb_7.c
@@ -149,8 +149,7 @@ tostruct_mb(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&mb->mb);
-	name_duporclone(&name, mctx, &mb->mb);
-	mb->mctx = mctx;
+	dns_name_clone(&name, &mb->mb);
 	return ISC_R_SUCCESS;
 }

@@ -159,13 +158,6 @@ freestruct_mb(ARGS_FREESTRUCT) {
 	dns_rdata_mb_t *mb = source;

 	REQUIRE(mb != NULL);
-
-	if (mb->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&mb->mb, mb->mctx);
-	mb->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/mb_7.h b/lib/dns/rdata/generic/mb_7.h
index 187e657dd0..747a28e558 100644
--- a/lib/dns/rdata/generic/mb_7.h
+++ b/lib/dns/rdata/generic/mb_7.h
@@ -16,6 +16,5 @@

 typedef struct dns_rdata_mb {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t mb;
 } dns_rdata_mb_t;
diff --git a/lib/dns/rdata/generic/md_3.c b/lib/dns/rdata/generic/md_3.c
index 86633d375f..52a9440214 100644
--- a/lib/dns/rdata/generic/md_3.c
+++ b/lib/dns/rdata/generic/md_3.c
@@ -149,8 +149,7 @@ tostruct_md(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &r);
 	dns_name_fromregion(&name, &r);
 	dns_name_init(&md->md);
-	name_duporclone(&name, mctx, &md->md);
-	md->mctx = mctx;
+	dns_name_clone(&name, &md->md);
 	return ISC_R_SUCCESS;
 }

@@ -160,13 +159,6 @@ freestruct_md(ARGS_FREESTRUCT) {

 	REQUIRE(md != NULL);
 	REQUIRE(md->common.rdtype == dns_rdatatype_md);
-
-	if (md->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&md->md, md->mctx);
-	md->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/md_3.h b/lib/dns/rdata/generic/md_3.h
index 530e2cb90c..6422e8299a 100644
--- a/lib/dns/rdata/generic/md_3.h
+++ b/lib/dns/rdata/generic/md_3.h
@@ -16,6 +16,5 @@

 typedef struct dns_rdata_md {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t md;
 } dns_rdata_md_t;
diff --git a/lib/dns/rdata/generic/mf_4.c b/lib/dns/rdata/generic/mf_4.c
index cd1b69df83..429d4272b3 100644
--- a/lib/dns/rdata/generic/mf_4.c
+++ b/lib/dns/rdata/generic/mf_4.c
@@ -149,8 +149,7 @@ tostruct_mf(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &r);
 	dns_name_fromregion(&name, &r);
 	dns_name_init(&mf->mf);
-	name_duporclone(&name, mctx, &mf->mf);
-	mf->mctx = mctx;
+	dns_name_clone(&name, &mf->mf);
 	return ISC_R_SUCCESS;
 }

@@ -160,12 +159,6 @@ freestruct_mf(ARGS_FREESTRUCT) {

 	REQUIRE(mf != NULL);
 	REQUIRE(mf->common.rdtype == dns_rdatatype_mf);
-
-	if (mf->mctx == NULL) {
-		return;
-	}
-	dns_name_free(&mf->mf, mf->mctx);
-	mf->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/mf_4.h b/lib/dns/rdata/generic/mf_4.h
index eb1559acd1..6690e2826a 100644
--- a/lib/dns/rdata/generic/mf_4.h
+++ b/lib/dns/rdata/generic/mf_4.h
@@ -16,6 +16,5 @@

 typedef struct dns_rdata_mf {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t mf;
 } dns_rdata_mf_t;
diff --git a/lib/dns/rdata/generic/mg_8.c b/lib/dns/rdata/generic/mg_8.c
index f167eaaedd..1027aa10c9 100644
--- a/lib/dns/rdata/generic/mg_8.c
+++ b/lib/dns/rdata/generic/mg_8.c
@@ -149,8 +149,7 @@ tostruct_mg(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&mg->mg);
-	name_duporclone(&name, mctx, &mg->mg);
-	mg->mctx = mctx;
+	dns_name_clone(&name, &mg->mg);
 	return ISC_R_SUCCESS;
 }

@@ -160,12 +159,6 @@ freestruct_mg(ARGS_FREESTRUCT) {

 	REQUIRE(mg != NULL);
 	REQUIRE(mg->common.rdtype == dns_rdatatype_mg);
-
-	if (mg->mctx == NULL) {
-		return;
-	}
-	dns_name_free(&mg->mg, mg->mctx);
-	mg->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/mg_8.h b/lib/dns/rdata/generic/mg_8.h
index 09fd206c31..6b648b042a 100644
--- a/lib/dns/rdata/generic/mg_8.h
+++ b/lib/dns/rdata/generic/mg_8.h
@@ -16,6 +16,5 @@

 typedef struct dns_rdata_mg {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t mg;
 } dns_rdata_mg_t;
diff --git a/lib/dns/rdata/generic/minfo_14.c b/lib/dns/rdata/generic/minfo_14.c
index 96b738251e..ce1d1ccb28 100644
--- a/lib/dns/rdata/generic/minfo_14.c
+++ b/lib/dns/rdata/generic/minfo_14.c
@@ -213,13 +213,12 @@ tostruct_minfo(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&minfo->rmailbox);
-	name_duporclone(&name, mctx, &minfo->rmailbox);
+	dns_name_clone(&name, &minfo->rmailbox);
 	isc_region_consume(&region, name_length(&name));

 	dns_name_fromregion(&name, &region);
 	dns_name_init(&minfo->emailbox);
-	name_duporclone(&name, mctx, &minfo->emailbox);
-	minfo->mctx = mctx;
+	dns_name_clone(&name, &minfo->emailbox);
 	return ISC_R_SUCCESS;
 }

@@ -229,14 +228,6 @@ freestruct_minfo(ARGS_FREESTRUCT) {

 	REQUIRE(minfo != NULL);
 	REQUIRE(minfo->common.rdtype == dns_rdatatype_minfo);
-
-	if (minfo->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&minfo->rmailbox, minfo->mctx);
-	dns_name_free(&minfo->emailbox, minfo->mctx);
-	minfo->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/minfo_14.h b/lib/dns/rdata/generic/minfo_14.h
index f2a530ad77..1c4ec65e5e 100644
--- a/lib/dns/rdata/generic/minfo_14.h
+++ b/lib/dns/rdata/generic/minfo_14.h
@@ -16,7 +16,6 @@

 typedef struct dns_rdata_minfo {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t rmailbox;
 	dns_name_t emailbox;
 } dns_rdata_minfo_t;
diff --git a/lib/dns/rdata/generic/mr_9.c b/lib/dns/rdata/generic/mr_9.c
index d38c73ac4e..387ef51c6c 100644
--- a/lib/dns/rdata/generic/mr_9.c
+++ b/lib/dns/rdata/generic/mr_9.c
@@ -149,8 +149,7 @@ tostruct_mr(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&mr->mr);
-	name_duporclone(&name, mctx, &mr->mr);
-	mr->mctx = mctx;
+	dns_name_clone(&name, &mr->mr);
 	return ISC_R_SUCCESS;
 }

@@ -160,12 +159,6 @@ freestruct_mr(ARGS_FREESTRUCT) {

 	REQUIRE(mr != NULL);
 	REQUIRE(mr->common.rdtype == dns_rdatatype_mr);
-
-	if (mr->mctx == NULL) {
-		return;
-	}
-	dns_name_free(&mr->mr, mr->mctx);
-	mr->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/mr_9.h b/lib/dns/rdata/generic/mr_9.h
index e9a876e203..7b82add29b 100644
--- a/lib/dns/rdata/generic/mr_9.h
+++ b/lib/dns/rdata/generic/mr_9.h
@@ -16,6 +16,5 @@

 typedef struct dns_rdata_mr {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t mr;
 } dns_rdata_mr_t;
diff --git a/lib/dns/rdata/generic/mx_15.c b/lib/dns/rdata/generic/mx_15.c
index a1eb04ceeb..f65d112b16 100644
--- a/lib/dns/rdata/generic/mx_15.c
+++ b/lib/dns/rdata/generic/mx_15.c
@@ -239,8 +239,7 @@ tostruct_mx(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 2);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&mx->mx);
-	name_duporclone(&name, mctx, &mx->mx);
-	mx->mctx = mctx;
+	dns_name_clone(&name, &mx->mx);
 	return ISC_R_SUCCESS;
 }

@@ -250,13 +249,6 @@ freestruct_mx(ARGS_FREESTRUCT) {

 	REQUIRE(mx != NULL);
 	REQUIRE(mx->common.rdtype == dns_rdatatype_mx);
-
-	if (mx->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&mx->mx, mx->mctx);
-	mx->mctx = NULL;
 }

 static unsigned char port25_ndata[] = "\003_25\004_tcp";
diff --git a/lib/dns/rdata/generic/mx_15.h b/lib/dns/rdata/generic/mx_15.h
index f651591220..46006b458d 100644
--- a/lib/dns/rdata/generic/mx_15.h
+++ b/lib/dns/rdata/generic/mx_15.h
@@ -16,7 +16,6 @@

 typedef struct dns_rdata_mx {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t pref;
 	dns_name_t mx;
 } dns_rdata_mx_t;
diff --git a/lib/dns/rdata/generic/naptr_35.c b/lib/dns/rdata/generic/naptr_35.c
index 5acdcbd0f7..94cbaa3f82 100644
--- a/lib/dns/rdata/generic/naptr_35.c
+++ b/lib/dns/rdata/generic/naptr_35.c
@@ -520,26 +520,25 @@ tostruct_naptr(ARGS_TOSTRUCT) {
 	naptr->flags_len = uint8_fromregion(&r);
 	isc_region_consume(&r, 1);
 	INSIST(naptr->flags_len <= r.length);
-	naptr->flags = mem_maybedup(mctx, r.base, naptr->flags_len);
+	naptr->flags = r.base;
 	isc_region_consume(&r, naptr->flags_len);

 	naptr->service_len = uint8_fromregion(&r);
 	isc_region_consume(&r, 1);
 	INSIST(naptr->service_len <= r.length);
-	naptr->service = mem_maybedup(mctx, r.base, naptr->service_len);
+	naptr->service = r.base;
 	isc_region_consume(&r, naptr->service_len);

 	naptr->regexp_len = uint8_fromregion(&r);
 	isc_region_consume(&r, 1);
 	INSIST(naptr->regexp_len <= r.length);
-	naptr->regexp = mem_maybedup(mctx, r.base, naptr->regexp_len);
+	naptr->regexp = r.base;
 	isc_region_consume(&r, naptr->regexp_len);

 	dns_name_init(&name);
 	dns_name_fromregion(&name, &r);
 	dns_name_init(&naptr->replacement);
-	name_duporclone(&name, mctx, &naptr->replacement);
-	naptr->mctx = mctx;
+	dns_name_clone(&name, &naptr->replacement);
 	return ISC_R_SUCCESS;
 }

@@ -549,22 +548,6 @@ freestruct_naptr(ARGS_FREESTRUCT) {

 	REQUIRE(naptr != NULL);
 	REQUIRE(naptr->common.rdtype == dns_rdatatype_naptr);
-
-	if (naptr->mctx == NULL) {
-		return;
-	}
-
-	if (naptr->flags != NULL) {
-		isc_mem_free(naptr->mctx, naptr->flags);
-	}
-	if (naptr->service != NULL) {
-		isc_mem_free(naptr->mctx, naptr->service);
-	}
-	if (naptr->regexp != NULL) {
-		isc_mem_free(naptr->mctx, naptr->regexp);
-	}
-	dns_name_free(&naptr->replacement, naptr->mctx);
-	naptr->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/naptr_35.h b/lib/dns/rdata/generic/naptr_35.h
index f414dddb6b..f72f75ff12 100644
--- a/lib/dns/rdata/generic/naptr_35.h
+++ b/lib/dns/rdata/generic/naptr_35.h
@@ -18,14 +18,13 @@

 typedef struct dns_rdata_naptr {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t order;
 	uint16_t preference;
-	char *flags;
+	unsigned char *flags;
 	uint8_t flags_len;
-	char *service;
+	unsigned char *service;
 	uint8_t service_len;
-	char *regexp;
+	unsigned char *regexp;
 	uint8_t regexp_len;
 	dns_name_t replacement;
 } dns_rdata_naptr_t;
diff --git a/lib/dns/rdata/generic/nid_104.c b/lib/dns/rdata/generic/nid_104.c
index 275772b9e4..bb22d770d9 100644
--- a/lib/dns/rdata/generic/nid_104.c
+++ b/lib/dns/rdata/generic/nid_104.c
@@ -145,8 +145,6 @@ tostruct_nid(ARGS_TOSTRUCT) {
 	REQUIRE(nid != NULL);
 	REQUIRE(rdata->length == 10);

-	UNUSED(mctx);
-
 	DNS_RDATACOMMON_INIT(nid, rdata->type, rdata->rdclass);

 	dns_rdata_toregion(rdata, &region);
diff --git a/lib/dns/rdata/generic/ns_2.c b/lib/dns/rdata/generic/ns_2.c
index 5508c2e6c7..5fbe63c447 100644
--- a/lib/dns/rdata/generic/ns_2.c
+++ b/lib/dns/rdata/generic/ns_2.c
@@ -163,8 +163,7 @@ tostruct_ns(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&ns->name);
-	name_duporclone(&name, mctx, &ns->name);
-	ns->mctx = mctx;
+	dns_name_clone(&name, &ns->name);
 	return ISC_R_SUCCESS;
 }

@@ -173,13 +172,6 @@ freestruct_ns(ARGS_FREESTRUCT) {
 	dns_rdata_ns_t *ns = source;

 	REQUIRE(ns != NULL);
-
-	if (ns->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&ns->name, ns->mctx);
-	ns->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/ns_2.h b/lib/dns/rdata/generic/ns_2.h
index a9abd5d26a..84e9a94576 100644
--- a/lib/dns/rdata/generic/ns_2.h
+++ b/lib/dns/rdata/generic/ns_2.h
@@ -16,6 +16,5 @@

 typedef struct dns_rdata_ns {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t name;
 } dns_rdata_ns_t;
diff --git a/lib/dns/rdata/generic/nsec3_50.c b/lib/dns/rdata/generic/nsec3_50.c
index bcad926125..6496a58a01 100644
--- a/lib/dns/rdata/generic/nsec3_50.c
+++ b/lib/dns/rdata/generic/nsec3_50.c
@@ -327,18 +327,16 @@ tostruct_nsec3(ARGS_TOSTRUCT) {

 	nsec3->salt.length = uint8_consume_fromregion(&region);
 	INSIST(nsec3->salt.length <= region.length);
-	nsec3->salt.base = mem_maybedup(mctx, region.base, nsec3->salt.length);
+	nsec3->salt.base = region.base;
 	isc_region_consume(&region, nsec3->salt.length);

 	nsec3->next.length = uint8_consume_fromregion(&region);
 	INSIST(nsec3->next.length <= region.length);
-	nsec3->next.base = mem_maybedup(mctx, region.base, nsec3->next.length);
+	nsec3->next.base = region.base;
 	isc_region_consume(&region, nsec3->next.length);

 	nsec3->typebits.length = region.length;
-	nsec3->typebits.base = mem_maybedup(mctx, region.base,
-					    nsec3->typebits.length);
-	nsec3->mctx = mctx;
+	nsec3->typebits.base = region.base;

 	return ISC_R_SUCCESS;
 }
@@ -349,24 +347,6 @@ freestruct_nsec3(ARGS_FREESTRUCT) {

 	REQUIRE(nsec3 != NULL);
 	REQUIRE(nsec3->common.rdtype == dns_rdatatype_nsec3);
-
-	if (nsec3->mctx == NULL) {
-		return;
-	}
-
-	if (nsec3->salt.base != NULL) {
-		isc_mem_free(nsec3->mctx, nsec3->salt.base);
-		nsec3->salt.length = 0;
-	}
-	if (nsec3->next.base != NULL) {
-		isc_mem_free(nsec3->mctx, nsec3->next.base);
-		nsec3->next.length = 0;
-	}
-	if (nsec3->typebits.base != NULL) {
-		isc_mem_free(nsec3->mctx, nsec3->typebits.base);
-		nsec3->typebits.length = 0;
-	}
-	nsec3->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/nsec3_50.h b/lib/dns/rdata/generic/nsec3_50.h
index 0e5e2e3fb2..5afbade2de 100644
--- a/lib/dns/rdata/generic/nsec3_50.h
+++ b/lib/dns/rdata/generic/nsec3_50.h
@@ -21,7 +21,6 @@

 typedef struct dns_rdata_nsec3 {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_hash_t hash;
 	unsigned char flags;
 	dns_iterations_t iterations;
diff --git a/lib/dns/rdata/generic/nsec3param_51.c b/lib/dns/rdata/generic/nsec3param_51.c
index c0b15e217f..3712c9e02f 100644
--- a/lib/dns/rdata/generic/nsec3param_51.c
+++ b/lib/dns/rdata/generic/nsec3param_51.c
@@ -239,11 +239,9 @@ tostruct_nsec3param(ARGS_TOSTRUCT) {

 	nsec3param->salt.length = uint8_consume_fromregion(&region);
 	INSIST(nsec3param->salt.length == region.length);
-	nsec3param->salt.base = mem_maybedup(mctx, region.base,
-					     nsec3param->salt.length);
+	nsec3param->salt.base = region.base;
 	isc_region_consume(&region, nsec3param->salt.length);

-	nsec3param->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -253,16 +251,6 @@ freestruct_nsec3param(ARGS_FREESTRUCT) {

 	REQUIRE(nsec3param != NULL);
 	REQUIRE(nsec3param->common.rdtype == dns_rdatatype_nsec3param);
-
-	if (nsec3param->mctx == NULL) {
-		return;
-	}
-
-	if (nsec3param->salt.base != NULL) {
-		isc_mem_free(nsec3param->mctx, nsec3param->salt.base);
-		nsec3param->salt.length = 0;
-	}
-	nsec3param->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/nsec3param_51.h b/lib/dns/rdata/generic/nsec3param_51.h
index 53c6767c3f..ceade200e4 100644
--- a/lib/dns/rdata/generic/nsec3param_51.h
+++ b/lib/dns/rdata/generic/nsec3param_51.h
@@ -20,7 +20,6 @@

 typedef struct dns_rdata_nsec3param {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_hash_t hash;
 	unsigned char flags; /* DNS_NSEC3FLAG_* */
 	dns_iterations_t iterations;
diff --git a/lib/dns/rdata/generic/nsec_47.c b/lib/dns/rdata/generic/nsec_47.c
index e850dfb9e3..b0a5b5b9b4 100644
--- a/lib/dns/rdata/generic/nsec_47.c
+++ b/lib/dns/rdata/generic/nsec_47.c
@@ -169,11 +169,10 @@ tostruct_nsec(ARGS_TOSTRUCT) {
 	dns_name_fromregion(&name, &region);
 	isc_region_consume(&region, name_length(&name));
 	dns_name_init(&nsec->next);
-	name_duporclone(&name, mctx, &nsec->next);
+	dns_name_clone(&name, &nsec->next);

 	nsec->len = region.length;
-	nsec->typebits = mem_maybedup(mctx, region.base, region.length);
-	nsec->mctx = mctx;
+	nsec->typebits = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -183,16 +182,6 @@ freestruct_nsec(ARGS_FREESTRUCT) {

 	REQUIRE(nsec != NULL);
 	REQUIRE(nsec->common.rdtype == dns_rdatatype_nsec);
-
-	if (nsec->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&nsec->next, nsec->mctx);
-	if (nsec->typebits != NULL) {
-		isc_mem_free(nsec->mctx, nsec->typebits);
-	}
-	nsec->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/nsec_47.h b/lib/dns/rdata/generic/nsec_47.h
index eded7ac0ea..d10aada864 100644
--- a/lib/dns/rdata/generic/nsec_47.h
+++ b/lib/dns/rdata/generic/nsec_47.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_nsec {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t next;
 	unsigned char *typebits;
 	uint16_t len;
diff --git a/lib/dns/rdata/generic/null_10.c b/lib/dns/rdata/generic/null_10.c
index 2967a556a1..1397801f3a 100644
--- a/lib/dns/rdata/generic/null_10.c
+++ b/lib/dns/rdata/generic/null_10.c
@@ -104,8 +104,7 @@ tostruct_null(ARGS_TOSTRUCT) {

 	dns_rdata_toregion(rdata, &r);
 	null->length = r.length;
-	null->data = mem_maybedup(mctx, r.base, r.length);
-	null->mctx = mctx;
+	null->data = r.base;
 	return ISC_R_SUCCESS;
 }

@@ -115,15 +114,6 @@ freestruct_null(ARGS_FREESTRUCT) {

 	REQUIRE(null != NULL);
 	REQUIRE(null->common.rdtype == dns_rdatatype_null);
-
-	if (null->mctx == NULL) {
-		return;
-	}
-
-	if (null->data != NULL) {
-		isc_mem_free(null->mctx, null->data);
-	}
-	null->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/null_10.h b/lib/dns/rdata/generic/null_10.h
index d015b7d823..17d419657a 100644
--- a/lib/dns/rdata/generic/null_10.h
+++ b/lib/dns/rdata/generic/null_10.h
@@ -16,7 +16,6 @@

 typedef struct dns_rdata_null {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t length;
 	unsigned char *data;
 } dns_rdata_null_t;
diff --git a/lib/dns/rdata/generic/nxt_30.c b/lib/dns/rdata/generic/nxt_30.c
index 7862e25c37..ea73690284 100644
--- a/lib/dns/rdata/generic/nxt_30.c
+++ b/lib/dns/rdata/generic/nxt_30.c
@@ -252,11 +252,10 @@ tostruct_nxt(ARGS_TOSTRUCT) {
 	dns_name_fromregion(&name, &region);
 	isc_region_consume(&region, name_length(&name));
 	dns_name_init(&nxt->next);
-	name_duporclone(&name, mctx, &nxt->next);
+	dns_name_clone(&name, &nxt->next);

 	nxt->len = region.length;
-	nxt->typebits = mem_maybedup(mctx, region.base, region.length);
-	nxt->mctx = mctx;
+	nxt->typebits = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -266,16 +265,6 @@ freestruct_nxt(ARGS_FREESTRUCT) {

 	REQUIRE(nxt != NULL);
 	REQUIRE(nxt->common.rdtype == dns_rdatatype_nxt);
-
-	if (nxt->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&nxt->next, nxt->mctx);
-	if (nxt->typebits != NULL) {
-		isc_mem_free(nxt->mctx, nxt->typebits);
-	}
-	nxt->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/nxt_30.h b/lib/dns/rdata/generic/nxt_30.h
index fb3e8b2e98..76074286ac 100644
--- a/lib/dns/rdata/generic/nxt_30.h
+++ b/lib/dns/rdata/generic/nxt_30.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_nxt {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t next;
 	unsigned char *typebits;
 	uint16_t len;
diff --git a/lib/dns/rdata/generic/openpgpkey_61.c b/lib/dns/rdata/generic/openpgpkey_61.c
index 74e3147eca..e0b5827c01 100644
--- a/lib/dns/rdata/generic/openpgpkey_61.c
+++ b/lib/dns/rdata/generic/openpgpkey_61.c
@@ -152,8 +152,7 @@ tostruct_openpgpkey(ARGS_TOSTRUCT) {
 	 * Keyring.
 	 */
 	sig->length = sr.length;
-	sig->keyring = mem_maybedup(mctx, sr.base, sig->length);
-	sig->mctx = mctx;
+	sig->keyring = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -163,15 +162,6 @@ freestruct_openpgpkey(ARGS_FREESTRUCT) {

 	REQUIRE(sig != NULL);
 	REQUIRE(sig->common.rdtype == dns_rdatatype_openpgpkey);
-
-	if (sig->mctx == NULL) {
-		return;
-	}
-
-	if (sig->keyring != NULL) {
-		isc_mem_free(sig->mctx, sig->keyring);
-	}
-	sig->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/openpgpkey_61.h b/lib/dns/rdata/generic/openpgpkey_61.h
index 702d343746..300ba971b5 100644
--- a/lib/dns/rdata/generic/openpgpkey_61.h
+++ b/lib/dns/rdata/generic/openpgpkey_61.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_openpgpkey {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t length;
 	unsigned char *keyring;
 } dns_rdata_openpgpkey_t;
diff --git a/lib/dns/rdata/generic/opt_41.c b/lib/dns/rdata/generic/opt_41.c
index 7602c71375..5a83d1642f 100644
--- a/lib/dns/rdata/generic/opt_41.c
+++ b/lib/dns/rdata/generic/opt_41.c
@@ -369,9 +369,8 @@ tostruct_opt(ARGS_TOSTRUCT) {

 	dns_rdata_toregion(rdata, &r);
 	opt->length = r.length;
-	opt->options = mem_maybedup(mctx, r.base, r.length);
+	opt->options = r.base;
 	opt->offset = 0;
-	opt->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -381,15 +380,6 @@ freestruct_opt(ARGS_FREESTRUCT) {

 	REQUIRE(opt != NULL);
 	REQUIRE(opt->common.rdtype == dns_rdatatype_opt);
-
-	if (opt->mctx == NULL) {
-		return;
-	}
-
-	if (opt->options != NULL) {
-		isc_mem_free(opt->mctx, opt->options);
-	}
-	opt->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/opt_41.h b/lib/dns/rdata/generic/opt_41.h
index 1842b0dc83..0b0bdecbe9 100644
--- a/lib/dns/rdata/generic/opt_41.h
+++ b/lib/dns/rdata/generic/opt_41.h
@@ -24,7 +24,6 @@ typedef struct dns_rdata_opt_opcode {

 typedef struct dns_rdata_opt {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *options;
 	uint16_t length;
 	/* private */
diff --git a/lib/dns/rdata/generic/proforma.h b/lib/dns/rdata/generic/proforma.h
index 03962d1ef6..b001218045 100644
--- a/lib/dns/rdata/generic/proforma.h
+++ b/lib/dns/rdata/generic/proforma.h
@@ -16,7 +16,6 @@

 typedef struct dns_rdata_ #{
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx; /* if required */
-			 /* type & class specific elements */
+	/* type & class specific elements */
 }
 dns_rdata_ #_t;
diff --git a/lib/dns/rdata/generic/ptr_12.c b/lib/dns/rdata/generic/ptr_12.c
index d319d38371..504cc88bf6 100644
--- a/lib/dns/rdata/generic/ptr_12.c
+++ b/lib/dns/rdata/generic/ptr_12.c
@@ -167,8 +167,7 @@ tostruct_ptr(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&ptr->ptr);
-	name_duporclone(&name, mctx, &ptr->ptr);
-	ptr->mctx = mctx;
+	dns_name_clone(&name, &ptr->ptr);
 	return ISC_R_SUCCESS;
 }

@@ -178,13 +177,6 @@ freestruct_ptr(ARGS_FREESTRUCT) {

 	REQUIRE(ptr != NULL);
 	REQUIRE(ptr->common.rdtype == dns_rdatatype_ptr);
-
-	if (ptr->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&ptr->ptr, ptr->mctx);
-	ptr->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/ptr_12.h b/lib/dns/rdata/generic/ptr_12.h
index 8951eb3775..518ba377f3 100644
--- a/lib/dns/rdata/generic/ptr_12.h
+++ b/lib/dns/rdata/generic/ptr_12.h
@@ -16,6 +16,5 @@

 typedef struct dns_rdata_ptr {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t ptr;
 } dns_rdata_ptr_t;
diff --git a/lib/dns/rdata/generic/resinfo_261.h b/lib/dns/rdata/generic/resinfo_261.h
index 67218881a8..e51a1d2665 100644
--- a/lib/dns/rdata/generic/resinfo_261.h
+++ b/lib/dns/rdata/generic/resinfo_261.h
@@ -20,7 +20,6 @@ typedef struct dns_rdata_resinfo_string {

 typedef struct dns_rdata_resinfo {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *txt;
 	uint16_t txt_len;
 	/* private */
diff --git a/lib/dns/rdata/generic/rp_17.c b/lib/dns/rdata/generic/rp_17.c
index 4d3cedf2a3..73b871c760 100644
--- a/lib/dns/rdata/generic/rp_17.c
+++ b/lib/dns/rdata/generic/rp_17.c
@@ -220,12 +220,11 @@ tostruct_rp(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&rp->mail);
-	name_duporclone(&name, mctx, &rp->mail);
+	dns_name_clone(&name, &rp->mail);
 	isc_region_consume(&region, name_length(&name));
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&rp->text);
-	name_duporclone(&name, mctx, &rp->text);
-	rp->mctx = mctx;
+	dns_name_clone(&name, &rp->text);
 	return ISC_R_SUCCESS;
 }

@@ -235,14 +234,6 @@ freestruct_rp(ARGS_FREESTRUCT) {

 	REQUIRE(rp != NULL);
 	REQUIRE(rp->common.rdtype == dns_rdatatype_rp);
-
-	if (rp->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&rp->mail, rp->mctx);
-	dns_name_free(&rp->text, rp->mctx);
-	rp->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/rp_17.h b/lib/dns/rdata/generic/rp_17.h
index d27ffb959f..e88e32a0ef 100644
--- a/lib/dns/rdata/generic/rp_17.h
+++ b/lib/dns/rdata/generic/rp_17.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_rp {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t mail;
 	dns_name_t text;
 } dns_rdata_rp_t;
diff --git a/lib/dns/rdata/generic/rrsig_46.c b/lib/dns/rdata/generic/rrsig_46.c
index 11067ae672..f2f6b4a3f8 100644
--- a/lib/dns/rdata/generic/rrsig_46.c
+++ b/lib/dns/rdata/generic/rrsig_46.c
@@ -569,15 +569,14 @@ tostruct_rrsig(ARGS_TOSTRUCT) {
 	dns_name_init(&signer);
 	dns_name_fromregion(&signer, &sr);
 	dns_name_init(&sig->signer);
-	name_duporclone(&signer, mctx, &sig->signer);
+	dns_name_clone(&signer, &sig->signer);
 	isc_region_consume(&sr, name_length(&sig->signer));

 	/*
 	 * Signature.
 	 */
 	sig->siglen = sr.length;
-	sig->signature = mem_maybedup(mctx, sr.base, sig->siglen);
-	sig->mctx = mctx;
+	sig->signature = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -587,16 +586,6 @@ freestruct_rrsig(ARGS_FREESTRUCT) {

 	REQUIRE(sig != NULL);
 	REQUIRE(sig->common.rdtype == dns_rdatatype_rrsig);
-
-	if (sig->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&sig->signer, sig->mctx);
-	if (sig->signature != NULL) {
-		isc_mem_free(sig->mctx, sig->signature);
-	}
-	sig->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/rrsig_46.h b/lib/dns/rdata/generic/rrsig_46.h
index 0869c2d4e7..80e13abc3b 100644
--- a/lib/dns/rdata/generic/rrsig_46.h
+++ b/lib/dns/rdata/generic/rrsig_46.h
@@ -17,7 +17,6 @@
  *  \brief Per RFC2535 */
 typedef struct dns_rdata_rrsig {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_rdatatype_t covered;
 	dns_secalg_t algorithm;
 	uint8_t labels;
diff --git a/lib/dns/rdata/generic/rt_21.c b/lib/dns/rdata/generic/rt_21.c
index ca1806e313..53bc816a38 100644
--- a/lib/dns/rdata/generic/rt_21.c
+++ b/lib/dns/rdata/generic/rt_21.c
@@ -218,9 +218,8 @@ tostruct_rt(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 2);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&rt->host);
-	name_duporclone(&name, mctx, &rt->host);
+	dns_name_clone(&name, &rt->host);

-	rt->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -230,13 +229,6 @@ freestruct_rt(ARGS_FREESTRUCT) {

 	REQUIRE(rt != NULL);
 	REQUIRE(rt->common.rdtype == dns_rdatatype_rt);
-
-	if (rt->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&rt->host, rt->mctx);
-	rt->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/rt_21.h b/lib/dns/rdata/generic/rt_21.h
index 7df33d1f5c..e448b3a39a 100644
--- a/lib/dns/rdata/generic/rt_21.h
+++ b/lib/dns/rdata/generic/rt_21.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_rt {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t preference;
 	dns_name_t host;
 } dns_rdata_rt_t;
diff --git a/lib/dns/rdata/generic/sig_24.c b/lib/dns/rdata/generic/sig_24.c
index 71cde4686b..49295573d1 100644
--- a/lib/dns/rdata/generic/sig_24.c
+++ b/lib/dns/rdata/generic/sig_24.c
@@ -514,15 +514,14 @@ tostruct_sig(ARGS_TOSTRUCT) {
 	dns_name_init(&signer);
 	dns_name_fromregion(&signer, &sr);
 	dns_name_init(&sig->signer);
-	name_duporclone(&signer, mctx, &sig->signer);
+	dns_name_clone(&signer, &sig->signer);
 	isc_region_consume(&sr, name_length(&sig->signer));

 	/*
 	 * Signature.
 	 */
 	sig->siglen = sr.length;
-	sig->signature = mem_maybedup(mctx, sr.base, sig->siglen);
-	sig->mctx = mctx;
+	sig->signature = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -532,16 +531,6 @@ freestruct_sig(ARGS_FREESTRUCT) {

 	REQUIRE(sig != NULL);
 	REQUIRE(sig->common.rdtype == dns_rdatatype_sig);
-
-	if (sig->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&sig->signer, sig->mctx);
-	if (sig->signature != NULL) {
-		isc_mem_free(sig->mctx, sig->signature);
-	}
-	sig->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/sig_24.h b/lib/dns/rdata/generic/sig_24.h
index 40bad221ec..ebf7d52bb8 100644
--- a/lib/dns/rdata/generic/sig_24.h
+++ b/lib/dns/rdata/generic/sig_24.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_sig_t {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_rdatatype_t covered;
 	dns_secalg_t algorithm;
 	uint8_t labels;
diff --git a/lib/dns/rdata/generic/sink_40.c b/lib/dns/rdata/generic/sink_40.c
index 0fb8aa5c07..cf3f7a5857 100644
--- a/lib/dns/rdata/generic/sink_40.c
+++ b/lib/dns/rdata/generic/sink_40.c
@@ -201,8 +201,7 @@ tostruct_sink(ARGS_TOSTRUCT) {

 	/* Data */
 	sink->datalen = sr.length;
-	sink->data = mem_maybedup(mctx, sr.base, sink->datalen);
-	sink->mctx = mctx;
+	sink->data = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -212,15 +211,6 @@ freestruct_sink(ARGS_FREESTRUCT) {

 	REQUIRE(sink != NULL);
 	REQUIRE(sink->common.rdtype == dns_rdatatype_sink);
-
-	if (sink->mctx == NULL) {
-		return;
-	}
-
-	if (sink->data != NULL) {
-		isc_mem_free(sink->mctx, sink->data);
-	}
-	sink->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/sink_40.h b/lib/dns/rdata/generic/sink_40.h
index e2615fdc31..b7e1fc3bc9 100644
--- a/lib/dns/rdata/generic/sink_40.h
+++ b/lib/dns/rdata/generic/sink_40.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_sink_t {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint8_t meaning;
 	uint8_t coding;
 	uint8_t subcoding;
diff --git a/lib/dns/rdata/generic/soa_6.c b/lib/dns/rdata/generic/soa_6.c
index bb314b824e..e985c3f515 100644
--- a/lib/dns/rdata/generic/soa_6.c
+++ b/lib/dns/rdata/generic/soa_6.c
@@ -320,12 +320,12 @@ tostruct_soa(ARGS_TOSTRUCT) {
 	dns_name_fromregion(&name, &region);
 	isc_region_consume(&region, name_length(&name));
 	dns_name_init(&soa->origin);
-	name_duporclone(&name, mctx, &soa->origin);
+	dns_name_clone(&name, &soa->origin);

 	dns_name_fromregion(&name, &region);
 	isc_region_consume(&region, name_length(&name));
 	dns_name_init(&soa->contact);
-	name_duporclone(&name, mctx, &soa->contact);
+	dns_name_clone(&name, &soa->contact);

 	soa->serial = uint32_fromregion(&region);
 	isc_region_consume(&region, 4);
@@ -341,7 +341,6 @@ tostruct_soa(ARGS_TOSTRUCT) {

 	soa->minimum = uint32_fromregion(&region);

-	soa->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -351,14 +350,6 @@ freestruct_soa(ARGS_FREESTRUCT) {

 	REQUIRE(soa != NULL);
 	REQUIRE(soa->common.rdtype == dns_rdatatype_soa);
-
-	if (soa->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&soa->origin, soa->mctx);
-	dns_name_free(&soa->contact, soa->mctx);
-	soa->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/soa_6.h b/lib/dns/rdata/generic/soa_6.h
index c6071bc067..a859352ba1 100644
--- a/lib/dns/rdata/generic/soa_6.h
+++ b/lib/dns/rdata/generic/soa_6.h
@@ -16,7 +16,6 @@

 typedef struct dns_rdata_soa {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t origin;
 	dns_name_t contact;
 	uint32_t serial;  /*%< host order */
diff --git a/lib/dns/rdata/generic/spf_99.h b/lib/dns/rdata/generic/spf_99.h
index cffe055a66..b113b35df7 100644
--- a/lib/dns/rdata/generic/spf_99.h
+++ b/lib/dns/rdata/generic/spf_99.h
@@ -20,7 +20,6 @@ typedef struct dns_rdata_spf_string {

 typedef struct dns_rdata_spf {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *txt;
 	uint16_t txt_len;
 	/* private */
diff --git a/lib/dns/rdata/generic/sshfp_44.c b/lib/dns/rdata/generic/sshfp_44.c
index fc35f54de0..e85c3cf717 100644
--- a/lib/dns/rdata/generic/sshfp_44.c
+++ b/lib/dns/rdata/generic/sshfp_44.c
@@ -214,8 +214,7 @@ tostruct_sshfp(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 1);
 	sshfp->length = region.length;

-	sshfp->digest = mem_maybedup(mctx, region.base, region.length);
-	sshfp->mctx = mctx;
+	sshfp->digest = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -225,15 +224,6 @@ freestruct_sshfp(ARGS_FREESTRUCT) {

 	REQUIRE(sshfp != NULL);
 	REQUIRE(sshfp->common.rdtype == dns_rdatatype_sshfp);
-
-	if (sshfp->mctx == NULL) {
-		return;
-	}
-
-	if (sshfp->digest != NULL) {
-		isc_mem_free(sshfp->mctx, sshfp->digest);
-	}
-	sshfp->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/sshfp_44.h b/lib/dns/rdata/generic/sshfp_44.h
index a19806fec1..7df21ed523 100644
--- a/lib/dns/rdata/generic/sshfp_44.h
+++ b/lib/dns/rdata/generic/sshfp_44.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_sshfp {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint8_t algorithm;
 	uint8_t digest_type;
 	uint16_t length;
diff --git a/lib/dns/rdata/generic/ta_32768.c b/lib/dns/rdata/generic/ta_32768.c
index 151f6b500c..9256221860 100644
--- a/lib/dns/rdata/generic/ta_32768.c
+++ b/lib/dns/rdata/generic/ta_32768.c
@@ -96,15 +96,6 @@ freestruct_ta(ARGS_FREESTRUCT) {

 	REQUIRE(ds != NULL);
 	REQUIRE(ds->common.rdtype == dns_rdatatype_ta);
-
-	if (ds->mctx == NULL) {
-		return;
-	}
-
-	if (ds->digest != NULL) {
-		isc_mem_free(ds->mctx, ds->digest);
-	}
-	ds->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/talink_58.c b/lib/dns/rdata/generic/talink_58.c
index b315b38aec..1ab80f4f49 100644
--- a/lib/dns/rdata/generic/talink_58.c
+++ b/lib/dns/rdata/generic/talink_58.c
@@ -174,14 +174,13 @@ tostruct_talink(ARGS_TOSTRUCT) {
 	dns_name_fromregion(&name, &region);
 	isc_region_consume(&region, name_length(&name));
 	dns_name_init(&talink->prev);
-	name_duporclone(&name, mctx, &talink->prev);
+	dns_name_clone(&name, &talink->prev);

 	dns_name_fromregion(&name, &region);
 	isc_region_consume(&region, name_length(&name));
 	dns_name_init(&talink->next);
-	name_duporclone(&name, mctx, &talink->next);
+	dns_name_clone(&name, &talink->next);

-	talink->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -191,14 +190,6 @@ freestruct_talink(ARGS_FREESTRUCT) {

 	REQUIRE(talink != NULL);
 	REQUIRE(talink->common.rdtype == dns_rdatatype_talink);
-
-	if (talink->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&talink->prev, talink->mctx);
-	dns_name_free(&talink->next, talink->mctx);
-	talink->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/talink_58.h b/lib/dns/rdata/generic/talink_58.h
index 5a7f0751e8..b20208efde 100644
--- a/lib/dns/rdata/generic/talink_58.h
+++ b/lib/dns/rdata/generic/talink_58.h
@@ -19,7 +19,6 @@

 typedef struct dns_rdata_talink {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t prev;
 	dns_name_t next;
 } dns_rdata_talink_t;
diff --git a/lib/dns/rdata/generic/tkey_249.c b/lib/dns/rdata/generic/tkey_249.c
index a2a44cb666..142604cc07 100644
--- a/lib/dns/rdata/generic/tkey_249.c
+++ b/lib/dns/rdata/generic/tkey_249.c
@@ -433,7 +433,7 @@ tostruct_tkey(ARGS_TOSTRUCT) {
 	dns_name_init(&alg);
 	dns_name_fromregion(&alg, &sr);
 	dns_name_init(&tkey->algorithm);
-	name_duporclone(&alg, mctx, &tkey->algorithm);
+	dns_name_clone(&alg, &tkey->algorithm);
 	isc_region_consume(&sr, name_length(&tkey->algorithm));

 	/*
@@ -470,7 +470,7 @@ tostruct_tkey(ARGS_TOSTRUCT) {
 	 * Key.
 	 */
 	INSIST(tkey->keylen + 2U <= sr.length);
-	tkey->key = mem_maybedup(mctx, sr.base, tkey->keylen);
+	tkey->key = sr.base;
 	isc_region_consume(&sr, tkey->keylen);

 	/*
@@ -483,8 +483,7 @@ tostruct_tkey(ARGS_TOSTRUCT) {
 	 * Other.
 	 */
 	INSIST(tkey->otherlen <= sr.length);
-	tkey->other = mem_maybedup(mctx, sr.base, tkey->otherlen);
-	tkey->mctx = mctx;
+	tkey->other = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -493,19 +492,6 @@ freestruct_tkey(ARGS_FREESTRUCT) {
 	dns_rdata_tkey_t *tkey = (dns_rdata_tkey_t *)source;

 	REQUIRE(tkey != NULL);
-
-	if (tkey->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&tkey->algorithm, tkey->mctx);
-	if (tkey->key != NULL) {
-		isc_mem_free(tkey->mctx, tkey->key);
-	}
-	if (tkey->other != NULL) {
-		isc_mem_free(tkey->mctx, tkey->other);
-	}
-	tkey->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/tkey_249.h b/lib/dns/rdata/generic/tkey_249.h
index 8edd074ecd..51709d116d 100644
--- a/lib/dns/rdata/generic/tkey_249.h
+++ b/lib/dns/rdata/generic/tkey_249.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_tkey {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t algorithm;
 	uint32_t inception;
 	uint32_t expire;
diff --git a/lib/dns/rdata/generic/tlsa_52.c b/lib/dns/rdata/generic/tlsa_52.c
index e0b3a308b7..0931156547 100644
--- a/lib/dns/rdata/generic/tlsa_52.c
+++ b/lib/dns/rdata/generic/tlsa_52.c
@@ -228,8 +228,7 @@ generic_tostruct_tlsa(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 1);
 	tlsa->length = region.length;

-	tlsa->data = mem_maybedup(mctx, region.base, region.length);
-	tlsa->mctx = mctx;
+	tlsa->data = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -238,15 +237,6 @@ generic_freestruct_tlsa(ARGS_FREESTRUCT) {
 	dns_rdata_tlsa_t *tlsa = source;

 	REQUIRE(tlsa != NULL);
-
-	if (tlsa->mctx == NULL) {
-		return;
-	}
-
-	if (tlsa->data != NULL) {
-		isc_mem_free(tlsa->mctx, tlsa->data);
-	}
-	tlsa->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/tlsa_52.h b/lib/dns/rdata/generic/tlsa_52.h
index fd75f958f4..ea95aee950 100644
--- a/lib/dns/rdata/generic/tlsa_52.h
+++ b/lib/dns/rdata/generic/tlsa_52.h
@@ -18,7 +18,6 @@
  */
 typedef struct dns_rdata_tlsa {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint8_t usage;
 	uint8_t selector;
 	uint8_t match;
diff --git a/lib/dns/rdata/generic/txt_16.c b/lib/dns/rdata/generic/txt_16.c
index d4e9878aba..8584eaac28 100644
--- a/lib/dns/rdata/generic/txt_16.c
+++ b/lib/dns/rdata/generic/txt_16.c
@@ -165,9 +165,8 @@ generic_tostruct_txt(ARGS_TOSTRUCT) {

 	dns_rdata_toregion(rdata, &r);
 	txt->txt_len = r.length;
-	txt->txt = mem_maybedup(mctx, r.base, r.length);
+	txt->txt = r.base;
 	txt->offset = 0;
-	txt->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -176,15 +175,6 @@ generic_freestruct_txt(ARGS_FREESTRUCT) {
 	dns_rdata_txt_t *txt = source;

 	REQUIRE(txt != NULL);
-
-	if (txt->mctx == NULL) {
-		return;
-	}
-
-	if (txt->txt != NULL) {
-		isc_mem_free(txt->mctx, txt->txt);
-	}
-	txt->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/txt_16.h b/lib/dns/rdata/generic/txt_16.h
index c27b0a2c40..45790f0c98 100644
--- a/lib/dns/rdata/generic/txt_16.h
+++ b/lib/dns/rdata/generic/txt_16.h
@@ -21,7 +21,6 @@ typedef struct dns_rdata_txt_string {

 typedef struct dns_rdata_txt {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *txt;
 	uint16_t txt_len;
 	/* private */
diff --git a/lib/dns/rdata/generic/uri_256.c b/lib/dns/rdata/generic/uri_256.c
index 6984e50e97..f586f8f1e8 100644
--- a/lib/dns/rdata/generic/uri_256.c
+++ b/lib/dns/rdata/generic/uri_256.c
@@ -228,8 +228,7 @@ tostruct_uri(ARGS_TOSTRUCT) {
 	 * Target URI
 	 */
 	uri->tgt_len = sr.length;
-	uri->target = mem_maybedup(mctx, sr.base, sr.length);
-	uri->mctx = mctx;
+	uri->target = sr.base;
 	return ISC_R_SUCCESS;
 }

@@ -239,15 +238,6 @@ freestruct_uri(ARGS_FREESTRUCT) {

 	REQUIRE(uri != NULL);
 	REQUIRE(uri->common.rdtype == dns_rdatatype_uri);
-
-	if (uri->mctx == NULL) {
-		return;
-	}
-
-	if (uri->target != NULL) {
-		isc_mem_free(uri->mctx, uri->target);
-	}
-	uri->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/uri_256.h b/lib/dns/rdata/generic/uri_256.h
index be99e95d97..7c89575335 100644
--- a/lib/dns/rdata/generic/uri_256.h
+++ b/lib/dns/rdata/generic/uri_256.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_uri {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t priority;
 	uint16_t weight;
 	unsigned char *target;
diff --git a/lib/dns/rdata/generic/x25_19.c b/lib/dns/rdata/generic/x25_19.c
index 34e8ed53e2..631a26de3a 100644
--- a/lib/dns/rdata/generic/x25_19.c
+++ b/lib/dns/rdata/generic/x25_19.c
@@ -150,8 +150,7 @@ tostruct_x25(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &r);
 	x25->x25_len = uint8_fromregion(&r);
 	isc_region_consume(&r, 1);
-	x25->x25 = mem_maybedup(mctx, r.base, x25->x25_len);
-	x25->mctx = mctx;
+	x25->x25 = r.base;
 	return ISC_R_SUCCESS;
 }

@@ -161,15 +160,6 @@ freestruct_x25(ARGS_FREESTRUCT) {

 	REQUIRE(x25 != NULL);
 	REQUIRE(x25->common.rdtype == dns_rdatatype_x25);
-
-	if (x25->mctx == NULL) {
-		return;
-	}
-
-	if (x25->x25 != NULL) {
-		isc_mem_free(x25->mctx, x25->x25);
-	}
-	x25->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/x25_19.h b/lib/dns/rdata/generic/x25_19.h
index 74a5ee1d08..7039780a45 100644
--- a/lib/dns/rdata/generic/x25_19.h
+++ b/lib/dns/rdata/generic/x25_19.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_x25 {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *x25;
 	uint8_t x25_len;
 } dns_rdata_x25_t;
diff --git a/lib/dns/rdata/generic/zonemd_63.c b/lib/dns/rdata/generic/zonemd_63.c
index 02a90dbd92..b3e5550e16 100644
--- a/lib/dns/rdata/generic/zonemd_63.c
+++ b/lib/dns/rdata/generic/zonemd_63.c
@@ -268,8 +268,7 @@ tostruct_zonemd(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 1);
 	zonemd->length = region.length;

-	zonemd->digest = mem_maybedup(mctx, region.base, region.length);
-	zonemd->mctx = mctx;
+	zonemd->digest = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -279,15 +278,6 @@ freestruct_zonemd(ARGS_FREESTRUCT) {

 	REQUIRE(zonemd != NULL);
 	REQUIRE(zonemd->common.rdtype == dns_rdatatype_zonemd);
-
-	if (zonemd->mctx == NULL) {
-		return;
-	}
-
-	if (zonemd->digest != NULL) {
-		isc_mem_free(zonemd->mctx, zonemd->digest);
-	}
-	zonemd->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/generic/zonemd_63.h b/lib/dns/rdata/generic/zonemd_63.h
index 5856b0d522..21c5c56701 100644
--- a/lib/dns/rdata/generic/zonemd_63.h
+++ b/lib/dns/rdata/generic/zonemd_63.h
@@ -22,7 +22,6 @@
  */
 typedef struct dns_rdata_zonemd {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint32_t serial;
 	uint8_t scheme;
 	uint8_t digest_type;
diff --git a/lib/dns/rdata/hs_4/a_1.c b/lib/dns/rdata/hs_4/a_1.c
index a516a6f345..c20ea41d70 100644
--- a/lib/dns/rdata/hs_4/a_1.c
+++ b/lib/dns/rdata/hs_4/a_1.c
@@ -156,8 +156,6 @@ tostruct_hs_a(ARGS_TOSTRUCT) {
 	REQUIRE(rdata->length == 4);
 	REQUIRE(a != NULL);

-	UNUSED(mctx);
-
 	DNS_RDATACOMMON_INIT(a, rdata->type, rdata->rdclass);

 	dns_rdata_toregion(rdata, &region);
diff --git a/lib/dns/rdata/in_1/a6_38.c b/lib/dns/rdata/in_1/a6_38.c
index 99f9e3cb9a..69e7bc178f 100644
--- a/lib/dns/rdata/in_1/a6_38.c
+++ b/lib/dns/rdata/in_1/a6_38.c
@@ -374,9 +374,8 @@ tostruct_in_a6(ARGS_TOSTRUCT) {
 	if (a6->prefixlen != 0) {
 		dns_name_init(&name);
 		dns_name_fromregion(&name, &r);
-		name_duporclone(&name, mctx, &a6->prefix);
+		dns_name_clone(&name, &a6->prefix);
 	}
-	a6->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -387,15 +386,6 @@ freestruct_in_a6(ARGS_FREESTRUCT) {
 	REQUIRE(a6 != NULL);
 	REQUIRE(a6->common.rdclass == dns_rdataclass_in);
 	REQUIRE(a6->common.rdtype == dns_rdatatype_a6);
-
-	if (a6->mctx == NULL) {
-		return;
-	}
-
-	if (dns_name_dynamic(&a6->prefix)) {
-		dns_name_free(&a6->prefix, a6->mctx);
-	}
-	a6->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/a6_38.h b/lib/dns/rdata/in_1/a6_38.h
index 7c09cc59fe..f76b765a5a 100644
--- a/lib/dns/rdata/in_1/a6_38.h
+++ b/lib/dns/rdata/in_1/a6_38.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_in_a6 {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t prefix;
 	uint8_t prefixlen;
 	struct in6_addr in6_addr;
diff --git a/lib/dns/rdata/in_1/a_1.c b/lib/dns/rdata/in_1/a_1.c
index 4eb059e5ee..280063586c 100644
--- a/lib/dns/rdata/in_1/a_1.c
+++ b/lib/dns/rdata/in_1/a_1.c
@@ -157,8 +157,6 @@ tostruct_in_a(ARGS_TOSTRUCT) {
 	REQUIRE(rdata->rdclass == dns_rdataclass_in);
 	REQUIRE(rdata->length == 4);

-	UNUSED(mctx);
-
 	DNS_RDATACOMMON_INIT(a, rdata->type, rdata->rdclass);

 	dns_rdata_toregion(rdata, &region);
diff --git a/lib/dns/rdata/in_1/aaaa_28.c b/lib/dns/rdata/in_1/aaaa_28.c
index 9da515c008..f2794a7c68 100644
--- a/lib/dns/rdata/in_1/aaaa_28.c
+++ b/lib/dns/rdata/in_1/aaaa_28.c
@@ -169,8 +169,6 @@ tostruct_in_aaaa(ARGS_TOSTRUCT) {
 	REQUIRE(aaaa != NULL);
 	REQUIRE(rdata->length == 16);

-	UNUSED(mctx);
-
 	DNS_RDATACOMMON_INIT(aaaa, rdata->type, rdata->rdclass);

 	dns_rdata_toregion(rdata, &r);
diff --git a/lib/dns/rdata/in_1/apl_42.c b/lib/dns/rdata/in_1/apl_42.c
index ba0d3d041b..7d414965b5 100644
--- a/lib/dns/rdata/in_1/apl_42.c
+++ b/lib/dns/rdata/in_1/apl_42.c
@@ -292,9 +292,8 @@ tostruct_in_apl(ARGS_TOSTRUCT) {

 	dns_rdata_toregion(rdata, &r);
 	apl->apl_len = r.length;
-	apl->apl = mem_maybedup(mctx, r.base, r.length);
+	apl->apl = r.base;
 	apl->offset = 0;
-	apl->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -305,14 +304,6 @@ freestruct_in_apl(ARGS_FREESTRUCT) {
 	REQUIRE(apl != NULL);
 	REQUIRE(apl->common.rdtype == dns_rdatatype_apl);
 	REQUIRE(apl->common.rdclass == dns_rdataclass_in);
-
-	if (apl->mctx == NULL) {
-		return;
-	}
-	if (apl->apl != NULL) {
-		isc_mem_free(apl->mctx, apl->apl);
-	}
-	apl->mctx = NULL;
 }

 isc_result_t
diff --git a/lib/dns/rdata/in_1/apl_42.h b/lib/dns/rdata/in_1/apl_42.h
index 2408e6c2ed..322bd9c42b 100644
--- a/lib/dns/rdata/in_1/apl_42.h
+++ b/lib/dns/rdata/in_1/apl_42.h
@@ -24,7 +24,6 @@ typedef struct dns_rdata_apl_ent {

 typedef struct dns_rdata_in_apl {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	/* type & class specific elements */
 	unsigned char *apl;
 	uint16_t apl_len;
diff --git a/lib/dns/rdata/in_1/atma_34.c b/lib/dns/rdata/in_1/atma_34.c
index d4cf53e2bc..c5315678c3 100644
--- a/lib/dns/rdata/in_1/atma_34.c
+++ b/lib/dns/rdata/in_1/atma_34.c
@@ -230,8 +230,7 @@ tostruct_in_atma(ARGS_TOSTRUCT) {
 	atma->format = r.base[0];
 	isc_region_consume(&r, 1);
 	atma->atma_len = r.length;
-	atma->atma = mem_maybedup(mctx, r.base, r.length);
-	atma->mctx = mctx;
+	atma->atma = r.base;
 	return ISC_R_SUCCESS;
 }

@@ -242,15 +241,6 @@ freestruct_in_atma(ARGS_FREESTRUCT) {
 	REQUIRE(atma != NULL);
 	REQUIRE(atma->common.rdclass == dns_rdataclass_in);
 	REQUIRE(atma->common.rdtype == dns_rdatatype_atma);
-
-	if (atma->mctx == NULL) {
-		return;
-	}
-
-	if (atma->atma != NULL) {
-		isc_mem_free(atma->mctx, atma->atma);
-	}
-	atma->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/atma_34.h b/lib/dns/rdata/in_1/atma_34.h
index 412b4284ce..2a5be46a2b 100644
--- a/lib/dns/rdata/in_1/atma_34.h
+++ b/lib/dns/rdata/in_1/atma_34.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_in_atma {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char format;
 	unsigned char *atma;
 	uint16_t atma_len;
diff --git a/lib/dns/rdata/in_1/dhcid_49.c b/lib/dns/rdata/in_1/dhcid_49.c
index ff2d28da93..f047e54b27 100644
--- a/lib/dns/rdata/in_1/dhcid_49.c
+++ b/lib/dns/rdata/in_1/dhcid_49.c
@@ -147,9 +147,8 @@ tostruct_in_dhcid(ARGS_TOSTRUCT) {

 	dns_rdata_toregion(rdata, &region);

-	dhcid->dhcid = mem_maybedup(mctx, region.base, region.length);
+	dhcid->dhcid = region.base;
 	dhcid->length = region.length;
-	dhcid->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -160,15 +159,6 @@ freestruct_in_dhcid(ARGS_FREESTRUCT) {
 	REQUIRE(dhcid != NULL);
 	REQUIRE(dhcid->common.rdtype == dns_rdatatype_dhcid);
 	REQUIRE(dhcid->common.rdclass == dns_rdataclass_in);
-
-	if (dhcid->mctx == NULL) {
-		return;
-	}
-
-	if (dhcid->dhcid != NULL) {
-		isc_mem_free(dhcid->mctx, dhcid->dhcid);
-	}
-	dhcid->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/dhcid_49.h b/lib/dns/rdata/in_1/dhcid_49.h
index 338476ea6d..fbc7326608 100644
--- a/lib/dns/rdata/in_1/dhcid_49.h
+++ b/lib/dns/rdata/in_1/dhcid_49.h
@@ -16,7 +16,6 @@

 typedef struct dns_rdata_in_dhcid {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *dhcid;
 	unsigned int length;
 } dns_rdata_in_dhcid_t;
diff --git a/lib/dns/rdata/in_1/eid_31.c b/lib/dns/rdata/in_1/eid_31.c
index 461d770c01..42370ecb93 100644
--- a/lib/dns/rdata/in_1/eid_31.c
+++ b/lib/dns/rdata/in_1/eid_31.c
@@ -137,8 +137,7 @@ tostruct_in_eid(ARGS_TOSTRUCT) {

 	dns_rdata_toregion(rdata, &r);
 	eid->eid_len = r.length;
-	eid->eid = mem_maybedup(mctx, r.base, r.length);
-	eid->mctx = mctx;
+	eid->eid = r.base;
 	return ISC_R_SUCCESS;
 }

@@ -149,15 +148,6 @@ freestruct_in_eid(ARGS_FREESTRUCT) {
 	REQUIRE(eid != NULL);
 	REQUIRE(eid->common.rdclass == dns_rdataclass_in);
 	REQUIRE(eid->common.rdtype == dns_rdatatype_eid);
-
-	if (eid->mctx == NULL) {
-		return;
-	}
-
-	if (eid->eid != NULL) {
-		isc_mem_free(eid->mctx, eid->eid);
-	}
-	eid->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/eid_31.h b/lib/dns/rdata/in_1/eid_31.h
index d32bd3eccc..e0a7a56aed 100644
--- a/lib/dns/rdata/in_1/eid_31.h
+++ b/lib/dns/rdata/in_1/eid_31.h
@@ -19,7 +19,6 @@

 typedef struct dns_rdata_in_eid {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *eid;
 	uint16_t eid_len;
 } dns_rdata_in_eid_t;
diff --git a/lib/dns/rdata/in_1/kx_36.c b/lib/dns/rdata/in_1/kx_36.c
index 60ba17e558..639028d2cd 100644
--- a/lib/dns/rdata/in_1/kx_36.c
+++ b/lib/dns/rdata/in_1/kx_36.c
@@ -196,8 +196,7 @@ tostruct_in_kx(ARGS_TOSTRUCT) {

 	dns_name_fromregion(&name, &region);
 	dns_name_init(&kx->exchange);
-	name_duporclone(&name, mctx, &kx->exchange);
-	kx->mctx = mctx;
+	dns_name_clone(&name, &kx->exchange);
 	return ISC_R_SUCCESS;
 }

@@ -208,13 +207,6 @@ freestruct_in_kx(ARGS_FREESTRUCT) {
 	REQUIRE(kx != NULL);
 	REQUIRE(kx->common.rdclass == dns_rdataclass_in);
 	REQUIRE(kx->common.rdtype == dns_rdatatype_kx);
-
-	if (kx->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&kx->exchange, kx->mctx);
-	kx->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/kx_36.h b/lib/dns/rdata/in_1/kx_36.h
index 9e2243b180..179c7187f3 100644
--- a/lib/dns/rdata/in_1/kx_36.h
+++ b/lib/dns/rdata/in_1/kx_36.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_in_kx {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t preference;
 	dns_name_t exchange;
 } dns_rdata_in_kx_t;
diff --git a/lib/dns/rdata/in_1/nimloc_32.c b/lib/dns/rdata/in_1/nimloc_32.c
index 7f4c5370f6..ed45d387df 100644
--- a/lib/dns/rdata/in_1/nimloc_32.c
+++ b/lib/dns/rdata/in_1/nimloc_32.c
@@ -137,8 +137,7 @@ tostruct_in_nimloc(ARGS_TOSTRUCT) {

 	dns_rdata_toregion(rdata, &r);
 	nimloc->nimloc_len = r.length;
-	nimloc->nimloc = mem_maybedup(mctx, r.base, r.length);
-	nimloc->mctx = mctx;
+	nimloc->nimloc = r.base;
 	return ISC_R_SUCCESS;
 }

@@ -149,15 +148,6 @@ freestruct_in_nimloc(ARGS_FREESTRUCT) {
 	REQUIRE(nimloc != NULL);
 	REQUIRE(nimloc->common.rdclass == dns_rdataclass_in);
 	REQUIRE(nimloc->common.rdtype == dns_rdatatype_nimloc);
-
-	if (nimloc->mctx == NULL) {
-		return;
-	}
-
-	if (nimloc->nimloc != NULL) {
-		isc_mem_free(nimloc->mctx, nimloc->nimloc);
-	}
-	nimloc->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/nimloc_32.h b/lib/dns/rdata/in_1/nimloc_32.h
index faa919638a..524082eb62 100644
--- a/lib/dns/rdata/in_1/nimloc_32.h
+++ b/lib/dns/rdata/in_1/nimloc_32.h
@@ -19,7 +19,6 @@

 typedef struct dns_rdata_in_nimloc {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *nimloc;
 	uint16_t nimloc_len;
 } dns_rdata_in_nimloc_t;
diff --git a/lib/dns/rdata/in_1/nsap-ptr_23.c b/lib/dns/rdata/in_1/nsap-ptr_23.c
index de94aaab24..eda4f6e44c 100644
--- a/lib/dns/rdata/in_1/nsap-ptr_23.c
+++ b/lib/dns/rdata/in_1/nsap-ptr_23.c
@@ -157,8 +157,7 @@ tostruct_in_nsap_ptr(ARGS_TOSTRUCT) {
 	dns_rdata_toregion(rdata, &region);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&nsap_ptr->owner);
-	name_duporclone(&name, mctx, &nsap_ptr->owner);
-	nsap_ptr->mctx = mctx;
+	dns_name_clone(&name, &nsap_ptr->owner);
 	return ISC_R_SUCCESS;
 }

@@ -169,13 +168,6 @@ freestruct_in_nsap_ptr(ARGS_FREESTRUCT) {
 	REQUIRE(nsap_ptr != NULL);
 	REQUIRE(nsap_ptr->common.rdclass == dns_rdataclass_in);
 	REQUIRE(nsap_ptr->common.rdtype == dns_rdatatype_nsap_ptr);
-
-	if (nsap_ptr->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&nsap_ptr->owner, nsap_ptr->mctx);
-	nsap_ptr->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/nsap-ptr_23.h b/lib/dns/rdata/in_1/nsap-ptr_23.h
index 45e5b1692c..a46df0ab8b 100644
--- a/lib/dns/rdata/in_1/nsap-ptr_23.h
+++ b/lib/dns/rdata/in_1/nsap-ptr_23.h
@@ -18,6 +18,5 @@

 typedef struct dns_rdata_in_nsap_ptr {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	dns_name_t owner;
 } dns_rdata_in_nsap_ptr_t;
diff --git a/lib/dns/rdata/in_1/nsap_22.c b/lib/dns/rdata/in_1/nsap_22.c
index b880d8f094..92d69a84f8 100644
--- a/lib/dns/rdata/in_1/nsap_22.c
+++ b/lib/dns/rdata/in_1/nsap_22.c
@@ -172,8 +172,7 @@ tostruct_in_nsap(ARGS_TOSTRUCT) {

 	dns_rdata_toregion(rdata, &r);
 	nsap->nsap_len = r.length;
-	nsap->nsap = mem_maybedup(mctx, r.base, r.length);
-	nsap->mctx = mctx;
+	nsap->nsap = r.base;
 	return ISC_R_SUCCESS;
 }

@@ -184,15 +183,6 @@ freestruct_in_nsap(ARGS_FREESTRUCT) {
 	REQUIRE(nsap != NULL);
 	REQUIRE(nsap->common.rdclass == dns_rdataclass_in);
 	REQUIRE(nsap->common.rdtype == dns_rdatatype_nsap);
-
-	if (nsap->mctx == NULL) {
-		return;
-	}
-
-	if (nsap->nsap != NULL) {
-		isc_mem_free(nsap->mctx, nsap->nsap);
-	}
-	nsap->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/nsap_22.h b/lib/dns/rdata/in_1/nsap_22.h
index fd5803c6f7..44dab866f4 100644
--- a/lib/dns/rdata/in_1/nsap_22.h
+++ b/lib/dns/rdata/in_1/nsap_22.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_in_nsap {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	unsigned char *nsap;
 	uint16_t nsap_len;
 } dns_rdata_in_nsap_t;
diff --git a/lib/dns/rdata/in_1/px_26.c b/lib/dns/rdata/in_1/px_26.c
index 1cd16839f8..6837409b2f 100644
--- a/lib/dns/rdata/in_1/px_26.c
+++ b/lib/dns/rdata/in_1/px_26.c
@@ -269,13 +269,12 @@ tostruct_in_px(ARGS_TOSTRUCT) {
 	dns_name_fromregion(&name, &region);

 	dns_name_init(&px->map822);
-	name_duporclone(&name, mctx, &px->map822);
+	dns_name_clone(&name, &px->map822);
 	isc_region_consume(&region, name_length(&px->map822));

 	dns_name_init(&px->mapx400);
-	name_duporclone(&name, mctx, &px->mapx400);
+	dns_name_clone(&name, &px->mapx400);

-	px->mctx = mctx;
 	return ISC_R_SUCCESS;
 }

@@ -286,14 +285,6 @@ freestruct_in_px(ARGS_FREESTRUCT) {
 	REQUIRE(px != NULL);
 	REQUIRE(px->common.rdclass == dns_rdataclass_in);
 	REQUIRE(px->common.rdtype == dns_rdatatype_px);
-
-	if (px->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&px->map822, px->mctx);
-	dns_name_free(&px->mapx400, px->mctx);
-	px->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/px_26.h b/lib/dns/rdata/in_1/px_26.h
index 36a1c0e400..8524b853e8 100644
--- a/lib/dns/rdata/in_1/px_26.h
+++ b/lib/dns/rdata/in_1/px_26.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_in_px {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t preference;
 	dns_name_t map822;
 	dns_name_t mapx400;
diff --git a/lib/dns/rdata/in_1/srv_33.c b/lib/dns/rdata/in_1/srv_33.c
index a61360c4f3..4c3e5d7f87 100644
--- a/lib/dns/rdata/in_1/srv_33.c
+++ b/lib/dns/rdata/in_1/srv_33.c
@@ -286,8 +286,7 @@ tostruct_in_srv(ARGS_TOSTRUCT) {
 	isc_region_consume(&region, 2);
 	dns_name_fromregion(&name, &region);
 	dns_name_init(&srv->target);
-	name_duporclone(&name, mctx, &srv->target);
-	srv->mctx = mctx;
+	dns_name_clone(&name, &srv->target);
 	return ISC_R_SUCCESS;
 }

@@ -298,13 +297,6 @@ freestruct_in_srv(ARGS_FREESTRUCT) {
 	REQUIRE(srv != NULL);
 	REQUIRE(srv->common.rdclass == dns_rdataclass_in);
 	REQUIRE(srv->common.rdtype == dns_rdatatype_srv);
-
-	if (srv->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&srv->target, srv->mctx);
-	srv->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/srv_33.h b/lib/dns/rdata/in_1/srv_33.h
index fbfa92c726..28ff70fc41 100644
--- a/lib/dns/rdata/in_1/srv_33.h
+++ b/lib/dns/rdata/in_1/srv_33.h
@@ -18,7 +18,6 @@

 typedef struct dns_rdata_in_srv {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t priority;
 	uint16_t weight;
 	uint16_t port;
diff --git a/lib/dns/rdata/in_1/svcb_64.c b/lib/dns/rdata/in_1/svcb_64.c
index e9e0e21708..09cc620da1 100644
--- a/lib/dns/rdata/in_1/svcb_64.c
+++ b/lib/dns/rdata/in_1/svcb_64.c
@@ -1054,12 +1054,11 @@ generic_tostruct_in_svcb(ARGS_TOSTRUCT) {
 	dns_name_fromregion(&name, &region);
 	isc_region_consume(&region, name_length(&name));

-	name_duporclone(&name, mctx, &svcb->svcdomain);
+	dns_name_clone(&name, &svcb->svcdomain);
 	svcb->svclen = region.length;
-	svcb->svc = mem_maybedup(mctx, region.base, region.length);
+	svcb->svc = region.base;

 	svcb->offset = 0;
-	svcb->mctx = mctx;

 	return ISC_R_SUCCESS;
 }
@@ -1081,14 +1080,6 @@ generic_freestruct_in_svcb(ARGS_FREESTRUCT) {
 	dns_rdata_in_svcb_t *svcb = source;

 	REQUIRE(svcb != NULL);
-
-	if (svcb->mctx == NULL) {
-		return;
-	}
-
-	dns_name_free(&svcb->svcdomain, svcb->mctx);
-	isc_mem_free(svcb->mctx, svcb->svc);
-	svcb->mctx = NULL;
 }

 static void
diff --git a/lib/dns/rdata/in_1/svcb_64.h b/lib/dns/rdata/in_1/svcb_64.h
index c861716c35..bacb9bfe25 100644
--- a/lib/dns/rdata/in_1/svcb_64.h
+++ b/lib/dns/rdata/in_1/svcb_64.h
@@ -19,7 +19,6 @@

 typedef struct dns_rdata_in_svcb {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	uint16_t priority;
 	dns_name_t svcdomain;
 	unsigned char *svc;
diff --git a/lib/dns/rdata/in_1/wks_11.c b/lib/dns/rdata/in_1/wks_11.c
index 0a49e0be19..55b2d4b71b 100644
--- a/lib/dns/rdata/in_1/wks_11.c
+++ b/lib/dns/rdata/in_1/wks_11.c
@@ -314,8 +314,7 @@ tostruct_in_wks(ARGS_TOSTRUCT) {
 	wks->protocol = uint8_fromregion(&region);
 	isc_region_consume(&region, 1);
 	wks->map_len = region.length;
-	wks->map = mem_maybedup(mctx, region.base, region.length);
-	wks->mctx = mctx;
+	wks->map = region.base;
 	return ISC_R_SUCCESS;
 }

@@ -326,15 +325,6 @@ freestruct_in_wks(ARGS_FREESTRUCT) {
 	REQUIRE(wks != NULL);
 	REQUIRE(wks->common.rdtype == dns_rdatatype_wks);
 	REQUIRE(wks->common.rdclass == dns_rdataclass_in);
-
-	if (wks->mctx == NULL) {
-		return;
-	}
-
-	if (wks->map != NULL) {
-		isc_mem_free(wks->mctx, wks->map);
-	}
-	wks->mctx = NULL;
 }

 static isc_result_t
diff --git a/lib/dns/rdata/in_1/wks_11.h b/lib/dns/rdata/in_1/wks_11.h
index 8863725aa5..1008d831ca 100644
--- a/lib/dns/rdata/in_1/wks_11.h
+++ b/lib/dns/rdata/in_1/wks_11.h
@@ -15,7 +15,6 @@

 typedef struct dns_rdata_in_wks {
 	dns_rdatacommon_t common;
-	isc_mem_t *mctx;
 	struct in_addr in_addr;
 	uint16_t protocol;
 	unsigned char *map;
diff --git a/lib/dns/soa.c b/lib/dns/soa.c
index ba37fc9ea0..98ebb02c3d 100644
--- a/lib/dns/soa.c
+++ b/lib/dns/soa.c
@@ -71,7 +71,6 @@ dns_soa_buildrdata(const dns_name_t *origin, const dns_name_t *contact,

 	soa.common.rdtype = dns_rdatatype_soa;
 	soa.common.rdclass = rdclass;
-	soa.mctx = NULL;
 	soa.serial = serial;
 	soa.refresh = refresh;
 	soa.retry = retry;
diff --git a/lib/dns/tkey.c b/lib/dns/tkey.c
index e3d533de32..f614a76ce9 100644
--- a/lib/dns/tkey.c
+++ b/lib/dns/tkey.c
@@ -232,14 +232,14 @@ process_gsstkey(dns_message_t *msg, dns_name_t *name, dns_rdata_tkey_t *tkeyin,
 	}

 	if (outtoken != NULL) {
-		tkeyout->key = isc_mem_get(tkeyout->mctx,
+		tkeyout->key = isc_mem_get(msg->mctx,
 					   isc_buffer_usedlength(outtoken));
 		tkeyout->keylen = isc_buffer_usedlength(outtoken);
 		memmove(tkeyout->key, isc_buffer_base(outtoken),
 			isc_buffer_usedlength(outtoken));
 		isc_buffer_free(&outtoken);
 	} else {
-		tkeyout->key = isc_mem_get(tkeyout->mctx, tkeyin->keylen);
+		tkeyout->key = isc_mem_get(msg->mctx, tkeyin->keylen);
 		tkeyout->keylen = tkeyin->keylen;
 		memmove(tkeyout->key, tkeyin->key, tkeyin->keylen);
 	}
@@ -390,7 +390,6 @@ dns_tkey_processquery(dns_message_t *msg, dns_tkeyctx_t *tctx,
 	tkeyout = (dns_rdata_tkey_t){
 		.common.rdclass = tkeyin.common.rdclass,
 		.common.rdtype = tkeyin.common.rdtype,
-		.mctx = msg->mctx,
 		.algorithm = DNS_NAME_INITEMPTY,
 		.mode = tkeyin.mode,
 	};
@@ -473,7 +472,7 @@ dns_tkey_processquery(dns_message_t *msg, dns_tkeyctx_t *tctx,
 				      tkeyout.common.rdtype, &tkeyout,
 				      &tkeyoutbuf);
 	if (tkeyout.key != NULL) {
-		isc_mem_put(tkeyout.mctx, tkeyout.key, tkeyout.keylen);
+		isc_mem_put(msg->mctx, tkeyout.key, tkeyout.keylen);
 	}
 	CHECK(result);

diff --git a/lib/dns/tsig.c b/lib/dns/tsig.c
index cd40d9619b..efd6fb7d95 100644
--- a/lib/dns/tsig.c
+++ b/lib/dns/tsig.c
@@ -632,7 +632,6 @@ dns_tsig_sign(dns_message_t *msg) {

 	now = msg->fuzzing ? msg->fuzztime : isc_stdtime_now();
 	tsig = (dns_rdata_any_tsig_t){
-		.mctx = mctx,
 		.common.rdclass = dns_rdataclass_any,
 		.common.rdtype = dns_rdatatype_tsig,
 		.timesigned = now + msg->timeadjust,
diff --git a/lib/dns/zone.c b/lib/dns/zone.c
index 411236d365..31df08cf5f 100644
--- a/lib/dns/zone.c
+++ b/lib/dns/zone.c
@@ -3565,7 +3565,7 @@ load_secroots(dns_zone_t *zone, dns_name_t *name, dns_rdataset_t *rdataset) {
 		}

 		/* Convert keydata to dnskey. */
-		dns_keydata_todnskey(&keydata, &dnskey, NULL);
+		dns_keydata_todnskey(&keydata, &dnskey);

 		/* Add to keytables. */
 		trusted++;
@@ -8696,7 +8696,7 @@ normalize_key(dns_rdata_t *rr, dns_rdata_t *target, unsigned char *data,
 			return result;
 		}
 		RUNTIME_CHECK(result == ISC_R_SUCCESS);
-		dns_keydata_todnskey(&keydata, &dnskey, NULL);
+		dns_keydata_todnskey(&keydata, &dnskey);
 		result = dns_rdata_fromstruct(target, rr->rdclass,
 					      dns_rdatatype_dnskey, &dnskey,
 					      &buf);
@@ -8908,7 +8908,7 @@ revocable(dns_zonefetch_t *fetch, dns_rdata_keydata_t *keydata) {

 	/* Generate a key from keydata */
 	isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
-	dns_keydata_todnskey(keydata, &dnskey, NULL);
+	dns_keydata_todnskey(keydata, &dnskey);

 	result = dns_rdata_fromstruct(&rr, keydata->common.rdclass,
 				      dns_rdatatype_dnskey, &dnskey, &keyb);
@@ -9214,7 +9214,7 @@ anchors_done:
 		result = dns_rdata_tostruct(&keydatarr, &keydata);
 		RUNTIME_CHECK(result == ISC_R_SUCCESS);

-		dns_keydata_todnskey(&keydata, &dnskey, NULL);
+		dns_keydata_todnskey(&keydata, &dnskey);
 		result = compute_tag(&dnskey, &keytag);
 		if (result != ISC_R_SUCCESS) {
 			/*
@@ -9560,8 +9560,7 @@ anchors_done:
 			/* Convert DNSKEY to KEYDATA */
 			result = dns_rdata_tostruct(&dnskeyrr, &dnskey);
 			RUNTIME_CHECK(result == ISC_R_SUCCESS);
-			dns_keydata_fromdnskey(&keydata, &dnskey, 0, 0, 0,
-					       NULL);
+			dns_keydata_fromdnskey(&keydata, &dnskey, 0, 0, 0);
 			keydata.addhd = initializing
 						? now
 						: now + dns_zone_mkey_month;
@@ -20484,7 +20483,6 @@ dns_zone_setnsec3param(dns_zone_t *zone, uint8_t hash, uint8_t flags,
 	} else {
 		param.common.rdclass = zone->rdclass;
 		param.common.rdtype = dns_rdatatype_nsec3param;
-		param.mctx = NULL;
 		/*
 		 * nsec3 specific param set in
 		 * dns__zone_lookup_nsec3param()
diff --git a/lib/dns/zoneverify.c b/lib/dns/zoneverify.c
index cebfb3c09a..7be5c7feea 100644
--- a/lib/dns/zoneverify.c
+++ b/lib/dns/zoneverify.c
@@ -1581,7 +1581,6 @@ check_dnskey(vctx_t *vctx) {
 		} else {
 			check_dnskey_sigs(vctx, &dnskey, &rdata, is_ksk);
 		}
-		dns_rdata_freestruct(&dnskey);
 	}

 	return ISC_R_SUCCESS;
diff --git a/lib/ns/query.c b/lib/ns/query.c
index a10474d922..72c1f2403e 100644
--- a/lib/ns/query.c
+++ b/lib/ns/query.c
@@ -4061,7 +4061,6 @@ rpz_rewrite(ns_client_t *client, dns_rdatatype_t qtype, isc_result_t qresult,
 			 * Do nothing about "NS ."
 			 */
 			if (dns_name_isroot(&ns.name)) {
-				dns_rdata_freestruct(&ns);
 				result = dns_rdataset_next(st->r.ns_rdataset);
 				continue;
 			}
@@ -4070,26 +4069,18 @@ rpz_rewrite(ns_client_t *client, dns_rdatatype_t qtype, isc_result_t qresult,
 			 * during a previous recursion.
 			 */
 			if ((st->state & DNS_RPZ_DONE_NSDNAME) == 0) {
-				result = rpz_rewrite_name(
-					client, &ns.name, qtype,
-					DNS_RPZ_TYPE_NSDNAME, DNS_RPZ_ALL_ZBITS,
-					&rdataset);
-				if (result != ISC_R_SUCCESS) {
-					dns_rdata_freestruct(&ns);
-					goto cleanup;
-				}
+				CHECK(rpz_rewrite_name(client, &ns.name, qtype,
+						       DNS_RPZ_TYPE_NSDNAME,
+						       DNS_RPZ_ALL_ZBITS,
+						       &rdataset));
 				st->state |= DNS_RPZ_DONE_NSDNAME;
 			}
 			/*
 			 * Check all IP addresses for this NS name.
 			 */
-			result = rpz_rewrite_ip_rrsets(client, &ns.name, qtype,
-						       DNS_RPZ_TYPE_NSIP,
-						       &rdataset, resuming);
-			dns_rdata_freestruct(&ns);
-			if (result != ISC_R_SUCCESS) {
-				goto cleanup;
-			}
+			CHECK(rpz_rewrite_ip_rrsets(client, &ns.name, qtype,
+						    DNS_RPZ_TYPE_NSIP,
+						    &rdataset, resuming));
 			st->state &= ~(DNS_RPZ_DONE_NSDNAME |
 				       DNS_RPZ_DONE_IPv4);
 			result = dns_rdataset_next(st->r.ns_rdataset);
@@ -9245,13 +9236,11 @@ query_synthcnamewildcard(query_ctx_t *qctx, dns_rdataset_t *rdataset,

 	if (dns_name_equal(qctx->client->query.qname, &cname.cname)) {
 		dns_message_puttempname(qctx->client->message, &tname);
-		dns_rdata_freestruct(&cname);
 		return ISC_R_SUCCESS;
 	}

 	dns_name_copy(&cname.cname, tname);

-	dns_rdata_freestruct(&cname);
 	ns_client_qnamereplace(qctx->client, tname);
 	qctx->want_restart = true;
 	if (!qctx->client->query.wantrecursion) {
@@ -9864,8 +9853,6 @@ query_cname(query_ctx_t *qctx) {

 	dns_name_copy(&cname.cname, tname);

-	dns_rdata_freestruct(&cname);
-
 	ns_client_qnamereplace(qctx->client, tname);
 	qctx->want_restart = true;
 	if (!qctx->client->query.wantrecursion) {
@@ -9962,7 +9949,6 @@ query_dname(query_ctx_t *qctx) {
 	dns_rdata_reset(&rdata);

 	dns_name_copy(&dname.dname, tname);
-	dns_rdata_freestruct(&dname);

 	/*
 	 * Construct the new qname consisting of
@@ -10788,7 +10774,6 @@ again:
 			if (result == ISC_R_SUCCESS) {
 				have_wname = true;
 			}
-			dns_rdata_freestruct(&nsec);
 		}
 		query_addrrset(qctx, &fname, &rdataset, &sigrdataset, dbuf,
 			       DNS_SECTION_AUTHORITY);
diff --git a/tests/dns/keytable_test.c b/tests/dns/keytable_test.c
index 44e26d6683..3df08e9980 100644
--- a/tests/dns/keytable_test.c
+++ b/tests/dns/keytable_test.c
@@ -106,26 +106,24 @@ str2name(const char *namestr) {

 static void
 create_keystruct(uint16_t flags, uint8_t proto, uint8_t alg, const char *keystr,
+		 unsigned char *keydata, size_t keydata_len,
 		 dns_rdata_dnskey_t *keystruct) {
-	unsigned char keydata[4096];
 	isc_buffer_t keydatabuf;
 	isc_region_t r;
 	const dns_rdataclass_t rdclass = dns_rdataclass_in;

 	keystruct->common.rdclass = rdclass;
 	keystruct->common.rdtype = dns_rdatatype_dnskey;
-	keystruct->mctx = isc_g_mctx;
 	keystruct->flags = flags;
 	keystruct->protocol = proto;
 	keystruct->algorithm = alg;

-	isc_buffer_init(&keydatabuf, keydata, sizeof(keydata));
+	isc_buffer_init(&keydatabuf, keydata, keydata_len);
 	assert_int_equal(isc_base64_decodestring(keystr, &keydatabuf),
 			 ISC_R_SUCCESS);
 	isc_buffer_usedregion(&keydatabuf, &r);
 	keystruct->datalen = r.length;
-	keystruct->data = isc_mem_allocate(isc_g_mctx, r.length);
-	memmove(keystruct->data, r.base, r.length);
+	keystruct->data = r.base;
 }

 static void
@@ -134,6 +132,7 @@ create_dsstruct(dns_name_t *name, uint16_t flags, uint8_t proto, uint8_t alg,
 		dns_rdata_ds_t *dsstruct) {
 	isc_result_t result;
 	unsigned char rrdata[4096];
+	unsigned char keydata[4096];
 	isc_buffer_t rrdatabuf;
 	dns_rdata_t rdata = DNS_RDATA_INIT;
 	dns_rdata_dnskey_t dnskey;
@@ -141,7 +140,8 @@ create_dsstruct(dns_name_t *name, uint16_t flags, uint8_t proto, uint8_t alg,
 	/*
 	 * Populate DNSKEY rdata structure.
 	 */
-	create_keystruct(flags, proto, alg, keystr, &dnskey);
+	create_keystruct(flags, proto, alg, keystr, keydata, sizeof(keydata),
+			 &dnskey);

 	/*
 	 * Convert to wire format.
@@ -158,8 +158,6 @@ create_dsstruct(dns_name_t *name, uint16_t flags, uint8_t proto, uint8_t alg,
 	result = dns_ds_fromkeyrdata(name, &rdata, DNS_DSDIGEST_SHA256, digest,
 				     digest_len, dsstruct);
 	assert_int_equal(result, ISC_R_SUCCESS);
-
-	dns_rdata_freestruct(&dnskey);
 }

 /* Common setup: create a keytable and ntatable to test with a few keys */
@@ -419,6 +417,7 @@ ISC_LOOP_TEST_IMPL(delete) {
 /* delete key nodes from the keytable */
 ISC_LOOP_TEST_IMPL(deletekey) {
 	dns_rdata_dnskey_t dnskey;
+	unsigned char keydata[4096];
 	dns_fixedname_t fn;
 	dns_name_t *keyname = dns_fixedname_name(&fn);

@@ -428,31 +427,28 @@ ISC_LOOP_TEST_IMPL(deletekey) {

 	/* key name doesn't match */
 	dns_test_namefromstring("example.org.", &fn);
-	create_keystruct(257, 3, 5, keystr1, &dnskey);
+	create_keystruct(257, 3, 5, keystr1, keydata, sizeof(keydata), &dnskey);
 	assert_int_equal(dns_keytable_deletekey(keytable, keyname, &dnskey),
 			 ISC_R_NOTFOUND);
-	dns_rdata_freestruct(&dnskey);

 	/* subdomain match is the same as no match */
 	dns_test_namefromstring("sub.example.org.", &fn);
-	create_keystruct(257, 3, 5, keystr1, &dnskey);
+	create_keystruct(257, 3, 5, keystr1, keydata, sizeof(keydata), &dnskey);
 	assert_int_equal(dns_keytable_deletekey(keytable, keyname, &dnskey),
 			 ISC_R_NOTFOUND);
-	dns_rdata_freestruct(&dnskey);

 	/* name matches but key doesn't match (resulting in PARTIALMATCH) */
 	dns_test_namefromstring("example.com.", &fn);
-	create_keystruct(257, 3, 5, keystr2, &dnskey);
+	create_keystruct(257, 3, 5, keystr2, keydata, sizeof(keydata), &dnskey);
 	assert_int_equal(dns_keytable_deletekey(keytable, keyname, &dnskey),
 			 DNS_R_PARTIALMATCH);
-	dns_rdata_freestruct(&dnskey);

 	/*
 	 * exact match: should return SUCCESS on the first try, then
 	 * PARTIALMATCH on the second (because the name existed but
 	 * not a matching key).
 	 */
-	create_keystruct(257, 3, 5, keystr1, &dnskey);
+	create_keystruct(257, 3, 5, keystr1, keydata, sizeof(keydata), &dnskey);
 	assert_int_equal(dns_keytable_deletekey(keytable, keyname, &dnskey),
 			 ISC_R_SUCCESS);
 	assert_int_equal(dns_keytable_deletekey(keytable, keyname, &dnskey),
@@ -466,19 +462,17 @@ ISC_LOOP_TEST_IMPL(deletekey) {
 			 ISC_R_SUCCESS);
 	assert_int_equal(dns_keytable_deletekey(keytable, keyname, &dnskey),
 			 ISC_R_NOTFOUND);
-	dns_rdata_freestruct(&dnskey);

 	/*
 	 * A null key node for a name is not deleted when searched by key;
 	 * it must be deleted by dns_keytable_delete()
 	 */
 	dns_test_namefromstring("null.example.", &fn);
-	create_keystruct(257, 3, 5, keystr1, &dnskey);
+	create_keystruct(257, 3, 5, keystr1, keydata, sizeof(keydata), &dnskey);
 	assert_int_equal(dns_keytable_deletekey(keytable, keyname, &dnskey),
 			 DNS_R_PARTIALMATCH);
 	assert_int_equal(dns_keytable_delete(keytable, keyname, NULL, NULL),
 			 ISC_R_SUCCESS);
-	dns_rdata_freestruct(&dnskey);

 	destroy_tables();

diff --git a/tests/dns/tsig_test.c b/tests/dns/tsig_test.c
index 851378086b..e2af2825f5 100644
--- a/tests/dns/tsig_test.c
+++ b/tests/dns/tsig_test.c
@@ -65,7 +65,6 @@ add_mac(dst_context_t *tsigctx, isc_buffer_t *buf) {
 	isc_buffer_putmem(&databuf, tsig.signature, tsig.siglen);
 	isc_buffer_usedregion(&databuf, &r);
 	result = dst_context_adddata(tsigctx, &r);
-	dns_rdata_freestruct(&tsig);
 cleanup:
 	return result;
 }