1683. [bug] dig +sigchase could leak memory. [RT #11445]
This commit is contained in:
2
CHANGES
2
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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user