123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- From ab194ed7ca433e4e2e8b2ec338bfa4e6aa886a4b Mon Sep 17 00:00:00 2001
- From: Simon Kelley <simon@thekelleys.org.uk>
- Date: Tue, 1 Jan 2019 01:35:30 +0000
- Subject: [PATCH 20/32] Futher address union tidying.
- Pass DNSKEY and DS data into cache_insert via the address argument,
- now these data types are included in struct all_addr.
- Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
- ---
- src/cache.c | 116 ++++++++++++++++----------------------------------
- src/dnsmasq.h | 26 +++++------
- src/dnssec.c | 53 +++++++++++------------
- 3 files changed, 73 insertions(+), 122 deletions(-)
- --- a/src/cache.c
- +++ b/src/cache.c
- @@ -202,9 +202,9 @@ static void cache_hash(struct crec *crec
- static void cache_blockdata_free(struct crec *crecp)
- {
- if (crecp->flags & F_DNSKEY)
- - blockdata_free(crecp->addr.key.keydata);
- + blockdata_free(crecp->addr.addr.addr.key.keydata);
- else if ((crecp->flags & F_DS) && !(crecp->flags & F_NEG))
- - blockdata_free(crecp->addr.ds.keydata);
- + blockdata_free(crecp->addr.addr.addr.ds.keydata);
- }
- #endif
-
- @@ -659,33 +659,22 @@ void cache_end_insert(void)
- read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->ttd, sizeof(new_chain->ttd), 0);
- read_write(daemon->pipe_to_parent, (unsigned char *)&flags, sizeof(flags), 0);
-
- - if (flags & (F_IPV4 | F_IPV6))
- + if (flags & (F_IPV4 | F_IPV6 | F_DNSKEY | F_DS))
- read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr, sizeof(new_chain->addr), 0);
- #ifdef HAVE_DNSSEC
- - else if (flags & F_DNSKEY)
- + if (flags & F_DNSKEY)
- {
- read_write(daemon->pipe_to_parent, (unsigned char *)&class, sizeof(class), 0);
- - read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr.key.algo, sizeof(new_chain->addr.key.algo), 0);
- - read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr.key.keytag, sizeof(new_chain->addr.key.keytag), 0);
- - read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr.key.flags, sizeof(new_chain->addr.key.flags), 0);
- - read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr.key.keylen, sizeof(new_chain->addr.key.keylen), 0);
- - blockdata_write(new_chain->addr.key.keydata, new_chain->addr.key.keylen, daemon->pipe_to_parent);
- + blockdata_write(new_chain->addr.addr.addr.key.keydata, new_chain->addr.addr.addr.key.keylen, daemon->pipe_to_parent);
- }
- else if (flags & F_DS)
- {
- read_write(daemon->pipe_to_parent, (unsigned char *)&class, sizeof(class), 0);
- /* A negative DS entry is possible and has no data, obviously. */
- if (!(flags & F_NEG))
- - {
- - read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr.ds.algo, sizeof(new_chain->addr.ds.algo), 0);
- - read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr.ds.keytag, sizeof(new_chain->addr.ds.keytag), 0);
- - read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr.ds.digest, sizeof(new_chain->addr.ds.digest), 0);
- - read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr.ds.keylen, sizeof(new_chain->addr.ds.keylen), 0);
- - blockdata_write(new_chain->addr.ds.keydata, new_chain->addr.ds.keylen, daemon->pipe_to_parent);
- - }
- + blockdata_write(new_chain->addr.addr.addr.ds.keydata, new_chain->addr.addr.addr.ds.keylen, daemon->pipe_to_parent);
- }
- #endif
- -
- }
- }
-
- @@ -736,11 +725,30 @@ int cache_recv_insert(time_t now, int fd
-
- ttl = difftime(ttd, now);
-
- - if (flags & (F_IPV4 | F_IPV6))
- + if (flags & (F_IPV4 | F_IPV6 | F_DNSKEY | F_DS))
- {
- + unsigned short class = C_IN;
- +
- if (!read_write(fd, (unsigned char *)&addr, sizeof(addr), 1))
- return 0;
- - crecp = really_insert(daemon->namebuff, &addr, C_IN, now, ttl, flags);
- +
- +#ifdef HAVE_DNSSEC
- + if (flags & F_DNSKEY)
- + {
- + if (!read_write(fd, (unsigned char *)&class, sizeof(class), 1) ||
- + !(addr.addr.key.keydata = blockdata_read(fd, addr.addr.key.keylen)))
- + return 0;
- + }
- + else if (flags & F_DS)
- + {
- + if (!read_write(fd, (unsigned char *)&class, sizeof(class), 1) ||
- + (flags & F_NEG) ||
- + !(addr.addr.key.keydata = blockdata_read(fd, addr.addr.key.keylen)))
- + return 0;
- + }
- +#endif
- +
- + crecp = really_insert(daemon->namebuff, &addr, class, now, ttl, flags);
- }
- else if (flags & F_CNAME)
- {
- @@ -764,58 +772,6 @@ int cache_recv_insert(time_t now, int fd
- }
- }
- }
- -#ifdef HAVE_DNSSEC
- - else if (flags & (F_DNSKEY | F_DS))
- - {
- - unsigned short class, keylen, keyflags, keytag;
- - unsigned char algo, digest;
- - struct blockdata *keydata;
- -
- - if (!read_write(fd, (unsigned char *)&class, sizeof(class), 1))
- - return 0;
- -
- - crecp = really_insert(daemon->namebuff, NULL, class, now, ttl, flags);
- -
- - if (flags & F_DNSKEY)
- - {
- - if (!read_write(fd, (unsigned char *)&algo, sizeof(algo), 1) ||
- - !read_write(fd, (unsigned char *)&keytag, sizeof(keytag), 1) ||
- - !read_write(fd, (unsigned char *)&keyflags, sizeof(keyflags), 1) ||
- - !read_write(fd, (unsigned char *)&keylen, sizeof(keylen), 1) ||
- - !(keydata = blockdata_read(fd, keylen)))
- - return 0;
- - }
- - else if (!(flags & F_NEG))
- - {
- - if (!read_write(fd, (unsigned char *)&algo, sizeof(algo), 1) ||
- - !read_write(fd, (unsigned char *)&keytag, sizeof(keytag), 1) ||
- - !read_write(fd, (unsigned char *)&digest, sizeof(digest), 1) ||
- - !read_write(fd, (unsigned char *)&keylen, sizeof(keylen), 1) ||
- - !(keydata = blockdata_read(fd, keylen)))
- - return 0;
- - }
- -
- - if (crecp)
- - {
- - if (flags & F_DNSKEY)
- - {
- - crecp->addr.key.algo = algo;
- - crecp->addr.key.keytag = keytag;
- - crecp->addr.key.flags = flags;
- - crecp->addr.key.keylen = keylen;
- - crecp->addr.key.keydata = keydata;
- - }
- - else if (!(flags & F_NEG))
- - {
- - crecp->addr.ds.algo = algo;
- - crecp->addr.ds.keytag = keytag;
- - crecp->addr.ds.digest = digest;
- - crecp->addr.ds.keylen = keylen;
- - crecp->addr.ds.keydata = keydata;
- - }
- - }
- - }
- -#endif
- }
- }
-
- @@ -1290,15 +1246,15 @@ void cache_reload(void)
- #ifdef HAVE_DNSSEC
- for (ds = daemon->ds; ds; ds = ds->next)
- if ((cache = whine_malloc(SIZEOF_POINTER_CREC)) &&
- - (cache->addr.ds.keydata = blockdata_alloc(ds->digest, ds->digestlen)))
- + (cache->addr.addr.addr.ds.keydata = blockdata_alloc(ds->digest, ds->digestlen)))
- {
- cache->flags = F_FORWARD | F_IMMORTAL | F_DS | F_CONFIG | F_NAMEP;
- cache->ttd = daemon->local_ttl;
- cache->name.namep = ds->name;
- - cache->addr.ds.keylen = ds->digestlen;
- - cache->addr.ds.algo = ds->algo;
- - cache->addr.ds.keytag = ds->keytag;
- - cache->addr.ds.digest = ds->digest_type;
- + cache->addr.addr.addr.ds.keylen = ds->digestlen;
- + cache->addr.addr.addr.ds.algo = ds->algo;
- + cache->addr.addr.addr.ds.keytag = ds->keytag;
- + cache->addr.addr.addr.ds.digest = ds->digest_type;
- cache->uid = ds->class;
- cache_hash(cache);
- make_non_terminals(cache);
- @@ -1775,12 +1731,12 @@ void dump_cache(time_t now)
- else if (cache->flags & F_DS)
- {
- if (!(cache->flags & F_NEG))
- - sprintf(a, "%5u %3u %3u", cache->addr.ds.keytag,
- - cache->addr.ds.algo, cache->addr.ds.digest);
- + sprintf(a, "%5u %3u %3u", cache->addr.addr.addr.ds.keytag,
- + cache->addr.addr.addr.ds.algo, cache->addr.addr.addr.ds.digest);
- }
- else if (cache->flags & F_DNSKEY)
- - sprintf(a, "%5u %3u %3u", cache->addr.key.keytag,
- - cache->addr.key.algo, cache->addr.key.flags);
- + sprintf(a, "%5u %3u %3u", cache->addr.addr.addr.key.keytag,
- + cache->addr.addr.addr.key.algo, cache->addr.addr.addr.key.flags);
- #endif
- else if (!(cache->flags & F_NEG) || !(cache->flags & F_FORWARD))
- {
- --- a/src/dnsmasq.h
- +++ b/src/dnsmasq.h
- @@ -277,14 +277,21 @@ struct all_addr {
- union {
- struct in_addr addr4;
- struct in6_addr addr6;
- + struct {
- + struct blockdata *keydata;
- + unsigned short keylen, flags, keytag;
- + unsigned char algo;
- + } key;
- + struct {
- + struct blockdata *keydata;
- + unsigned short keylen, keytag;
- + unsigned char algo;
- + unsigned char digest;
- + } ds;
- /* for log_query */
- struct {
- unsigned short keytag, algo, digest, rcode;
- } log;
- - /* for cache_insert of DNSKEY, DS */
- - struct {
- - unsigned short class, type;
- - } dnssec;
- } addr;
- };
-
- @@ -414,17 +421,6 @@ struct crec {
- } target;
- unsigned int uid; /* 0 if union is interface-name */
- } cname;
- - struct {
- - struct blockdata *keydata;
- - unsigned short keylen, flags, keytag;
- - unsigned char algo;
- - } key;
- - struct {
- - struct blockdata *keydata;
- - unsigned short keylen, keytag;
- - unsigned char algo;
- - unsigned char digest;
- - } ds;
- } addr;
- time_t ttd; /* time to die */
- /* used as class if DNSKEY/DS, index to source for F_HOSTS */
- --- a/src/dnssec.c
- +++ b/src/dnssec.c
- @@ -628,10 +628,10 @@ static int validate_rrset(time_t now, st
- {
- /* iterate through all possible keys 4035 5.3.1 */
- for (; crecp; crecp = cache_find_by_name(crecp, keyname, now, F_DNSKEY))
- - if (crecp->addr.key.algo == algo &&
- - crecp->addr.key.keytag == key_tag &&
- + if (crecp->addr.addr.addr.key.algo == algo &&
- + crecp->addr.addr.addr.key.keytag == key_tag &&
- crecp->uid == (unsigned int)class &&
- - verify(crecp->addr.key.keydata, crecp->addr.key.keylen, sig, sig_len, digest, hash->digest_size, algo))
- + verify(crecp->addr.addr.addr.key.keydata, crecp->addr.addr.addr.key.keylen, sig, sig_len, digest, hash->digest_size, algo))
- return (labels < name_labels) ? STAT_SECURE_WILDCARD : STAT_SECURE;
- }
- }
- @@ -728,10 +728,10 @@ int dnssec_validate_by_ds(time_t now, st
- const struct nettle_hash *hash;
- int sigcnt, rrcnt;
-
- - if (recp1->addr.ds.algo == algo &&
- - recp1->addr.ds.keytag == keytag &&
- + if (recp1->addr.addr.addr.ds.algo == algo &&
- + recp1->addr.addr.addr.ds.keytag == keytag &&
- recp1->uid == (unsigned int)class &&
- - (hash = hash_find(ds_digest_name(recp1->addr.ds.digest))) &&
- + (hash = hash_find(ds_digest_name(recp1->addr.addr.addr.ds.digest))) &&
- hash_init(hash, &ctx, &digest))
-
- {
- @@ -746,9 +746,9 @@ int dnssec_validate_by_ds(time_t now, st
- from_wire(name);
-
- if (!(recp1->flags & F_NEG) &&
- - recp1->addr.ds.keylen == (int)hash->digest_size &&
- - (ds_digest = blockdata_retrieve(recp1->addr.key.keydata, recp1->addr.ds.keylen, NULL)) &&
- - memcmp(ds_digest, digest, recp1->addr.ds.keylen) == 0 &&
- + recp1->addr.addr.addr.ds.keylen == (int)hash->digest_size &&
- + (ds_digest = blockdata_retrieve(recp1->addr.addr.addr.ds.keydata, recp1->addr.addr.addr.ds.keylen, NULL)) &&
- + memcmp(ds_digest, digest, recp1->addr.addr.addr.ds.keylen) == 0 &&
- explore_rrset(header, plen, class, T_DNSKEY, name, keyname, &sigcnt, &rrcnt) &&
- sigcnt != 0 && rrcnt != 0 &&
- validate_rrset(now, header, plen, class, T_DNSKEY, sigcnt, rrcnt, name, keyname,
- @@ -800,7 +800,13 @@ int dnssec_validate_by_ds(time_t now, st
-
- if ((key = blockdata_alloc((char*)p, rdlen - 4)))
- {
- - if (!(recp1 = cache_insert(name, &a, class, now, ttl, F_FORWARD | F_DNSKEY | F_DNSSECOK)))
- + a.addr.key.keylen = rdlen - 4;
- + a.addr.key.keydata = key;
- + a.addr.key.algo = algo;
- + a.addr.key.keytag = keytag;
- + a.addr.key.flags = flags;
- +
- + if (!cache_insert(name, &a, class, now, ttl, F_FORWARD | F_DNSKEY | F_DNSSECOK))
- {
- blockdata_free(key);
- return STAT_BOGUS;
- @@ -813,12 +819,6 @@ int dnssec_validate_by_ds(time_t now, st
- log_query(F_NOEXTRA | F_KEYTAG | F_UPSTREAM, name, &a, "DNSKEY keytag %hu, algo %hu");
- else
- log_query(F_NOEXTRA | F_KEYTAG | F_UPSTREAM, name, &a, "DNSKEY keytag %hu, algo %hu (not supported)");
- -
- - recp1->addr.key.keylen = rdlen - 4;
- - recp1->addr.key.keydata = key;
- - recp1->addr.key.algo = algo;
- - recp1->addr.key.keytag = keytag;
- - recp1->addr.key.flags = flags;
- }
- }
- }
- @@ -915,8 +915,7 @@ int dnssec_validate_ds(time_t now, struc
- int algo, digest, keytag;
- unsigned char *psave = p;
- struct blockdata *key;
- - struct crec *crecp;
- -
- +
- if (rdlen < 4)
- return STAT_BOGUS; /* bad packet */
-
- @@ -926,7 +925,13 @@ int dnssec_validate_ds(time_t now, struc
-
- if ((key = blockdata_alloc((char*)p, rdlen - 4)))
- {
- - if (!(crecp = cache_insert(name, NULL, class, now, ttl, F_FORWARD | F_DS | F_DNSSECOK)))
- + a.addr.ds.digest = digest;
- + a.addr.ds.keydata = key;
- + a.addr.ds.algo = algo;
- + a.addr.ds.keytag = keytag;
- + a.addr.ds.keylen = rdlen - 4;
- +
- + if (!cache_insert(name, &a, class, now, ttl, F_FORWARD | F_DS | F_DNSSECOK))
- {
- blockdata_free(key);
- return STAT_BOGUS;
- @@ -940,12 +945,6 @@ int dnssec_validate_ds(time_t now, struc
- log_query(F_NOEXTRA | F_KEYTAG | F_UPSTREAM, name, &a, "DS keytag %hu, algo %hu, digest %hu");
- else
- log_query(F_NOEXTRA | F_KEYTAG | F_UPSTREAM, name, &a, "DS keytag %hu, algo %hu, digest %hu (not supported)");
- -
- - crecp->addr.ds.digest = digest;
- - crecp->addr.ds.keydata = key;
- - crecp->addr.ds.algo = algo;
- - crecp->addr.ds.keytag = keytag;
- - crecp->addr.ds.keylen = rdlen - 4;
- }
- }
-
- @@ -1711,8 +1710,8 @@ static int zone_status(char *name, int c
- do
- {
- if (crecp->uid == (unsigned int)class &&
- - ds_digest_name(crecp->addr.ds.digest) &&
- - algo_digest_name(crecp->addr.ds.algo))
- + ds_digest_name(crecp->addr.addr.addr.ds.digest) &&
- + algo_digest_name(crecp->addr.addr.addr.ds.algo))
- break;
- }
- while ((crecp = cache_find_by_name(crecp, keyname, now, F_DS)));
|