From: Wouter Wijngaards Date: Wed, 20 Jun 2007 08:55:00 +0000 (+0000) Subject: fixup CNAME generated by scrubber. X-Git-Tag: release-0.4~63 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c33f8dcf4ae36a9ef1e1afaa61aa69a890cefca;p=thirdparty%2Funbound.git fixup CNAME generated by scrubber. git-svn-id: file:///svn/unbound/trunk@403 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 90a5e1bd3..8504da85c 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -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. diff --git a/iterator/iter_scrub.c b/iterator/iter_scrub.c index 3346ca701..7c2841174 100644 --- a/iterator/iter_scrub.c +++ b/iterator/iter_scrub.c @@ -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; diff --git a/util/data/msgparse.c b/util/data/msgparse.c index f390a7cf7..7471cc7b6 100644 --- a/util/data/msgparse.c +++ b/util/data/msgparse.c @@ -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) { diff --git a/util/data/msgparse.h b/util/data/msgparse.h index e0b8a228c..7e9af9fc9 100644 --- a/util/data/msgparse.h +++ b/util/data/msgparse.h @@ -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. */ diff --git a/util/data/msgreply.c b/util/data/msgreply.c index b0a1f9c29..312a2cb9a 100644 --- a/util/data/msgreply.c +++ b/util/data/msgreply.c @@ -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);