Commit cdbee9a4 authored by Simon Kelley's avatar Simon Kelley

Find room to store key-id and digest-type in DS records.

->uid is now overloaded to store key length
parent 7b4ad2eb
...@@ -240,7 +240,11 @@ static int is_outdated_cname_pointer(struct crec *crecp) ...@@ -240,7 +240,11 @@ static int is_outdated_cname_pointer(struct crec *crecp)
if (!(crecp->flags & F_CNAME)) if (!(crecp->flags & F_CNAME))
return 0; return 0;
if (crecp->addr.cname.cache && crecp->addr.cname.uid == crecp->addr.cname.cache->uid) /* NB. record may be reused as DS or DNSKEY, where uid is
overloaded for something completely different */
if (crecp->addr.cname.cache &&
(crecp->addr.cname.cache->flags & (F_IPV4 | F_IPV6)) &&
crecp->addr.cname.uid == crecp->addr.cname.cache->uid)
return 0; return 0;
return 1; return 1;
...@@ -1158,10 +1162,16 @@ void dump_cache(time_t now) ...@@ -1158,10 +1162,16 @@ void dump_cache(time_t now)
a = cache_get_name(cache->addr.cname.cache); a = cache_get_name(cache->addr.cname.cache);
} }
#ifdef HAVE_DNSSEC #ifdef HAVE_DNSSEC
else if (cache->flags & (F_DNSKEY | F_DS)) else if (cache->flags & F_DNSKEY)
{ {
a = daemon->addrbuff; a = daemon->addrbuff;
sprintf(a, "%u %u", cache->addr.key.algo, cache->addr.key.keylen); sprintf(a, "%3u %u", cache->addr.key.algo, cache->uid);
}
else if (cache->flags & F_DS)
{
a = daemon->addrbuff;
sprintf(a, "%5u %3u %3u %u", cache->addr.key.flags_or_keyid,
cache->addr.key.algo, cache->addr.key.digest, cache->uid);
} }
#endif #endif
else else
......
...@@ -305,8 +305,7 @@ struct keydata { ...@@ -305,8 +305,7 @@ struct keydata {
struct crec { struct crec {
struct crec *next, *prev, *hash_next; struct crec *next, *prev, *hash_next;
time_t ttd; /* time to die */ /* union is 16 bytes when doing IPv6, 8 bytes on 32 bit machines without IPv6 */
int uid;
union { union {
struct all_addr addr; struct all_addr addr;
struct { struct {
...@@ -316,10 +315,13 @@ struct crec { ...@@ -316,10 +315,13 @@ struct crec {
struct { struct {
struct keydata *keydata; struct keydata *keydata;
unsigned char algo; unsigned char algo;
unsigned char flags; unsigned char digest; /* DS only */
unsigned short keylen; unsigned short flags_or_keyid; /* flags for DNSKEY, keyid for DS */
} key; } key;
} addr; } addr;
time_t ttd; /* time to die */
/* used as keylen if F_DS or F_DNSKEY, index to source for F_HOSTS */
int uid;
unsigned short flags; unsigned short flags;
union { union {
char sname[SMALLDNAME]; char sname[SMALLDNAME];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment