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)) {
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;
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 '.':
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) {
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);
return;
}
len += lablen+1;
- if(len >= LDNS_MAX_DOMAINLEN) {
+ if(len >= LDNS_MAX_DOMAINLEN-1) {
*s++ = '&';
*s = 0;
return;
}
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;
-}
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 */