diff --git a/CHANGES b/CHANGES
index 85da655bc4..be559469e2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+4004. [bug] When delegations had AAAA glue but not A, a
+ reference could be leaked causing an assertion
+ failure on shutdown. [RT #37796]
+
4000. [bug] NXDOMAIN redirection incorrectly handled NXRRSET
from the redirect zone. [RT #37722]
diff --git a/bin/check/named-checkconf.c b/bin/check/named-checkconf.c
index a75df96d1f..18cfdddc98 100644
--- a/bin/check/named-checkconf.c
+++ b/bin/check/named-checkconf.c
@@ -488,7 +488,33 @@ main(int argc, char **argv) {
isc_commandline_errprint = ISC_FALSE;
- while ((c = isc_commandline_parse(argc, argv, "dhjt:pvxz")) != EOF) {
+ /*
+ * Process memory debugging argument first.
+ */
+#define CMDLINE_FLAGS "dhjm:t:pvxz"
+ while ((c = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
+ switch (c) {
+ case 'm':
+ if (strcasecmp(isc_commandline_argument, "record") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGRECORD;
+ if (strcasecmp(isc_commandline_argument, "trace") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGTRACE;
+ if (strcasecmp(isc_commandline_argument, "usage") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGUSAGE;
+ if (strcasecmp(isc_commandline_argument, "size") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGSIZE;
+ if (strcasecmp(isc_commandline_argument, "mctx") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGCTX;
+ break;
+ default:
+ break;
+ }
+ }
+ isc_commandline_reset = ISC_TRUE;
+
+ RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
+
+ while ((c = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != EOF) {
switch (c) {
case 'd':
debug++;
@@ -498,6 +524,9 @@ main(int argc, char **argv) {
nomerge = ISC_FALSE;
break;
+ case 'm':
+ break;
+
case 't':
result = isc_dir_chroot(isc_commandline_argument);
if (result != ISC_R_SUCCESS) {
@@ -557,8 +586,6 @@ main(int argc, char **argv) {
InitSockets();
#endif
- RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
-
RUNTIME_CHECK(setup_logging(mctx, stdout, &logc) == ISC_R_SUCCESS);
RUNTIME_CHECK(isc_entropy_create(mctx, &ectx) == ISC_R_SUCCESS);
diff --git a/doc/arm/notes.xml b/doc/arm/notes.xml
index 0d2fe70836..ec32378e66 100644
--- a/doc/arm/notes.xml
+++ b/doc/arm/notes.xml
@@ -165,6 +165,15 @@
is not present will now return NOERROR instead of NXDOMAIN.
+
+
+ When a zone contained a delegation to an IPv6 name server
+ but not an IPv4 name server, it was possible for a memory
+ reference to be left un-freed. This caused an assertion
+ failure on server shutdown, but was otherwise harmless.
+ [RT #37796]
+
+
diff --git a/lib/dns/zone.c b/lib/dns/zone.c
index b7a04ea5c9..b1cfd4597f 100644
--- a/lib/dns/zone.c
+++ b/lib/dns/zone.c
@@ -2342,6 +2342,8 @@ zone_check_glue(dns_zone_t *zone, dns_db_t *db, dns_name_t *name,
DNS_DBFIND_GLUEOK, 0, NULL,
foundname, &aaaa, NULL);
if (tresult == ISC_R_SUCCESS) {
+ if (dns_rdataset_isassociated(&a))
+ dns_rdataset_disassociate(&a);
dns_rdataset_disassociate(&aaaa);
return (ISC_TRUE);
}