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); }