]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1683. [bug] dig +sigchase could leak memory. [RT #11445]
authorMark Andrews <marka@isc.org>
Wed, 30 Jun 2004 23:57:52 +0000 (23:57 +0000)
committerMark Andrews <marka@isc.org>
Wed, 30 Jun 2004 23:57:52 +0000 (23:57 +0000)
CHANGES
bin/dig/dighost.c

diff --git a/CHANGES b/CHANGES
index 4948ae599496d6e4728da7e014bfd8f606dbc770..cba242cf4e3544d6073cc2f8c55da988b696e867 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+1683.  [bug]           dig +sigchase could leak memory. [RT #11445]
+
 1681.  [bug]           Only set SO_REUSEADDR when a port is specified in
                        isc_socket_bind(). [RT #11742]
 
index 1d527a8ccb817032ee7ced7179806ec1a84be7cb..dd49b5b3787767098eb9b9107b8e5b0483e4b597 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dighost.c,v 1.221.2.19.2.13 2004/06/19 02:30:11 sra Exp $ */
+/* $Id: dighost.c,v 1.221.2.19.2.14 2004/06/30 23:57:52 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;