]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
get_section sometimes returned a pointer and sometimes returned
authorMiek Gieben <miekg@NLnetLabs.nl>
Wed, 22 Jun 2005 08:45:17 +0000 (08:45 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Wed, 22 Jun 2005 08:45:17 +0000 (08:45 +0000)
a cloned rr_list making it impossible to free. Renamed
to get_section_clone which always clones the stuff.

Bound to break some apps.

Changelog
ldns/packet.h
packet.c

index 99bb28dff9fac153c82b5db611e7c204c4b38e92..ac3119628a809f6c9b2ac306630b4b100b4b33e4 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,9 @@
+       : 0.70: ldns-team
+       * ldns_pkt_get_section now returns copies from the rrlists
+         in the packet. This can be freed by the user program
+
+
+
 20 Jun 2005: 0.66: ldns-team
        Rel. Focus: drill-pre2 uses some functions which are
        not in 0.65
index 4e409d9daf416e86dded33e34be94dd354de56ad..b2249fb854f62d2da3af77563dc8368497fba812 100644 (file)
@@ -159,7 +159,16 @@ ldns_rr_list *ldns_pkt_question(const ldns_pkt *p);
 ldns_rr_list *ldns_pkt_answer(const ldns_pkt *p);
 ldns_rr_list *ldns_pkt_authority(const ldns_pkt *p);
 ldns_rr_list *ldns_pkt_additional(const ldns_pkt *p);
-ldns_rr_list *ldns_pkt_get_section(ldns_pkt *p, ldns_pkt_section s);
+
+/**
+ * return all the rr_list's in the packet. Clone the lists, instead
+ * of returning pointers. 
+ * \param[in] p the packet to look in
+ * \param[in] s what section(s) to return
+ * \return ldns_rr_list with the rr's or NULL if none were found
+ */
+ldns_rr_list *ldns_pkt_get_section_clone(ldns_pkt *p, ldns_pkt_section s);
+
 ldns_rr_list *ldns_pkt_rr_list_by_name(ldns_pkt *p, ldns_rdf *r, ldns_pkt_section s);
 ldns_rr_list *ldns_pkt_rr_list_by_type(ldns_pkt *p, ldns_rr_type t, ldns_pkt_section s);
 ldns_rr_list *ldns_pkt_rr_list_by_name_and_type(ldns_pkt *packet, ldns_rdf *ownername, ldns_rr_type type, ldns_pkt_section sec);
index 6de3fade5fdd9278a9e5148944910242f6a5ed29..46230290910d358b8b1c1b064e09e768f228d68d 100644 (file)
--- a/packet.c
+++ b/packet.c
@@ -138,12 +138,12 @@ ldns_pkt_all(ldns_pkt *packet)
        ldns_rr_list *all;
 
        all = ldns_rr_list_cat_clone(
-                       ldns_pkt_get_section(packet, LDNS_SECTION_QUESTION),
-                       ldns_pkt_get_section(packet, LDNS_SECTION_ANSWER));
+                       ldns_pkt_question(packet),
+                       ldns_pkt_answer(packet));
        all = ldns_rr_list_cat_clone(all,
-                       ldns_pkt_get_section(packet, LDNS_SECTION_AUTHORITY));
+                       ldns_pkt_authority(packet));
        all = ldns_rr_list_cat_clone(all,
-                       ldns_pkt_get_section(packet, LDNS_SECTION_ADDITIONAL));
+                       ldns_pkt_additional(packet));
        return all;
 }
 
@@ -153,10 +153,10 @@ ldns_pkt_all_noquestion(ldns_pkt *packet)
        ldns_rr_list *all, *all2;
 
        all = ldns_rr_list_cat_clone(
-                       ldns_pkt_get_section(packet, LDNS_SECTION_ANSWER),
-                       ldns_pkt_get_section(packet, LDNS_SECTION_AUTHORITY));
+                       ldns_pkt_answer(packet),
+                       ldns_pkt_authority(packet));
        all2 = ldns_rr_list_cat_clone(all,
-                       ldns_pkt_get_section(packet, LDNS_SECTION_ADDITIONAL));
+                       ldns_pkt_additional(packet));
        
        ldns_rr_list_free(all);
        return all2;
@@ -245,7 +245,7 @@ ldns_pkt_rr_list_by_name(ldns_pkt *packet, ldns_rdf *ownername, ldns_pkt_section
                return NULL;
        }
 
-       rrs = ldns_pkt_get_section(packet, sec);
+       rrs = ldns_pkt_get_section_clone(packet, sec);
        new = ldns_rr_list_new();
        ret = NULL;
 
@@ -273,7 +273,7 @@ ldns_pkt_rr_list_by_type(ldns_pkt *packet, ldns_rr_type type, ldns_pkt_section s
                return NULL;
        }
        
-       rrs = ldns_pkt_get_section(packet, sec);
+       rrs = ldns_pkt_get_section_clone(packet, sec);
        new = ldns_rr_list_new();
        
        for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) {
@@ -306,7 +306,7 @@ ldns_pkt_rr_list_by_name_and_type(ldns_pkt *packet, ldns_rdf *ownername, ldns_rr
                return NULL;
        }
        
-       rrs = ldns_pkt_get_section(packet, sec);
+       rrs = ldns_pkt_get_section_clone(packet, sec);
        new = ldns_rr_list_new();
        ret = NULL;
 
@@ -337,7 +337,7 @@ ldns_pkt_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr)
        uint16_t rr_count;
        uint16_t i;
 
-       rrs = ldns_pkt_get_section(pkt, sec);
+       rrs = ldns_pkt_get_section_clone(pkt, sec);
        if (!rrs) {
                return NULL;
        }
@@ -380,23 +380,24 @@ ldns_pkt_section_count(const ldns_pkt *packet, ldns_pkt_section s)
 }
 
 ldns_rr_list *
-ldns_pkt_get_section(ldns_pkt *packet, ldns_pkt_section s)
+ldns_pkt_get_section_clone(ldns_pkt *packet, ldns_pkt_section s)
 {
        switch(s) {
        case LDNS_SECTION_QUESTION:
-               return ldns_pkt_question(packet);
+               return ldns_rr_list_clone(ldns_pkt_question(packet));
        case LDNS_SECTION_ANSWER:
-               return ldns_pkt_answer(packet);
+               return ldns_rr_list_clone(ldns_pkt_answer(packet));
        case LDNS_SECTION_AUTHORITY:
-               return ldns_pkt_authority(packet);
+               return ldns_rr_list_clone(ldns_pkt_authority(packet));
        case LDNS_SECTION_ADDITIONAL:
-               return ldns_pkt_additional(packet);
+               return ldns_rr_list_clone(ldns_pkt_additional(packet));
        case LDNS_SECTION_ANY:
+               /* these are already clones */
                return ldns_pkt_all(packet);
        case LDNS_SECTION_ANY_NOQUESTION:
                return ldns_pkt_all_noquestion(packet);
        default:
-               return 0;
+               return NULL;
        }
 }
 
@@ -587,7 +588,7 @@ ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr)
        ldns_rr_list *rrs;
 
        /* get the right rr list for this section */
-       rrs = ldns_pkt_get_section(packet, section);
+       rrs = ldns_pkt_get_section_clone(packet, section);
        if (!rrs) {
                return false;
        }