mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-31 20:09:35 -05:00
- Merge clean up
- revert dname2str off by one fix - fix str2dname off by one at right location
This commit is contained in:
parent
2b5cd8e9b4
commit
4ac33aa104
6 changed files with 56 additions and 84 deletions
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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; i<d->count+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; i<d->count+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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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; i<d->count+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; i<d->count+d->rrsig_count; i++) {
|
||||
if(d->rr_ttl[i] < d->ttl)
|
||||
d->ttl = d->rr_ttl[i];
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in a new issue