From: Evan Hunt Date: Fri, 14 Nov 2014 17:02:28 +0000 (-0800) Subject: [master] reference leak with AAAA glue but not A X-Git-Tag: v9.11.0a1~1273 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=c4abb197160a74f7cd4ad23ebc63fbe0194010ab;p=thirdparty%2Fbind9.git [master] reference leak with AAAA glue but not A 4004. [bug] When delegations had AAAA glue but not A, a reference could be leaked causing an assertion failure on shutdown. [RT #37796] --- diff --git a/CHANGES b/CHANGES index abaf9bc54e3..1ed92b40a93 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] + 4003. [placeholder] 4002. [placeholder] diff --git a/bin/check/named-checkconf.c b/bin/check/named-checkconf.c index ed00c3c5dd7..1f4be20b877 100644 --- a/bin/check/named-checkconf.c +++ b/bin/check/named-checkconf.c @@ -503,7 +503,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++; @@ -513,6 +539,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) { @@ -572,8 +601,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/lib/dns/zone.c b/lib/dns/zone.c index 494caff0685..6400b074794 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -2604,6 +2604,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); }