Better allocation code for DS digest cache.

This commit is contained in:
Simon Kelley
2024-01-06 20:51:13 +00:00
parent 3c91bca943
commit 39de57499e

View File

@@ -724,7 +724,8 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
union all_addr a; union all_addr a;
int failflags = DNSSEC_FAIL_NODSSUP | DNSSEC_FAIL_NOZONE; int failflags = DNSSEC_FAIL_NODSSUP | DNSSEC_FAIL_NOZONE;
char valid_digest[255]; char valid_digest[255];
static unsigned char *cached_digest[255]; static unsigned char **cached_digest;
static size_t cached_digest_size = 0;
if (ntohs(header->qdcount) != 1 || RCODE(header) != NOERROR || !extract_name(header, plen, &p, name, 1, 4)) if (ntohs(header->qdcount) != 1 || RCODE(header) != NOERROR || !extract_name(header, plen, &p, name, 1, 4))
return STAT_BOGUS | DNSSEC_FAIL_NOKEY; return STAT_BOGUS | DNSSEC_FAIL_NOKEY;
@@ -840,6 +841,26 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
from_wire(name); from_wire(name);
if (recp1->addr.ds.digest >= cached_digest_size)
{
unsigned char **new;
/* whine_malloc zeros memory */
if ((new = whine_malloc((recp1->addr.ds.digest + 5) * sizeof(unsigned char *))))
{
if (cached_digest_size != 0)
{
memcpy(new, cached_digest, cached_digest_size * sizeof(unsigned char *));
free(cached_digest);
}
cached_digest_size = recp1->addr.ds.digest + 5;
cached_digest = new;
}
}
if (recp1->addr.ds.digest < cached_digest_size)
{
if (!cached_digest[recp1->addr.ds.digest]) if (!cached_digest[recp1->addr.ds.digest])
cached_digest[recp1->addr.ds.digest] = whine_malloc(recp1->addr.ds.keylen); cached_digest[recp1->addr.ds.digest] = whine_malloc(recp1->addr.ds.keylen);
@@ -849,6 +870,7 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
valid_digest[recp1->addr.ds.digest] = 1; valid_digest[recp1->addr.ds.digest] = 1;
} }
} }
}
if (memcmp(ds_digest, digest, recp1->addr.ds.keylen) == 0) if (memcmp(ds_digest, digest, recp1->addr.ds.keylen) == 0)
{ {