]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
memory stuff
authorJelte Jansen <jeltejan@NLnetLabs.nl>
Wed, 25 May 2005 13:16:54 +0000 (13:16 +0000)
committerJelte Jansen <jeltejan@NLnetLabs.nl>
Wed, 25 May 2005 13:16:54 +0000 (13:16 +0000)
dnssec.c
ldns/rr.h
packet.c
rr.c

index eaf4fae632b468e9a107a3427beb9104246ac0fc..3476701024358a5500b2e5d2ae590b0bc26768cb 100644 (file)
--- a/dnssec.c
+++ b/dnssec.c
@@ -259,7 +259,7 @@ ldns_verify_rrsig_keylist(ldns_rr_list *rrset, ldns_rr *rrsig, ldns_rr_list *key
        }
 
        /* no longer needed */
-       ldns_rr_list_free(rrset_clone);
+       ldns_rr_list_deep_free(rrset_clone);
        ldns_buffer_free(rawsig_buf);
        ldns_buffer_free(verify_buf);
        if (ldns_rr_list_rr_count(validkeys) == 0) {
@@ -362,7 +362,7 @@ ldns_verify_rrsig(ldns_rr_list *rrset, ldns_rr *rrsig, ldns_rr *key)
 
        /* no longer needed */
 /*
-       ldns_rr_list_free(rrset_clone);
+       ldns_rr_list_deep_free(rrset_clone);
 */
        ldns_buffer_free(rawsig_buf);
        ldns_buffer_free(verify_buf);
index 4ca201702fc40bfb4cffbce448be452c59abfcc8..fc1375acc4326466c901854f8f8f3352968a5c31 100644 (file)
--- a/ldns/rr.h
+++ b/ldns/rr.h
@@ -426,6 +426,13 @@ ldns_rr_list* ldns_rr_list_new();
  */
 void ldns_rr_list_free(ldns_rr_list *rr_list);
 
+/**
+ * frees an rr_list structure and all rrs contained therein.
+ * \param[in] rr_list the list to free
+ * \return void
+ */
+void ldns_rr_list_deep_free(ldns_rr_list *rr_list);
+
 /**
  * concatenates two ldns_rr_lists together.
  * \param[in] left the leftside
index 1009e7bf5bbd8f18fd20a6972dae37a60b157ad2..7784ee5c443b707d75642c75a087e2ffde2f70b0 100644 (file)
--- a/packet.c
+++ b/packet.c
@@ -150,14 +150,16 @@ ldns_pkt_all(ldns_pkt *packet)
 ldns_rr_list *
 ldns_pkt_all_noquestion(ldns_pkt *packet)
 {
-       ldns_rr_list *all;
+       ldns_rr_list *all, *all2;
 
        all = ldns_rr_list_cat(
                        ldns_pkt_xxsection(packet, LDNS_SECTION_ANSWER),
                        ldns_pkt_xxsection(packet, LDNS_SECTION_AUTHORITY));
-       all = ldns_rr_list_cat(all,
+       all2 = ldns_rr_list_cat(all,
                        ldns_pkt_xxsection(packet, LDNS_SECTION_ADDITIONAL));
-       return all;
+       
+       ldns_rr_list_free(all);
+       return all2;
 }
 
 size_t
@@ -287,7 +289,7 @@ ldns_pkt_rr_list_by_type(ldns_pkt *packet, ldns_rr_type type, ldns_pkt_section s
                }
        }
        if (!ret) { 
-               ldns_rr_list_free(new);
+               ldns_rr_list_deep_free(new);
        }
 
        return ret;
@@ -317,7 +319,7 @@ ldns_pkt_rr_list_by_name_and_type(ldns_pkt *packet, ldns_rdf *ownername, ldns_rr
                                    ) == 0
                   ) {
                        /* types match */
-                       ldns_rr_list_push_rr(new, ldns_rr_list_rr(rrs, i));
+                       ldns_rr_list_push_rr(new, ldns_rr_deep_clone(ldns_rr_list_rr(rrs, i)));
                        ret = new;
                }
        }
@@ -700,10 +702,10 @@ ldns_pkt_free(ldns_pkt *packet)
 {
        if (packet) {
                LDNS_FREE(packet->_header);
-               ldns_rr_list_free(packet->_question);
-               ldns_rr_list_free(packet->_answer);
-               ldns_rr_list_free(packet->_authority);
-               ldns_rr_list_free(packet->_additional);
+               ldns_rr_list_deep_free(packet->_question);
+               ldns_rr_list_deep_free(packet->_answer);
+               ldns_rr_list_deep_free(packet->_authority);
+               ldns_rr_list_deep_free(packet->_additional);
                ldns_rr_free(packet->_tsig_rr);
                LDNS_FREE(packet);
        }
@@ -895,7 +897,10 @@ ldns_pkt_deep_clone(ldns_pkt *pkt)
        ldns_pkt_set_tsig(new_pkt, ldns_pkt_tsig(pkt));
        
        /* todo: edns? */
-       
+       ldns_rr_list_deep_free(new_pkt->_question);
+       ldns_rr_list_deep_free(new_pkt->_answer);
+       ldns_rr_list_deep_free(new_pkt->_authority);
+       ldns_rr_list_deep_free(new_pkt->_additional);
        new_pkt->_question = ldns_rr_list_deep_clone(ldns_pkt_question(pkt));
        new_pkt->_answer = ldns_rr_list_deep_clone(ldns_pkt_answer(pkt));
        new_pkt->_authority = ldns_rr_list_deep_clone(ldns_pkt_authority(pkt));
diff --git a/rr.c b/rr.c
index cfbf2e906dd7dbc759a87424c3fc8afeb802e570..17b59d926583efe7fc1fddc68797ad1f5e17ed05 100644 (file)
--- a/rr.c
+++ b/rr.c
@@ -460,6 +460,15 @@ ldns_rr_list_new()
 
 void
 ldns_rr_list_free(ldns_rr_list *rr_list)
+{
+       if (rr_list) {
+               LDNS_FREE(rr_list->_rrs);
+               LDNS_FREE(rr_list);
+       }
+}
+
+void
+ldns_rr_list_deep_free(ldns_rr_list *rr_list)
 {
        uint16_t i;