]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
fixup CNAME generated by scrubber.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 20 Jun 2007 08:55:00 +0000 (08:55 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 20 Jun 2007 08:55:00 +0000 (08:55 +0000)
git-svn-id: file:///svn/unbound/trunk@403 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
iterator/iter_scrub.c
util/data/msgparse.c
util/data/msgparse.h
util/data/msgreply.c

index 90a5e1bd384ad5dedbba6d9f3e2888e9719daeb4..8504da85c25bdc8627e2f876ecbb4e394e9f0f3f 100644 (file)
@@ -1,6 +1,7 @@
 20 June 2007: Wouter
        - new -C option to enable coredumps after forking away.
        - doc update.
+       - fixup CNAME generation by scrubber, and memory allocation of it.
 
 19 June 2007: Wouter
        - nicer layout in stats.c, review 0.3 change.
index 3346ca7015da461f890f260b6388a5e6d7ab346f..7c28411740a952f79691bfb4e908b2aba19d4d54 100644 (file)
@@ -248,6 +248,7 @@ synth_cname_rrset(uint8_t** sname, size_t* snamelen, uint8_t* alias,
        cn->hash=pkt_hash_rrset(pkt, cn->dname, cn->type, cn->rrset_class, 0);
        /* allocate TTL + rdatalen + uncompressed dname */
        memset(cn->rr_first, 0, sizeof(struct rr_parse));
+       cn->rr_first->outside_packet = 1;
        cn->rr_first->ttl_data = (uint8_t*)region_alloc(region, 
                sizeof(uint32_t)+sizeof(uint16_t)+aliaslen);
        if(!cn->rr_first->ttl_data)
@@ -361,7 +362,7 @@ scrub_normalize(ldns_buffer* pkt, struct msg_parse* msg,
                        }
                        /* synth a CNAME rrset */
                        prev = synth_cname_rrset(&sname, &snamelen, alias, 
-                               aliaslen, region, msg, rrset, prev, nx, pkt);
+                               aliaslen, region, msg, rrset, rrset, nx, pkt);
                        if(!prev) {
                                log_err("out of memory synthesizing CNAME");
                                return 0;
index f390a7cf75d6f8d233253c47e509a48d13ffbe6b..7471cc7b62054788a072555758da986385b3212a 100644 (file)
@@ -314,6 +314,7 @@ moveover_rrsigs(ldns_buffer* pkt, region_type* region,
                                /* new */
                                insert = (struct rr_parse*)region_alloc(region,
                                        sizeof(struct rr_parse));
+                               insert->outside_packet = 0;
                                insert->ttl_data = sig->ttl_data;
                                insert->size = sig->size;
                        } else {
@@ -718,6 +719,7 @@ add_rr_to_rrset(struct rrset_parse* rrset, ldns_buffer* pkt,
        /* create rr */
        if(!(rr = (struct rr_parse*)region_alloc(region, sizeof(*rr))))
                return LDNS_RCODE_SERVFAIL;
+       rr->outside_packet = 0;
        rr->ttl_data = ldns_buffer_current(pkt);
        rr->next = 0;
        if(type == LDNS_RR_TYPE_RRSIG && rrset->type != LDNS_RR_TYPE_RRSIG) {
index e0b8a228cfb273fb871a9fbec0d627dfcf65b1ff..7e9af9fc9fea1f60fd3487e25492569d09f86ac3 100644 (file)
@@ -171,6 +171,9 @@ struct rr_parse {
         * its dname, type and class are the same and stored for the rrset.
         */
        uint8_t* ttl_data;
+       /** true if ttl_data is not part of the packet, but elsewhere in mem.
+        * Set for generated CNAMEs for DNAMEs. */
+       int outside_packet;
        /** the length of the rdata if allocated (with no dname compression)*/
        size_t size;
        /** next in list of RRs. */
index b0a1f9c297ac82fccc2bd7cd9938643d18b4e2fa..312a2cb9aeef91c679e85a3471a5b6c3555dc954 100644 (file)
@@ -148,15 +148,22 @@ rdata_copy(ldns_buffer* pkt, struct packed_rrset_data* data, uint8_t* to,
 {
        uint16_t pkt_len;
        const ldns_rr_descriptor* desc;
-       ldns_buffer_set_position(pkt, (size_t)
-               (rr->ttl_data - ldns_buffer_begin(pkt)));
-       log_assert(ldns_buffer_remaining(pkt) >= 6 /* ttl + rdatalen */);
-       *rr_ttl = ldns_buffer_read_u32(pkt);
+
+       *rr_ttl = ldns_read_uint32(rr->ttl_data);
        /* RFC 2181 Section 8. if msb of ttl is set treat as if zero. */
        if(*rr_ttl & 0x80000000U)
                *rr_ttl = 0;
        if(*rr_ttl < data->ttl)
                data->ttl = *rr_ttl;
+
+       if(rr->outside_packet) {
+               /* uncompressed already, only needs copy */
+               memmove(to, rr->ttl_data+sizeof(uint32_t), rr->size);
+               return 1;
+       }
+
+       ldns_buffer_set_position(pkt, (size_t)
+               (rr->ttl_data - ldns_buffer_begin(pkt) + sizeof(uint32_t)));
        /* insert decompressed size into rdata len stored in memory */
        /* -2 because rdatalen bytes are not included. */
        pkt_len = htons(rr->size - 2);