From cdbee9a40b35903f561611d7e701d7c11ec4bf47 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Wed, 4 Apr 2012 21:55:59 +0100 Subject: [PATCH] Find room to store key-id and digest-type in DS records. ->uid is now overloaded to store key length --- src/cache.c | 16 +++++++++++++--- src/dnsmasq.h | 10 ++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/cache.c b/src/cache.c index cf6cdb9..5826a32 100644 --- a/src/cache.c +++ b/src/cache.c @@ -240,7 +240,11 @@ static int is_outdated_cname_pointer(struct crec *crecp) if (!(crecp->flags & F_CNAME)) 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 1; @@ -1158,10 +1162,16 @@ void dump_cache(time_t now) a = cache_get_name(cache->addr.cname.cache); } #ifdef HAVE_DNSSEC - else if (cache->flags & (F_DNSKEY | F_DS)) + else if (cache->flags & F_DNSKEY) { 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 else diff --git a/src/dnsmasq.h b/src/dnsmasq.h index bfac3da..4161746 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -305,8 +305,7 @@ struct keydata { struct crec { struct crec *next, *prev, *hash_next; - time_t ttd; /* time to die */ - int uid; + /* union is 16 bytes when doing IPv6, 8 bytes on 32 bit machines without IPv6 */ union { struct all_addr addr; struct { @@ -316,10 +315,13 @@ struct crec { struct { struct keydata *keydata; unsigned char algo; - unsigned char flags; - unsigned short keylen; + unsigned char digest; /* DS only */ + unsigned short flags_or_keyid; /* flags for DNSKEY, keyid for DS */ } key; } 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; union { char sname[SMALLDNAME]; -- 2.39.2