From: Ralph Dolmans Date: Mon, 9 Sep 2019 15:13:08 +0000 (+0200) Subject: - Merge clean up X-Git-Tag: release-1.10.0rc1~28^2~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4ac33aa104fb1a1dadf2cbeec9cbf5d37290c6a2;p=thirdparty%2Funbound.git - Merge clean up - revert dname2str off by one fix - fix str2dname off by one at right location --- diff --git a/libunbound/context.c b/libunbound/context.c index cb09f1d94..d96722263 100644 --- a/libunbound/context.c +++ b/libunbound/context.c @@ -77,7 +77,7 @@ context_finalize(struct ub_ctx* ctx) return UB_NOMEM; if(!local_zones_apply_cfg(ctx->local_zones, cfg)) return UB_INITFAIL; - if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1i, &is_rpz)) + if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1, &is_rpz)) return UB_INITFAIL; if(!slabhash_is_size(ctx->env->msg_cache, cfg->msg_cache_size, cfg->msg_cache_slabs)) { diff --git a/services/authzone.c b/services/authzone.c index 926c6ef03..b49f7409a 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -723,10 +723,58 @@ rrsig_rdata_get_type_covered(uint8_t* rdata, size_t rdatalen) static int rrset_remove_rr(struct auth_rrset* rrset, size_t index) { - struct packed_rrset_data* d = - packed_rrset_remove_rr(rrset->data, index, NULL); - if(!d) + struct packed_rrset_data* d, *old = rrset->data; + size_t i; + if(index >= old->count + old->rrsig_count) + return 0; /* index out of bounds */ + d = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(old) - ( + sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t) + + old->rr_len[index])); + if(!d) { + log_err("malloc failure"); return 0; + } + d->ttl = old->ttl; + d->count = old->count; + d->rrsig_count = old->rrsig_count; + if(index < d->count) d->count--; + else d->rrsig_count--; + d->trust = old->trust; + d->security = old->security; + + /* set rr_len, needed for ptr_fixup */ + d->rr_len = (size_t*)((uint8_t*)d + + sizeof(struct packed_rrset_data)); + if(index > 0) + memmove(d->rr_len, old->rr_len, (index)*sizeof(size_t)); + if(index+1 < old->count+old->rrsig_count) + memmove(&d->rr_len[index], &old->rr_len[index+1], + (old->count+old->rrsig_count - (index+1))*sizeof(size_t)); + packed_rrset_ptr_fixup(d); + + /* move over ttls */ + if(index > 0) + memmove(d->rr_ttl, old->rr_ttl, (index)*sizeof(time_t)); + if(index+1 < old->count+old->rrsig_count) + memmove(&d->rr_ttl[index], &old->rr_ttl[index+1], + (old->count+old->rrsig_count - (index+1))*sizeof(time_t)); + + /* move over rr_data */ + for(i=0; icount+d->rrsig_count; i++) { + size_t oldi; + if(i < index) oldi = i; + else oldi = i+1; + memmove(d->rr_data[i], old->rr_data[oldi], d->rr_len[i]); + } + + /* recalc ttl (lowest of remaining RR ttls) */ + if(d->count + d->rrsig_count > 0) + d->ttl = d->rr_ttl[0]; + for(i=0; icount+d->rrsig_count; i++) { + if(d->rr_ttl[i] < d->ttl) + d->ttl = d->rr_ttl[i]; + } + free(rrset->data); rrset->data = d; return 1; diff --git a/sldns/str2wire.c b/sldns/str2wire.c index f94ba890c..e6dab6477 100644 --- a/sldns/str2wire.c +++ b/sldns/str2wire.c @@ -80,7 +80,7 @@ static int sldns_str2wire_dname_buf_rel(const char* str, uint8_t* buf, for (s = str; *s; s++, q++) { if (q >= buf + *olen) return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, q-buf); - if (q > buf + LDNS_MAX_DOMAINLEN) + if (q >= buf + LDNS_MAX_DOMAINLEN) return RET_ERR(LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW, q-buf); switch (*s) { case '.': @@ -117,7 +117,7 @@ static int sldns_str2wire_dname_buf_rel(const char* str, uint8_t* buf, if(rel) *rel = 1; if (q >= buf + *olen) return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, q-buf); - if (q > buf + LDNS_MAX_DOMAINLEN) { + if (q >= buf + LDNS_MAX_DOMAINLEN) { return RET_ERR(LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW, q-buf); } if (label_len > LDNS_MAX_LABELLEN) { @@ -165,7 +165,7 @@ int sldns_str2wire_dname_buf_origin(const char* str, uint8_t* buf, size_t* len, uint8_t* sldns_str2wire_dname(const char* str, size_t* len) { - uint8_t dname[LDNS_MAX_DOMAINLEN]; + uint8_t dname[LDNS_MAX_DOMAINLEN+1]; *len = sizeof(dname); if(sldns_str2wire_dname_buf(str, dname, len) == 0) { uint8_t* r = (uint8_t*)malloc(*len); diff --git a/util/data/dname.c b/util/data/dname.c index cf3545f7c..f025bf699 100644 --- a/util/data/dname.c +++ b/util/data/dname.c @@ -597,7 +597,7 @@ void dname_str(uint8_t* dname, char* str) return; } len += lablen+1; - if(len >= LDNS_MAX_DOMAINLEN) { + if(len >= LDNS_MAX_DOMAINLEN-1) { *s++ = '&'; *s = 0; return; diff --git a/util/data/packed_rrset.c b/util/data/packed_rrset.c index 9d21b9cc9..7f3feb1d0 100644 --- a/util/data/packed_rrset.c +++ b/util/data/packed_rrset.c @@ -402,67 +402,3 @@ packed_rrset_find_rr(struct packed_rrset_data* d, uint8_t* rdata, size_t len, } return 0; } - -struct packed_rrset_data* -packed_rrset_remove_rr(struct packed_rrset_data* old, size_t index, - struct regional* region) -{ - struct packed_rrset_data* d; - size_t i; - if(index >= old->count + old->rrsig_count) - return NULL; /* index out of bounds */ - if(region) - d = (struct packed_rrset_data*)regional_alloc(region, - packed_rrset_sizeof(old) - ( sizeof(size_t) + - sizeof(uint8_t*) + sizeof(time_t) + old->rr_len[index])); - else - d = (struct packed_rrset_data*)calloc(1, - packed_rrset_sizeof(old) - ( sizeof(size_t) + - sizeof(uint8_t*) + sizeof(time_t) + old->rr_len[index])); - if(!d) { - log_err("malloc failure"); - return NULL; - } - d->ttl = old->ttl; - d->count = old->count; - d->rrsig_count = old->rrsig_count; - if(index < d->count) d->count--; - else d->rrsig_count--; - d->trust = old->trust; - d->security = old->security; - - /* set rr_len, needed for ptr_fixup */ - d->rr_len = (size_t*)((uint8_t*)d + - sizeof(struct packed_rrset_data)); - if(index > 0) - memmove(d->rr_len, old->rr_len, (index)*sizeof(size_t)); - if(index+1 < old->count+old->rrsig_count) - memmove(&d->rr_len[index], &old->rr_len[index+1], - (old->count+old->rrsig_count - (index+1))*sizeof(size_t)); - packed_rrset_ptr_fixup(d); - - /* move over ttls */ - if(index > 0) - memmove(d->rr_ttl, old->rr_ttl, (index)*sizeof(time_t)); - if(index+1 < old->count+old->rrsig_count) - memmove(&d->rr_ttl[index], &old->rr_ttl[index+1], - (old->count+old->rrsig_count - (index+1))*sizeof(time_t)); - - /* move over rr_data */ - for(i=0; icount+d->rrsig_count; i++) { - size_t oldi; - if(i < index) oldi = i; - else oldi = i+1; - memmove(d->rr_data[i], old->rr_data[oldi], d->rr_len[i]); - } - - /* recalc ttl (lowest of remaining RR ttls) */ - if(d->count + d->rrsig_count > 0) - d->ttl = d->rr_ttl[0]; - for(i=0; icount+d->rrsig_count; i++) { - if(d->rr_ttl[i] < d->ttl) - d->ttl = d->rr_ttl[i]; - } - - return d; -} diff --git a/util/data/packed_rrset.h b/util/data/packed_rrset.h index cb2664c05..59693dbf6 100644 --- a/util/data/packed_rrset.h +++ b/util/data/packed_rrset.h @@ -458,16 +458,4 @@ int packed_rrset_find_rr(struct packed_rrset_data* d, uint8_t* rdata, size_t len, size_t* index); -/** - * Remove RR from packed rrset - * @param old: packed rrset containing RR to remove - * @param index: index of RR to remove - * @param region: region to use for allocation of new packet RR. Malloc used if - * NULL - * @return pointer to newly allocated packed rrset - */ -struct packed_rrset_data* -packed_rrset_remove_rr(struct packed_rrset_data* old, size_t index, - struct regional* region); - #endif /* UTIL_DATA_PACKED_RRSET_H */