#include <isc/util.h>
#include <dns/badcache.h>
+#include <dns/fixedname.h>
#include <dns/name.h>
#include <dns/rdatatype.h>
#include <dns/types.h>
isc_time_t expire;
uint32_t flags;
unsigned int hashval;
- dns_name_t name;
+ dns_fixedname_t fname;
+ dns_name_t *name;
};
static void
for (bad = bc->table[i]; bad != NULL; bad = next) {
next = bad->next;
if (isc_time_compare(&bad->expire, now) < 0) {
- isc_mem_put(bc->mctx, bad,
- sizeof(*bad) + bad->name.length);
+ isc_mem_put(bc->mctx, bad, sizeof(*bad));
atomic_fetch_sub_relaxed(&bc->count, 1);
} else {
bad->next = newtable[bad->hashval % newsize];
prev = NULL;
for (bad = bc->table[hash]; bad != NULL; bad = next) {
next = bad->next;
- if (bad->type == type && dns_name_equal(name, &bad->name)) {
+ if (bad->type == type && dns_name_equal(name, bad->name)) {
if (update) {
bad->expire = *expire;
bad->flags = flags;
} else {
prev->next = bad->next;
}
- isc_mem_put(bc->mctx, bad,
- sizeof(*bad) + bad->name.length);
+ isc_mem_put(bc->mctx, bad, sizeof(*bad));
atomic_fetch_sub_relaxed(&bc->count, 1);
} else {
prev = bad;
}
if (bad == NULL) {
+ unsigned count;
isc_buffer_t buffer;
- bad = isc_mem_get(bc->mctx, sizeof(*bad) + name->length);
- bad->type = type;
- bad->hashval = hashval;
- bad->expire = *expire;
- bad->flags = flags;
+
+ bad = isc_mem_get(bc->mctx, sizeof(*bad));
+ *bad = (dns_bcentry_t){ .type = type,
+ .hashval = hashval,
+ .expire = *expire,
+ .flags = flags,
+ .next = bc->table[hash] };
+
isc_buffer_init(&buffer, bad + 1, name->length);
- dns_name_init(&bad->name, NULL);
- dns_name_copy(name, &bad->name, &buffer);
- bad->next = bc->table[hash];
+ bad->name = dns_fixedname_initname(&bad->fname);
+ dns_name_copynf(name, bad->name);
bc->table[hash] = bad;
- unsigned count = atomic_fetch_add_relaxed(&bc->count, 1);
+
+ count = atomic_fetch_add_relaxed(&bc->count, 1);
if ((count > bc->size * 8) ||
(count < bc->size * 2 && bc->size > bc->minsize)) {
resize = true;
bc->table[hash] = bad->next;
}
- isc_mem_put(bc->mctx, bad,
- sizeof(*bad) + bad->name.length);
+ isc_mem_put(bc->mctx, bad, sizeof(*bad));
atomic_fetch_sub(&bc->count, 1);
continue;
}
- if (bad->type == type && dns_name_equal(name, &bad->name)) {
+ if (bad->type == type && dns_name_equal(name, bad->name)) {
if (flagp != NULL) {
*flagp = bad->flags;
}
bad = bc->table[i];
if (bad != NULL && isc_time_compare(&bad->expire, now) < 0) {
bc->table[i] = bad->next;
- isc_mem_put(bc->mctx, bad,
- sizeof(*bad) + bad->name.length);
+ isc_mem_put(bc->mctx, bad, sizeof(*bad));
atomic_fetch_sub_relaxed(&bc->count, 1);
}
UNLOCK(&bc->tlocks[i]);
for (i = 0; atomic_load_relaxed(&bc->count) > 0 && i < bc->size; i++) {
for (entry = bc->table[i]; entry != NULL; entry = next) {
next = entry->next;
- isc_mem_put(bc->mctx, entry,
- sizeof(*entry) + entry->name.length);
+ isc_mem_put(bc->mctx, entry, sizeof(*entry));
atomic_fetch_sub_relaxed(&bc->count, 1);
}
bc->table[i] = NULL;
int n;
next = bad->next;
n = isc_time_compare(&bad->expire, &now);
- if (n < 0 || dns_name_equal(name, &bad->name)) {
+ if (n < 0 || dns_name_equal(name, bad->name)) {
if (prev == NULL) {
bc->table[hash] = bad->next;
} else {
prev->next = bad->next;
}
- isc_mem_put(bc->mctx, bad,
- sizeof(*bad) + bad->name.length);
+ isc_mem_put(bc->mctx, bad, sizeof(*bad));
atomic_fetch_sub_relaxed(&bc->count, 1);
} else {
prev = bad;
for (bad = bc->table[i]; bad != NULL; bad = next) {
next = bad->next;
n = isc_time_compare(&bad->expire, &now);
- if (n < 0 || dns_name_issubdomain(&bad->name, name)) {
+ if (n < 0 || dns_name_issubdomain(bad->name, name)) {
if (prev == NULL) {
bc->table[i] = bad->next;
} else {
prev->next = bad->next;
}
- isc_mem_put(bc->mctx, bad,
- sizeof(*bad) + bad->name.length);
+ isc_mem_put(bc->mctx, bad, sizeof(*bad));
atomic_fetch_sub_relaxed(&bc->count, 1);
} else {
prev = bad;
bc->table[i] = bad->next;
}
- isc_mem_put(bc->mctx, bad,
- sizeof(*bad) + bad->name.length);
+ isc_mem_put(bc->mctx, bad, sizeof(*bad));
atomic_fetch_sub_relaxed(&bc->count, 1);
continue;
}
prev = bad;
- dns_name_format(&bad->name, namebuf, sizeof(namebuf));
+ dns_name_format(bad->name, namebuf, sizeof(namebuf));
dns_rdatatype_format(bad->type, typebuf,
sizeof(typebuf));
t = isc_time_microdiff(&bad->expire, &now);