From: Jelte Jansen Date: Wed, 25 May 2005 13:16:54 +0000 (+0000) Subject: memory stuff X-Git-Tag: release-0.60^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=537cc197cfb932c61e2c64b1aeaab1061a8091c3;p=thirdparty%2Fldns.git memory stuff --- diff --git a/dnssec.c b/dnssec.c index eaf4fae6..34767010 100644 --- 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); diff --git a/ldns/rr.h b/ldns/rr.h index 4ca20170..fc1375ac 100644 --- 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 diff --git a/packet.c b/packet.c index 1009e7bf..7784ee5c 100644 --- 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 cfbf2e90..17b59d92 100644 --- 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;