From: Mark Andrews Date: Wed, 30 Jun 2004 23:47:48 +0000 (+0000) Subject: 1683. [bug] dig +sigchase could leak memory. [RT #11445] X-Git-Tag: v9.2.4rc7~22^2~9 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=cf6b36171770dc14b6572003b4e8aeaa22536dd4;p=thirdparty%2Fbind9.git 1683. [bug] dig +sigchase could leak memory. [RT #11445] --- diff --git a/CHANGES b/CHANGES index 4d3a1cf68a5..43f11f77612 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +1683. [bug] dig +sigchase could leak memory. [RT #11445] + 1682. [placeholder] rt5066a 1681. [bug] Only set SO_REUSEADDR when a port is specified in diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 3ba6ba7ef2a..b0d322eb3ec 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dighost.c,v 1.263 2004/06/19 02:23:33 sra Exp $ */ +/* $Id: dighost.c,v 1.264 2004/06/30 23:47:48 marka Exp $ */ /* * Notice to programmers: Do not use this code as an example of how to @@ -208,7 +208,7 @@ isc_result_t prove_nx(dns_message_t * msg, dns_name_t * name, dns_name_t * rdata_name, dns_rdataset_t ** rdataset, dns_rdataset_t ** sigrdataset); -isc_result_t nameFromString( const char *str, dns_name_t *p_ret ); +static void nameFromString(const char *str, dns_name_t *p_ret); int inf_name(dns_name_t * name1, dns_name_t * name2); isc_result_t opentmpkey(isc_mem_t *mctx, const char *file, char **tempp, FILE **fp); @@ -962,6 +962,16 @@ setup_system(void) { #ifdef DIG_SIGCHASE /* Setup the list of messages for +sigchase */ ISC_LIST_INIT(chase_message_list); + ISC_LIST_INIT(chase_message_list2); + dns_name_init(&chase_name, NULL); +#if DIG_SIGCHASE_TD + dns_name_init(&chase_current_name, NULL); + dns_name_init(&chase_authority_name, NULL); +#endif +#if DIG_SIGCHASE_BU + dns_name_init(&chase_signame, NULL); +#endif + #endif } @@ -1259,9 +1269,8 @@ start_lookup(void) { current_lookup->sigchase = ISC_FALSE; goto novalidation; } - result = nameFromString(current_lookup->textname, - &query_name); - check_result(result, "nameFromString"); + dns_name_init(&query_name, NULL); + nameFromString(current_lookup->textname, &query_name); for (i = 0; i< tk_list.nb_tk; i++) { key_name = dst_key_name(tk_list.key[i]); @@ -1320,10 +1329,8 @@ start_lookup(void) { MXNAME); isc_buffer_free(&b); - result = nameFromString(current_lookup - ->textnamesigchase, - &chase_name); - check_result(result, "nameFromString"); + nameFromString(current_lookup->textnamesigchase, + &chase_name); dns_name_init(&chase_authority_name, NULL); } @@ -3136,6 +3143,18 @@ destroy_libs(void) { chase_msg = ISC_LIST_NEXT(chase_msg, link); isc_mem_free(mctx, ptr); } + if (dns_name_dynamic(&chase_name)) + dns_name_free(&chase_name, mctx); +#if DIG_SIGCHASE_TD + if (dns_name_dynamic(&chase_current_name)) + dns_name_free(&chase_current_name, mctx); + if (dns_name_dynamic(&chase_authority_name)) + dns_name_free(&chase_authority_name, mctx); +#endif +#if DIG_SIGCHASE_BU + if (dns_name_dynamic(&chase_signame)) + dns_name_free(&chase_signame, mctx); +#endif debug("Destroy memory"); @@ -3563,28 +3582,29 @@ get_trusted_key(isc_mem_t *mctx) } -isc_result_t -nameFromString( const char *str, dns_name_t *p_ret ) -{ - int len = strlen(str); - int ret; +static void +nameFromString(const char *str, dns_name_t *p_ret) { + size_t len = strlen(str); + isc_result_t result; isc_buffer_t buffer; dns_fixedname_t fixedname; - REQUIRE( p_ret); - REQUIRE( str != NULL ); - isc_buffer_init( &buffer, str, len ); - isc_buffer_add( &buffer, len ); + REQUIRE(p_ret != NULL); + REQUIRE(str != NULL); + + isc_buffer_init(&buffer, str, len); + isc_buffer_add(&buffer, len); dns_fixedname_init(&fixedname); - ret = dns_name_fromtext( dns_fixedname_name(&fixedname), &buffer, - dns_rootname, ISC_TRUE, NULL); - if ( ret != ISC_R_SUCCESS ) return ret; + result = dns_name_fromtext(dns_fixedname_name(&fixedname), &buffer, + dns_rootname, ISC_TRUE, NULL); + check_result(result, "nameFromString"); - dns_name_init(p_ret, NULL ); + if (dns_name_dynamic(p_ret)) + dns_name_free(p_ret, mctx); - ret = dns_name_dup( dns_fixedname_name(&fixedname), mctx, p_ret ); - return ret; + result = dns_name_dup(dns_fixedname_name(&fixedname), mctx, p_ret); + check_result(result, "nameFromString"); } @@ -3607,8 +3627,6 @@ prepare_lookup(dns_name_t *name) lookup->rdtype = lookup->rdtype_sigchase; lookup->rdtypeset = ISC_TRUE; lookup->qrdtype = lookup->qrdtype_sigchase; - - s = ISC_LIST_HEAD(lookup->my_server_list); while (s != NULL) { @@ -3840,11 +3858,11 @@ print_rdataset(dns_name_t * name, dns_rdataset_t *rdataset, isc_mem_t *mctx) void -dup_name(dns_name_t *source, dns_name_t* target, isc_mem_t *mctx) -{ +dup_name(dns_name_t *source, dns_name_t *target, isc_mem_t *mctx) { isc_result_t result; - dns_name_init(target, NULL); + if (dns_name_dynamic(target)) + dns_name_free(target, mctx); result = dns_name_dup(source, mctx, target); check_result(result, "dns_name_dup"); } @@ -4322,7 +4340,7 @@ sigchase_td(dns_message_t * msg) dns_name_init(&tmp_name, NULL); result = child_of_zone(&chase_name, &chase_current_name, &tmp_name); - if (chase_authority_name.labels != 0) + if (dns_name_dynamic(&chase_authority_name)) dns_name_free( &chase_authority_name, mctx); dup_name(&tmp_name, &chase_authority_name, mctx); printf(";; and we try to continue chain of trust" @@ -4406,7 +4424,6 @@ sigchase_td(dns_message_t * msg) have_delegation_ns = ISC_FALSE; delegation_follow = ISC_TRUE; error_message = NULL; - dns_name_free(&chase_current_name, mctx); dup_name(&chase_authority_name, &chase_current_name, mctx); dns_name_free(&chase_authority_name, mctx); return; @@ -4419,6 +4436,7 @@ sigchase_td(dns_message_t * msg) dns_name_t rdata_name; isc_result_t ret = ISC_R_FAILURE; + dns_name_init(&rdata_name, NULL); result = prove_nx(error_message, &chase_name, current_lookup->rdclass_sigchase, current_lookup->rdtype_sigchase, &rdata_name, @@ -4454,10 +4472,9 @@ sigchase_td(dns_message_t * msg) cleanandgo: printf(";; cleanandgo \n"); - dns_name_free(&chase_name, mctx); - if (chase_current_name.labels != 0) + if (dns_name_dynamic(&chase_current_name)) dns_name_free(&chase_current_name, mctx); - if (chase_authority_name.labels != 0) + if (dns_name_dynamic(&chase_authority_name)) dns_name_free(&chase_authority_name, mctx); clean_trustedkey(); return; @@ -4548,7 +4565,7 @@ getneededrr(dns_message_t *msg) if (result == ISC_R_FAILURE) { printf("\n;; RRSIG is missing for continue validation:" " FAILED\n\n"); - if (chase_name.ndata != NULL) + if (dns_name_dynamic(&chase_name)) dns_name_free(&chase_name, mctx); return ISC_R_NOTFOUND; } @@ -4583,7 +4600,7 @@ getneededrr(dns_message_t *msg) printf("\n;; DNSKEY is missing to continue validation:" " FAILED\n\n"); dns_name_free(&chase_signame, mctx); - if (chase_name.ndata != NULL) + if (dns_name_dynamic(&chase_name)) dns_name_free(&chase_name, mctx); return ISC_R_NOTFOUND; } @@ -4606,7 +4623,7 @@ getneededrr(dns_message_t *msg) printf("\n;; RRSIG for DNSKEY is missing to continue" " validation : FAILED\n\n"); dns_name_free(&chase_signame, mctx); - if (chase_name.ndata != NULL) + if (dns_name_dynamic(&chase_name)) dns_name_free(&chase_name, mctx); return ISC_R_NOTFOUND; } @@ -4697,6 +4714,7 @@ sigchase_bu(dns_message_t *msg) dns_name_t query_name; + dns_name_init(&query_name, NULL); nameFromString(current_lookup->textname, &query_name); result = prove_nx(msg, &query_name, current_lookup->rdclass, @@ -4792,7 +4810,6 @@ sigchase_bu(dns_message_t *msg) " the RRset\n"); INSIST(chase_sigdsrdataset != NULL); - dns_name_free(&chase_name, mctx); dup_name(&chase_signame, &chase_name, mctx); dns_name_free(&chase_signame, mctx); chase_rdataset = chase_dsrdataset;