Home | History | Annotate | Line # | Download | only in services
      1 /*
      2  * services/authzone.c - authoritative zone that is locally hosted.
      3  *
      4  * Copyright (c) 2017, NLnet Labs. All rights reserved.
      5  *
      6  * This software is open source.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  *
     12  * Redistributions of source code must retain the above copyright notice,
     13  * this list of conditions and the following disclaimer.
     14  *
     15  * Redistributions in binary form must reproduce the above copyright notice,
     16  * this list of conditions and the following disclaimer in the documentation
     17  * and/or other materials provided with the distribution.
     18  *
     19  * Neither the name of the NLNET LABS nor the names of its contributors may
     20  * be used to endorse or promote products derived from this software without
     21  * specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     27  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
     29  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     30  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     31  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34  */
     35 
     36 /**
     37  * \file
     38  *
     39  * This file contains the functions for an authority zone.  This zone
     40  * is queried by the iterator, just like a stub or forward zone, but then
     41  * the data is locally held.
     42  */
     43 
     44 #include "config.h"
     45 #include "services/authzone.h"
     46 #include "util/data/dname.h"
     47 #include "util/data/msgparse.h"
     48 #include "util/data/msgreply.h"
     49 #include "util/data/msgencode.h"
     50 #include "util/data/packed_rrset.h"
     51 #include "util/regional.h"
     52 #include "util/net_help.h"
     53 #include "util/netevent.h"
     54 #include "util/config_file.h"
     55 #include "util/log.h"
     56 #include "util/module.h"
     57 #include "util/random.h"
     58 #include "util/timeval_func.h"
     59 #include "services/cache/dns.h"
     60 #include "services/outside_network.h"
     61 #include "services/listen_dnsport.h"
     62 #include "services/mesh.h"
     63 #include "sldns/rrdef.h"
     64 #include "sldns/pkthdr.h"
     65 #include "sldns/sbuffer.h"
     66 #include "sldns/str2wire.h"
     67 #include "sldns/wire2str.h"
     68 #include "sldns/parseutil.h"
     69 #include "sldns/keyraw.h"
     70 #include "validator/val_nsec3.h"
     71 #include "validator/val_nsec.h"
     72 #include "validator/val_secalgo.h"
     73 #include "validator/val_sigcrypt.h"
     74 #include "validator/val_anchor.h"
     75 #include "validator/val_utils.h"
     76 #include <ctype.h>
     77 
     78 /** bytes to use for NSEC3 hash buffer. 20 for sha1 */
     79 #define N3HASHBUFLEN 32
     80 /** max number of CNAMEs we are willing to follow (in one answer) */
     81 #define MAX_CNAME_CHAIN 8
     82 /** timeout for probe packets for SOA */
     83 #define AUTH_PROBE_TIMEOUT 100 /* msec */
     84 /** when to stop with SOA probes (when exponential timeouts exceed this) */
     85 #define AUTH_PROBE_TIMEOUT_STOP 1000 /* msec */
     86 /* auth transfer timeout for TCP connections, in msec */
     87 #define AUTH_TRANSFER_TIMEOUT 10000 /* msec */
     88 /* auth transfer max backoff for failed transfers and probes */
     89 #define AUTH_TRANSFER_MAX_BACKOFF 86400 /* sec */
     90 /* auth http port number */
     91 #define AUTH_HTTP_PORT 80
     92 /* auth https port number */
     93 #define AUTH_HTTPS_PORT 443
     94 /* max depth for nested $INCLUDEs */
     95 #define MAX_INCLUDE_DEPTH 10
     96 /** number of timeouts before we fallback from IXFR to AXFR,
     97  * because some versions of servers (eg. dnsmasq) drop IXFR packets. */
     98 #define NUM_TIMEOUTS_FALLBACK_IXFR 3
     99 /** number of IXFRs before an AXFR is performed, to consolidate RPZ memory. */
    100 #define NUM_IXFR_BEFORE_AXFR 5
    101 
    102 /** pick up nextprobe task to start waiting to perform transfer actions */
    103 static void xfr_set_timeout(struct auth_xfer* xfr, struct module_env* env,
    104 	int failure, int lookup_only);
    105 /** move to sending the probe packets, next if fails. task_probe */
    106 static void xfr_probe_send_or_end(struct auth_xfer* xfr,
    107 	struct module_env* env);
    108 /** pick up probe task with specified(or NULL) destination first,
    109  * or transfer task if nothing to probe, or false if already in progress */
    110 static int xfr_start_probe(struct auth_xfer* xfr, struct module_env* env,
    111 	struct auth_master* spec);
    112 /** copy the master addresses from the task_probe lookups to the allow_notify
    113  * list of masters */
    114 static void probe_copy_masters_for_allow_notify(struct auth_xfer* xfr);
    115 /** delete xfer structure (not its tree entry) */
    116 void auth_xfer_delete(struct auth_xfer* xfr);
    117 
    118 /** create new dns_msg */
    119 static struct dns_msg*
    120 msg_create(struct regional* region, struct query_info* qinfo)
    121 {
    122 	struct dns_msg* msg = (struct dns_msg*)regional_alloc(region,
    123 		sizeof(struct dns_msg));
    124 	if(!msg)
    125 		return NULL;
    126 	msg->qinfo.qname = regional_alloc_init(region, qinfo->qname,
    127 		qinfo->qname_len);
    128 	if(!msg->qinfo.qname)
    129 		return NULL;
    130 	msg->qinfo.qname_len = qinfo->qname_len;
    131 	msg->qinfo.qtype = qinfo->qtype;
    132 	msg->qinfo.qclass = qinfo->qclass;
    133 	msg->qinfo.local_alias = NULL;
    134 	/* non-packed reply_info, because it needs to grow the array */
    135 	msg->rep = (struct reply_info*)regional_alloc_zero(region,
    136 		sizeof(struct reply_info)-sizeof(struct rrset_ref));
    137 	if(!msg->rep)
    138 		return NULL;
    139 	msg->rep->flags = (uint16_t)(BIT_QR | BIT_AA);
    140 	msg->rep->authoritative = 1;
    141 	msg->rep->reason_bogus = LDNS_EDE_NONE;
    142 	msg->rep->qdcount = 1;
    143 	/* rrsets is NULL, no rrsets yet */
    144 	return msg;
    145 }
    146 
    147 /** grow rrset array by one in msg */
    148 static int
    149 msg_grow_array(struct regional* region, struct dns_msg* msg)
    150 {
    151 	if(msg->rep->rrsets == NULL) {
    152 		msg->rep->rrsets = regional_alloc_zero(region,
    153 			sizeof(struct ub_packed_rrset_key*)*(msg->rep->rrset_count+1));
    154 		if(!msg->rep->rrsets)
    155 			return 0;
    156 	} else {
    157 		struct ub_packed_rrset_key** rrsets_old = msg->rep->rrsets;
    158 		msg->rep->rrsets = regional_alloc_zero(region,
    159 			sizeof(struct ub_packed_rrset_key*)*(msg->rep->rrset_count+1));
    160 		if(!msg->rep->rrsets)
    161 			return 0;
    162 		memmove(msg->rep->rrsets, rrsets_old,
    163 			sizeof(struct ub_packed_rrset_key*)*msg->rep->rrset_count);
    164 	}
    165 	return 1;
    166 }
    167 
    168 /** get ttl of rrset */
    169 static time_t
    170 get_rrset_ttl(struct ub_packed_rrset_key* k)
    171 {
    172 	struct packed_rrset_data* d = (struct packed_rrset_data*)
    173 		k->entry.data;
    174 	return d->ttl;
    175 }
    176 
    177 /** Copy rrset into region from domain-datanode and packet rrset */
    178 static struct ub_packed_rrset_key*
    179 auth_packed_rrset_copy_region(struct auth_zone* z, struct auth_data* node,
    180 	struct auth_rrset* rrset, struct regional* region)
    181 {
    182 	struct ub_packed_rrset_key key;
    183 	memset(&key, 0, sizeof(key));
    184 	key.entry.key = &key;
    185 	key.entry.data = rrset->data;
    186 	key.rk.dname = node->name;
    187 	key.rk.dname_len = node->namelen;
    188 	key.rk.type = htons(rrset->type);
    189 	key.rk.rrset_class = htons(z->dclass);
    190 	key.entry.hash = rrset_key_hash(&key.rk);
    191 	return packed_rrset_copy_region(&key, region, 0);
    192 }
    193 
    194 /** fix up msg->rep TTL and prefetch ttl */
    195 static void
    196 msg_ttl(struct dns_msg* msg)
    197 {
    198 	if(msg->rep->rrset_count == 0) return;
    199 	if(msg->rep->rrset_count == 1) {
    200 		msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[0]);
    201 		msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
    202 		msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
    203 	} else if(get_rrset_ttl(msg->rep->rrsets[msg->rep->rrset_count-1]) <
    204 		msg->rep->ttl) {
    205 		msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[
    206 			msg->rep->rrset_count-1]);
    207 		msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
    208 		msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
    209 	}
    210 }
    211 
    212 /** see if rrset is a duplicate in the answer message */
    213 static int
    214 msg_rrset_duplicate(struct dns_msg* msg, uint8_t* nm, size_t nmlen,
    215 	uint16_t type, uint16_t dclass)
    216 {
    217 	size_t i;
    218 	for(i=0; i<msg->rep->rrset_count; i++) {
    219 		struct ub_packed_rrset_key* k = msg->rep->rrsets[i];
    220 		if(ntohs(k->rk.type) == type && k->rk.dname_len == nmlen &&
    221 			ntohs(k->rk.rrset_class) == dclass &&
    222 			query_dname_compare(k->rk.dname, nm) == 0)
    223 			return 1;
    224 	}
    225 	return 0;
    226 }
    227 
    228 /** add rrset to answer section (no auth, add rrsets yet) */
    229 static int
    230 msg_add_rrset_an(struct auth_zone* z, struct regional* region,
    231 	struct dns_msg* msg, struct auth_data* node, struct auth_rrset* rrset)
    232 {
    233 	log_assert(msg->rep->ns_numrrsets == 0);
    234 	log_assert(msg->rep->ar_numrrsets == 0);
    235 	if(!rrset || !node)
    236 		return 1;
    237 	if(msg_rrset_duplicate(msg, node->name, node->namelen, rrset->type,
    238 		z->dclass))
    239 		return 1;
    240 	/* grow array */
    241 	if(!msg_grow_array(region, msg))
    242 		return 0;
    243 	/* copy it */
    244 	if(!(msg->rep->rrsets[msg->rep->rrset_count] =
    245 		auth_packed_rrset_copy_region(z, node, rrset, region)))
    246 		return 0;
    247 	msg->rep->rrset_count++;
    248 	msg->rep->an_numrrsets++;
    249 	msg_ttl(msg);
    250 	return 1;
    251 }
    252 
    253 /** add rrset to authority section (no additional section rrsets yet) */
    254 static int
    255 msg_add_rrset_ns(struct auth_zone* z, struct regional* region,
    256 	struct dns_msg* msg, struct auth_data* node, struct auth_rrset* rrset)
    257 {
    258 	log_assert(msg->rep->ar_numrrsets == 0);
    259 	if(!rrset || !node)
    260 		return 1;
    261 	if(msg_rrset_duplicate(msg, node->name, node->namelen, rrset->type,
    262 		z->dclass))
    263 		return 1;
    264 	/* grow array */
    265 	if(!msg_grow_array(region, msg))
    266 		return 0;
    267 	/* copy it */
    268 	if(!(msg->rep->rrsets[msg->rep->rrset_count] =
    269 		auth_packed_rrset_copy_region(z, node, rrset, region)))
    270 		return 0;
    271 	msg->rep->rrset_count++;
    272 	msg->rep->ns_numrrsets++;
    273 	msg_ttl(msg);
    274 	return 1;
    275 }
    276 
    277 /** add rrset to additional section */
    278 static int
    279 msg_add_rrset_ar(struct auth_zone* z, struct regional* region,
    280 	struct dns_msg* msg, struct auth_data* node, struct auth_rrset* rrset)
    281 {
    282 	if(!rrset || !node)
    283 		return 1;
    284 	if(msg_rrset_duplicate(msg, node->name, node->namelen, rrset->type,
    285 		z->dclass))
    286 		return 1;
    287 	/* grow array */
    288 	if(!msg_grow_array(region, msg))
    289 		return 0;
    290 	/* copy it */
    291 	if(!(msg->rep->rrsets[msg->rep->rrset_count] =
    292 		auth_packed_rrset_copy_region(z, node, rrset, region)))
    293 		return 0;
    294 	msg->rep->rrset_count++;
    295 	msg->rep->ar_numrrsets++;
    296 	msg_ttl(msg);
    297 	return 1;
    298 }
    299 
    300 struct auth_zones* auth_zones_create(void)
    301 {
    302 	struct auth_zones* az = (struct auth_zones*)calloc(1, sizeof(*az));
    303 	if(!az) {
    304 		log_err("out of memory");
    305 		return NULL;
    306 	}
    307 	rbtree_init(&az->ztree, &auth_zone_cmp);
    308 	rbtree_init(&az->xtree, &auth_xfer_cmp);
    309 	lock_rw_init(&az->lock);
    310 	lock_protect(&az->lock, &az->ztree, sizeof(az->ztree));
    311 	lock_protect(&az->lock, &az->xtree, sizeof(az->xtree));
    312 	/* also lock protects the rbnode's in struct auth_zone, auth_xfer */
    313 	lock_rw_init(&az->rpz_lock);
    314 	lock_protect(&az->rpz_lock, &az->rpz_first, sizeof(az->rpz_first));
    315 	return az;
    316 }
    317 
    318 int auth_zone_cmp(const void* z1, const void* z2)
    319 {
    320 	/* first sort on class, so that hierarchy can be maintained within
    321 	 * a class */
    322 	struct auth_zone* a = (struct auth_zone*)z1;
    323 	struct auth_zone* b = (struct auth_zone*)z2;
    324 	int m;
    325 	if(a->dclass != b->dclass) {
    326 		if(a->dclass < b->dclass)
    327 			return -1;
    328 		return 1;
    329 	}
    330 	/* sorted such that higher zones sort before lower zones (their
    331 	 * contents) */
    332 	return dname_lab_cmp(a->name, a->namelabs, b->name, b->namelabs, &m);
    333 }
    334 
    335 int auth_data_cmp(const void* z1, const void* z2)
    336 {
    337 	struct auth_data* a = (struct auth_data*)z1;
    338 	struct auth_data* b = (struct auth_data*)z2;
    339 	int m;
    340 	/* canonical sort, because DNSSEC needs that */
    341 	return dname_canon_lab_cmp(a->name, a->namelabs, b->name,
    342 		b->namelabs, &m);
    343 }
    344 
    345 int auth_xfer_cmp(const void* z1, const void* z2)
    346 {
    347 	/* first sort on class, so that hierarchy can be maintained within
    348 	 * a class */
    349 	struct auth_xfer* a = (struct auth_xfer*)z1;
    350 	struct auth_xfer* b = (struct auth_xfer*)z2;
    351 	int m;
    352 	if(a->dclass != b->dclass) {
    353 		if(a->dclass < b->dclass)
    354 			return -1;
    355 		return 1;
    356 	}
    357 	/* sorted such that higher zones sort before lower zones (their
    358 	 * contents) */
    359 	return dname_lab_cmp(a->name, a->namelabs, b->name, b->namelabs, &m);
    360 }
    361 
    362 /** delete auth rrset node */
    363 static void
    364 auth_rrset_delete(struct auth_rrset* rrset)
    365 {
    366 	if(!rrset) return;
    367 	free(rrset->data);
    368 	free(rrset);
    369 }
    370 
    371 /** delete auth data domain node */
    372 static void
    373 auth_data_delete(struct auth_data* n)
    374 {
    375 	struct auth_rrset* p, *np;
    376 	if(!n) return;
    377 	p = n->rrsets;
    378 	while(p) {
    379 		np = p->next;
    380 		auth_rrset_delete(p);
    381 		p = np;
    382 	}
    383 	free(n->name);
    384 	free(n);
    385 }
    386 
    387 /** helper traverse to delete zones */
    388 static void
    389 auth_data_del(rbnode_type* n, void* ATTR_UNUSED(arg))
    390 {
    391 	struct auth_data* z = (struct auth_data*)n->key;
    392 	auth_data_delete(z);
    393 }
    394 
    395 /** delete chunklist */
    396 static void
    397 auth_chunk_list_delete(struct auth_chunk* first)
    398 {
    399 	struct auth_chunk* c, *cn;
    400 	c = first;
    401 	while(c) {
    402 		cn = c->next;
    403 		free(c->data);
    404 		free(c);
    405 		c = cn;
    406 	}
    407 }
    408 
    409 /** delete an auth zone structure (tree remove must be done elsewhere) */
    410 static void
    411 auth_zone_delete(struct auth_zone* z, struct auth_zones* az)
    412 {
    413 	if(!z) return;
    414 	lock_rw_destroy(&z->lock);
    415 	traverse_postorder(&z->data, auth_data_del, NULL);
    416 
    417 	if(az && z->rpz) {
    418 		/* keep RPZ linked list intact */
    419 		lock_rw_wrlock(&az->rpz_lock);
    420 		if(z->rpz_az_prev)
    421 			z->rpz_az_prev->rpz_az_next = z->rpz_az_next;
    422 		else
    423 			az->rpz_first = z->rpz_az_next;
    424 		if(z->rpz_az_next)
    425 			z->rpz_az_next->rpz_az_prev = z->rpz_az_prev;
    426 		lock_rw_unlock(&az->rpz_lock);
    427 	}
    428 	if(z->rpz)
    429 		rpz_delete(z->rpz);
    430 	auth_chunk_list_delete(z->perform_write_chunk_list);
    431 	free(z->name);
    432 	free(z->zonefile);
    433 	free(z);
    434 }
    435 
    436 struct auth_zone*
    437 auth_zone_create(struct auth_zones* az, uint8_t* nm, size_t nmlen,
    438 	uint16_t dclass)
    439 {
    440 	struct auth_zone* z = (struct auth_zone*)calloc(1, sizeof(*z));
    441 	if(!z) {
    442 		return NULL;
    443 	}
    444 	z->node.key = z;
    445 	z->dclass = dclass;
    446 	z->namelen = nmlen;
    447 	z->namelabs = dname_count_labels(nm);
    448 	z->name = memdup(nm, nmlen);
    449 	if(!z->name) {
    450 		free(z);
    451 		return NULL;
    452 	}
    453 	rbtree_init(&z->data, &auth_data_cmp);
    454 	lock_rw_init(&z->lock);
    455 	lock_protect(&z->lock, &z->name, sizeof(*z)-sizeof(rbnode_type)-
    456 			sizeof(z->rpz_az_next)-sizeof(z->rpz_az_prev)-
    457 			sizeof(z->max_transfer_size)-sizeof(z->max_transfer_size));
    458 	lock_protect(&z->lock, &z->max_transfer_size,
    459 		sizeof(z->max_transfer_size));
    460 	lock_protect(&z->lock, &z->max_transfer_time,
    461 		sizeof(z->max_transfer_time));
    462 	lock_rw_wrlock(&z->lock);
    463 	/* z lock protects all, except rbtree itself and the rpz linked list
    464 	 * pointers, which are protected using az->lock */
    465 	if(!rbtree_insert(&az->ztree, &z->node)) {
    466 		lock_rw_unlock(&z->lock);
    467 		auth_zone_delete(z, NULL);
    468 		log_warn("duplicate auth zone");
    469 		return NULL;
    470 	}
    471 	return z;
    472 }
    473 
    474 struct auth_zone*
    475 auth_zone_find(struct auth_zones* az, uint8_t* nm, size_t nmlen,
    476 	uint16_t dclass)
    477 {
    478 	struct auth_zone key;
    479 	key.node.key = &key;
    480 	key.dclass = dclass;
    481 	key.name = nm;
    482 	key.namelen = nmlen;
    483 	key.namelabs = dname_count_labels(nm);
    484 	return (struct auth_zone*)rbtree_search(&az->ztree, &key);
    485 }
    486 
    487 struct auth_xfer*
    488 auth_xfer_find(struct auth_zones* az, uint8_t* nm, size_t nmlen,
    489 	uint16_t dclass)
    490 {
    491 	struct auth_xfer key;
    492 	key.node.key = &key;
    493 	key.dclass = dclass;
    494 	key.name = nm;
    495 	key.namelen = nmlen;
    496 	key.namelabs = dname_count_labels(nm);
    497 	return (struct auth_xfer*)rbtree_search(&az->xtree, &key);
    498 }
    499 
    500 /** find an auth zone or sorted less-or-equal, return true if exact */
    501 static int
    502 auth_zone_find_less_equal(struct auth_zones* az, uint8_t* nm, size_t nmlen,
    503 	uint16_t dclass, struct auth_zone** z)
    504 {
    505 	struct auth_zone key;
    506 	key.node.key = &key;
    507 	key.dclass = dclass;
    508 	key.name = nm;
    509 	key.namelen = nmlen;
    510 	key.namelabs = dname_count_labels(nm);
    511 	return rbtree_find_less_equal(&az->ztree, &key, (rbnode_type**)z);
    512 }
    513 
    514 
    515 /** find the auth zone that is above the given name */
    516 struct auth_zone*
    517 auth_zones_find_zone(struct auth_zones* az, uint8_t* name, size_t name_len,
    518 	uint16_t dclass)
    519 {
    520 	uint8_t* nm = name;
    521 	size_t nmlen = name_len;
    522 	struct auth_zone* z;
    523 	if(auth_zone_find_less_equal(az, nm, nmlen, dclass, &z)) {
    524 		/* exact match */
    525 		return z;
    526 	} else {
    527 		/* less-or-nothing */
    528 		if(!z) return NULL; /* nothing smaller, nothing above it */
    529 		/* we found smaller name; smaller may be above the name,
    530 		 * but not below it. */
    531 		nm = dname_get_shared_topdomain(z->name, name);
    532 		dname_count_size_labels(nm, &nmlen);
    533 		z = NULL;
    534 	}
    535 
    536 	/* search up */
    537 	while(!z) {
    538 		z = auth_zone_find(az, nm, nmlen, dclass);
    539 		if(z) return z;
    540 		if(dname_is_root(nm)) break;
    541 		dname_remove_label(&nm, &nmlen);
    542 	}
    543 	return NULL;
    544 }
    545 
    546 /** find or create zone with name str. caller must have lock on az.
    547  * returns a wrlocked zone */
    548 static struct auth_zone*
    549 auth_zones_find_or_add_zone(struct auth_zones* az, char* name)
    550 {
    551 	uint8_t nm[LDNS_MAX_DOMAINLEN+1];
    552 	size_t nmlen = sizeof(nm);
    553 	struct auth_zone* z;
    554 
    555 	if(sldns_str2wire_dname_buf(name, nm, &nmlen) != 0) {
    556 		log_err("cannot parse auth zone name: %s", name);
    557 		return 0;
    558 	}
    559 	z = auth_zone_find(az, nm, nmlen, LDNS_RR_CLASS_IN);
    560 	if(!z) {
    561 		/* not found, create the zone */
    562 		z = auth_zone_create(az, nm, nmlen, LDNS_RR_CLASS_IN);
    563 	} else {
    564 		lock_rw_wrlock(&z->lock);
    565 	}
    566 	return z;
    567 }
    568 
    569 /** find or create xfer zone with name str. caller must have lock on az.
    570  * returns a locked xfer */
    571 static struct auth_xfer*
    572 auth_zones_find_or_add_xfer(struct auth_zones* az, struct auth_zone* z)
    573 {
    574 	struct auth_xfer* x;
    575 	x = auth_xfer_find(az, z->name, z->namelen, z->dclass);
    576 	if(!x) {
    577 		/* not found, create the zone */
    578 		x = auth_xfer_create(az, z);
    579 	} else {
    580 		lock_basic_lock(&x->lock);
    581 	}
    582 	return x;
    583 }
    584 
    585 int
    586 auth_zone_set_zonefile(struct auth_zone* z, char* zonefile)
    587 {
    588 	if(z->zonefile) free(z->zonefile);
    589 	if(zonefile == NULL) {
    590 		z->zonefile = NULL;
    591 	} else {
    592 		z->zonefile = strdup(zonefile);
    593 		if(!z->zonefile) {
    594 			log_err("malloc failure");
    595 			return 0;
    596 		}
    597 	}
    598 	return 1;
    599 }
    600 
    601 /** set auth zone fallback. caller must have lock on zone */
    602 int
    603 auth_zone_set_fallback(struct auth_zone* z, char* fallbackstr)
    604 {
    605 	if(strcmp(fallbackstr, "yes") != 0 && strcmp(fallbackstr, "no") != 0){
    606 		log_err("auth zone fallback, expected yes or no, got %s",
    607 			fallbackstr);
    608 		return 0;
    609 	}
    610 	z->fallback_enabled = (strcmp(fallbackstr, "yes")==0);
    611 	return 1;
    612 }
    613 
    614 /** create domain with the given name */
    615 static struct auth_data*
    616 az_domain_create(struct auth_zone* z, uint8_t* nm, size_t nmlen)
    617 {
    618 	struct auth_data* n = (struct auth_data*)malloc(sizeof(*n));
    619 	if(!n) return NULL;
    620 	memset(n, 0, sizeof(*n));
    621 	n->node.key = n;
    622 	n->name = memdup(nm, nmlen);
    623 	if(!n->name) {
    624 		free(n);
    625 		return NULL;
    626 	}
    627 	n->namelen = nmlen;
    628 	n->namelabs = dname_count_labels(nm);
    629 	if(!rbtree_insert(&z->data, &n->node)) {
    630 		log_warn("duplicate auth domain name");
    631 		free(n->name);
    632 		free(n);
    633 		return NULL;
    634 	}
    635 	return n;
    636 }
    637 
    638 /** find domain with exactly the given name */
    639 static struct auth_data*
    640 az_find_name(struct auth_zone* z, uint8_t* nm, size_t nmlen)
    641 {
    642 	struct auth_zone key;
    643 	key.node.key = &key;
    644 	key.name = nm;
    645 	key.namelen = nmlen;
    646 	key.namelabs = dname_count_labels(nm);
    647 	return (struct auth_data*)rbtree_search(&z->data, &key);
    648 }
    649 
    650 /** Find domain name (or closest match) */
    651 static void
    652 az_find_domain(struct auth_zone* z, struct query_info* qinfo, int* node_exact,
    653 	struct auth_data** node)
    654 {
    655 	struct auth_zone key;
    656 	key.node.key = &key;
    657 	key.name = qinfo->qname;
    658 	key.namelen = qinfo->qname_len;
    659 	key.namelabs = dname_count_labels(key.name);
    660 	*node_exact = rbtree_find_less_equal(&z->data, &key,
    661 		(rbnode_type**)node);
    662 }
    663 
    664 /** find or create domain with name in zone */
    665 static struct auth_data*
    666 az_domain_find_or_create(struct auth_zone* z, uint8_t* dname,
    667 	size_t dname_len)
    668 {
    669 	struct auth_data* n = az_find_name(z, dname, dname_len);
    670 	if(!n) {
    671 		n = az_domain_create(z, dname, dname_len);
    672 	}
    673 	return n;
    674 }
    675 
    676 /** find rrset of given type in the domain */
    677 static struct auth_rrset*
    678 az_domain_rrset(struct auth_data* n, uint16_t t)
    679 {
    680 	struct auth_rrset* rrset;
    681 	if(!n) return NULL;
    682 	rrset = n->rrsets;
    683 	while(rrset) {
    684 		if(rrset->type == t)
    685 			return rrset;
    686 		rrset = rrset->next;
    687 	}
    688 	return NULL;
    689 }
    690 
    691 /** remove rrset of this type from domain */
    692 static void
    693 domain_remove_rrset(struct auth_data* node, uint16_t rr_type)
    694 {
    695 	struct auth_rrset* rrset, *prev;
    696 	if(!node) return;
    697 	prev = NULL;
    698 	rrset = node->rrsets;
    699 	while(rrset) {
    700 		if(rrset->type == rr_type) {
    701 			/* found it, now delete it */
    702 			if(prev) prev->next = rrset->next;
    703 			else	node->rrsets = rrset->next;
    704 			auth_rrset_delete(rrset);
    705 			return;
    706 		}
    707 		prev = rrset;
    708 		rrset = rrset->next;
    709 	}
    710 }
    711 
    712 /** find an rrsig index in the rrset.  returns true if found */
    713 static int
    714 az_rrset_find_rrsig(struct packed_rrset_data* d, uint8_t* rdata, size_t len,
    715 	size_t* index)
    716 {
    717 	size_t i;
    718 	for(i=d->count; i<d->count + d->rrsig_count; i++) {
    719 		if(d->rr_len[i] != len)
    720 			continue;
    721 		if(memcmp(d->rr_data[i], rdata, len) == 0) {
    722 			*index = i;
    723 			return 1;
    724 		}
    725 	}
    726 	return 0;
    727 }
    728 
    729 /** see if rdata is duplicate */
    730 static int
    731 rdata_duplicate(struct packed_rrset_data* d, uint8_t* rdata, size_t len)
    732 {
    733 	size_t i;
    734 	for(i=0; i<d->count + d->rrsig_count; i++) {
    735 		if(d->rr_len[i] != len)
    736 			continue;
    737 		if(memcmp(d->rr_data[i], rdata, len) == 0)
    738 			return 1;
    739 	}
    740 	return 0;
    741 }
    742 
    743 /** get rrsig type covered from rdata.
    744  * @param rdata: rdata in wireformat, starting with 16bit rdlength.
    745  * @param rdatalen: length of rdata buffer.
    746  * @return type covered (or 0).
    747  */
    748 static uint16_t
    749 rrsig_rdata_get_type_covered(uint8_t* rdata, size_t rdatalen)
    750 {
    751 	if(rdatalen < 4)
    752 		return 0;
    753 	return sldns_read_uint16(rdata+2);
    754 }
    755 
    756 /** remove RR from existing RRset. Also sig, if it is a signature.
    757  * reallocates the packed rrset for a new one, false on alloc failure */
    758 static int
    759 rrset_remove_rr(struct auth_rrset* rrset, size_t index)
    760 {
    761 	struct packed_rrset_data* d, *old = rrset->data;
    762 	size_t i;
    763 	if(index >= old->count + old->rrsig_count)
    764 		return 0; /* index out of bounds */
    765 	d = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(old) - (
    766 		sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t) +
    767 		old->rr_len[index]));
    768 	if(!d) {
    769 		log_err("malloc failure");
    770 		return 0;
    771 	}
    772 	d->ttl = old->ttl;
    773 	d->count = old->count;
    774 	d->rrsig_count = old->rrsig_count;
    775 	if(index < d->count) d->count--;
    776 	else d->rrsig_count--;
    777 	d->trust = old->trust;
    778 	d->security = old->security;
    779 
    780 	/* set rr_len, needed for ptr_fixup */
    781 	d->rr_len = (size_t*)((uint8_t*)d +
    782 		sizeof(struct packed_rrset_data));
    783 	if(index > 0)
    784 		memmove(d->rr_len, old->rr_len, (index)*sizeof(size_t));
    785 	if(index+1 < old->count+old->rrsig_count)
    786 		memmove(&d->rr_len[index], &old->rr_len[index+1],
    787 		(old->count+old->rrsig_count - (index+1))*sizeof(size_t));
    788 	packed_rrset_ptr_fixup(d);
    789 
    790 	/* move over ttls */
    791 	if(index > 0)
    792 		memmove(d->rr_ttl, old->rr_ttl, (index)*sizeof(time_t));
    793 	if(index+1 < old->count+old->rrsig_count)
    794 		memmove(&d->rr_ttl[index], &old->rr_ttl[index+1],
    795 		(old->count+old->rrsig_count - (index+1))*sizeof(time_t));
    796 
    797 	/* move over rr_data */
    798 	for(i=0; i<d->count+d->rrsig_count; i++) {
    799 		size_t oldi;
    800 		if(i < index) oldi = i;
    801 		else oldi = i+1;
    802 		memmove(d->rr_data[i], old->rr_data[oldi], d->rr_len[i]);
    803 	}
    804 
    805 	/* recalc ttl (lowest of remaining RR ttls) */
    806 	if(d->count + d->rrsig_count > 0)
    807 		d->ttl = d->rr_ttl[0];
    808 	for(i=0; i<d->count+d->rrsig_count; i++) {
    809 		if(d->rr_ttl[i] < d->ttl)
    810 			d->ttl = d->rr_ttl[i];
    811 	}
    812 
    813 	free(rrset->data);
    814 	rrset->data = d;
    815 	return 1;
    816 }
    817 
    818 /** add RR to existing RRset. If insert_sig is true, add to rrsigs.
    819  * This reallocates the packed rrset for a new one */
    820 static int
    821 rrset_add_rr(struct auth_rrset* rrset, uint32_t rr_ttl, uint8_t* rdata,
    822 	size_t rdatalen, int insert_sig)
    823 {
    824 	struct packed_rrset_data* d, *old = rrset->data;
    825 	size_t total, old_total;
    826 
    827 	d = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(old)
    828 		+ sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t)
    829 		+ rdatalen);
    830 	if(!d) {
    831 		log_err("out of memory");
    832 		return 0;
    833 	}
    834 	/* copy base values */
    835 	memcpy(d, old, sizeof(struct packed_rrset_data));
    836 	if(!insert_sig) {
    837 		d->count++;
    838 	} else {
    839 		d->rrsig_count++;
    840 	}
    841 	old_total = old->count + old->rrsig_count;
    842 	total = d->count + d->rrsig_count;
    843 	/* set rr_len, needed for ptr_fixup */
    844 	d->rr_len = (size_t*)((uint8_t*)d +
    845 		sizeof(struct packed_rrset_data));
    846 	if(old->count != 0)
    847 		memmove(d->rr_len, old->rr_len, old->count*sizeof(size_t));
    848 	if(old->rrsig_count != 0)
    849 		memmove(d->rr_len+d->count, old->rr_len+old->count,
    850 			old->rrsig_count*sizeof(size_t));
    851 	if(!insert_sig)
    852 		d->rr_len[d->count-1] = rdatalen;
    853 	else	d->rr_len[total-1] = rdatalen;
    854 	packed_rrset_ptr_fixup(d);
    855 	if((time_t)rr_ttl < d->ttl)
    856 		d->ttl = rr_ttl;
    857 
    858 	/* copy old values into new array */
    859 	if(old->count != 0) {
    860 		memmove(d->rr_ttl, old->rr_ttl, old->count*sizeof(time_t));
    861 		/* all the old rr pieces are allocated sequential, so we
    862 		 * can copy them in one go */
    863 		memmove(d->rr_data[0], old->rr_data[0],
    864 			(old->rr_data[old->count-1] - old->rr_data[0]) +
    865 			old->rr_len[old->count-1]);
    866 	}
    867 	if(old->rrsig_count != 0) {
    868 		memmove(d->rr_ttl+d->count, old->rr_ttl+old->count,
    869 			old->rrsig_count*sizeof(time_t));
    870 		memmove(d->rr_data[d->count], old->rr_data[old->count],
    871 			(old->rr_data[old_total-1] - old->rr_data[old->count]) +
    872 			old->rr_len[old_total-1]);
    873 	}
    874 
    875 	/* insert new value */
    876 	if(!insert_sig) {
    877 		d->rr_ttl[d->count-1] = rr_ttl;
    878 		memmove(d->rr_data[d->count-1], rdata, rdatalen);
    879 	} else {
    880 		d->rr_ttl[total-1] = rr_ttl;
    881 		memmove(d->rr_data[total-1], rdata, rdatalen);
    882 	}
    883 
    884 	rrset->data = d;
    885 	free(old);
    886 	return 1;
    887 }
    888 
    889 /** Create new rrset for node with packed rrset with one RR element */
    890 static struct auth_rrset*
    891 rrset_create(struct auth_data* node, uint16_t rr_type, uint32_t rr_ttl,
    892 	uint8_t* rdata, size_t rdatalen)
    893 {
    894 	struct auth_rrset* rrset = (struct auth_rrset*)calloc(1,
    895 		sizeof(*rrset));
    896 	struct auth_rrset* p, *prev;
    897 	struct packed_rrset_data* d;
    898 	if(!rrset) {
    899 		log_err("out of memory");
    900 		return NULL;
    901 	}
    902 	rrset->type = rr_type;
    903 
    904 	/* the rrset data structure, with one RR */
    905 	d = (struct packed_rrset_data*)calloc(1,
    906 		sizeof(struct packed_rrset_data) + sizeof(size_t) +
    907 		sizeof(uint8_t*) + sizeof(time_t) + rdatalen);
    908 	if(!d) {
    909 		free(rrset);
    910 		log_err("out of memory");
    911 		return NULL;
    912 	}
    913 	rrset->data = d;
    914 	d->ttl = rr_ttl;
    915 	d->trust = rrset_trust_prim_noglue;
    916 	d->rr_len = (size_t*)((uint8_t*)d + sizeof(struct packed_rrset_data));
    917 	d->rr_data = (uint8_t**)&(d->rr_len[1]);
    918 	d->rr_ttl = (time_t*)&(d->rr_data[1]);
    919 	d->rr_data[0] = (uint8_t*)&(d->rr_ttl[1]);
    920 
    921 	/* insert the RR */
    922 	d->rr_len[0] = rdatalen;
    923 	d->rr_ttl[0] = rr_ttl;
    924 	memmove(d->rr_data[0], rdata, rdatalen);
    925 	d->count++;
    926 
    927 	/* insert rrset into linked list for domain */
    928 	/* find sorted place to link the rrset into the list */
    929 	prev = NULL;
    930 	p = node->rrsets;
    931 	while(p && p->type<=rr_type) {
    932 		prev = p;
    933 		p = p->next;
    934 	}
    935 	/* so, prev is smaller, and p is larger than rr_type */
    936 	rrset->next = p;
    937 	if(prev) prev->next = rrset;
    938 	else node->rrsets = rrset;
    939 	return rrset;
    940 }
    941 
    942 /** count number (and size) of rrsigs that cover a type */
    943 static size_t
    944 rrsig_num_that_cover(struct auth_rrset* rrsig, uint16_t rr_type, size_t* sigsz)
    945 {
    946 	struct packed_rrset_data* d = rrsig->data;
    947 	size_t i, num = 0;
    948 	*sigsz = 0;
    949 	log_assert(d && rrsig->type == LDNS_RR_TYPE_RRSIG);
    950 	for(i=0; i<d->count+d->rrsig_count; i++) {
    951 		if(rrsig_rdata_get_type_covered(d->rr_data[i],
    952 			d->rr_len[i]) == rr_type) {
    953 			num++;
    954 			(*sigsz) += d->rr_len[i];
    955 		}
    956 	}
    957 	return num;
    958 }
    959 
    960 /** See if rrsig set has covered sigs for rrset and move them over */
    961 static int
    962 rrset_moveover_rrsigs(struct auth_data* node, uint16_t rr_type,
    963 	struct auth_rrset* rrset, struct auth_rrset* rrsig)
    964 {
    965 	size_t sigs, sigsz, i, j, total;
    966 	struct packed_rrset_data* sigold = rrsig->data;
    967 	struct packed_rrset_data* old = rrset->data;
    968 	struct packed_rrset_data* d, *sigd;
    969 
    970 	log_assert(rrset->type == rr_type);
    971 	log_assert(rrsig->type == LDNS_RR_TYPE_RRSIG);
    972 	sigs = rrsig_num_that_cover(rrsig, rr_type, &sigsz);
    973 	if(sigs == 0) {
    974 		/* 0 rrsigs to move over, done */
    975 		return 1;
    976 	}
    977 
    978 	/* allocate rrset sigsz larger for extra sigs elements, and
    979 	 * allocate rrsig sigsz smaller for less sigs elements. */
    980 	d = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(old)
    981 		+ sigs*(sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t))
    982 		+ sigsz);
    983 	if(!d) {
    984 		log_err("out of memory");
    985 		return 0;
    986 	}
    987 	/* copy base values */
    988 	total = old->count + old->rrsig_count;
    989 	memcpy(d, old, sizeof(struct packed_rrset_data));
    990 	d->rrsig_count += sigs;
    991 	/* setup rr_len */
    992 	d->rr_len = (size_t*)((uint8_t*)d +
    993 		sizeof(struct packed_rrset_data));
    994 	if(total != 0)
    995 		memmove(d->rr_len, old->rr_len, total*sizeof(size_t));
    996 	j = d->count+d->rrsig_count-sigs;
    997 	for(i=0; i<sigold->count+sigold->rrsig_count; i++) {
    998 		if(rrsig_rdata_get_type_covered(sigold->rr_data[i],
    999 			sigold->rr_len[i]) == rr_type) {
   1000 			d->rr_len[j] = sigold->rr_len[i];
   1001 			j++;
   1002 		}
   1003 	}
   1004 	packed_rrset_ptr_fixup(d);
   1005 
   1006 	/* copy old values into new array */
   1007 	if(total != 0) {
   1008 		memmove(d->rr_ttl, old->rr_ttl, total*sizeof(time_t));
   1009 		/* all the old rr pieces are allocated sequential, so we
   1010 		 * can copy them in one go */
   1011 		memmove(d->rr_data[0], old->rr_data[0],
   1012 			(old->rr_data[total-1] - old->rr_data[0]) +
   1013 			old->rr_len[total-1]);
   1014 	}
   1015 
   1016 	/* move over the rrsigs to the larger rrset*/
   1017 	j = d->count+d->rrsig_count-sigs;
   1018 	for(i=0; i<sigold->count+sigold->rrsig_count; i++) {
   1019 		if(rrsig_rdata_get_type_covered(sigold->rr_data[i],
   1020 			sigold->rr_len[i]) == rr_type) {
   1021 			/* move this one over to location j */
   1022 			d->rr_ttl[j] = sigold->rr_ttl[i];
   1023 			memmove(d->rr_data[j], sigold->rr_data[i],
   1024 				sigold->rr_len[i]);
   1025 			if(d->rr_ttl[j] < d->ttl)
   1026 				d->ttl = d->rr_ttl[j];
   1027 			j++;
   1028 		}
   1029 	}
   1030 
   1031 	/* put it in and deallocate the old rrset */
   1032 	rrset->data = d;
   1033 	free(old);
   1034 
   1035 	/* now make rrsig set smaller */
   1036 	if(sigold->count+sigold->rrsig_count == sigs) {
   1037 		/* remove all sigs from rrsig, remove it entirely */
   1038 		domain_remove_rrset(node, LDNS_RR_TYPE_RRSIG);
   1039 		return 1;
   1040 	}
   1041 	log_assert(packed_rrset_sizeof(sigold) > sigs*(sizeof(size_t) +
   1042 		sizeof(uint8_t*) + sizeof(time_t)) + sigsz);
   1043 	sigd = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(sigold)
   1044 		- sigs*(sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t))
   1045 		- sigsz);
   1046 	if(!sigd) {
   1047 		/* no need to free up d, it has already been placed in the
   1048 		 * node->rrset structure */
   1049 		log_err("out of memory");
   1050 		return 0;
   1051 	}
   1052 	/* copy base values */
   1053 	memcpy(sigd, sigold, sizeof(struct packed_rrset_data));
   1054 	/* in sigd the RRSIGs are stored in the base of the RR, in count */
   1055 	sigd->count -= sigs;
   1056 	/* setup rr_len */
   1057 	sigd->rr_len = (size_t*)((uint8_t*)sigd +
   1058 		sizeof(struct packed_rrset_data));
   1059 	j = 0;
   1060 	for(i=0; i<sigold->count+sigold->rrsig_count; i++) {
   1061 		if(rrsig_rdata_get_type_covered(sigold->rr_data[i],
   1062 			sigold->rr_len[i]) != rr_type) {
   1063 			sigd->rr_len[j] = sigold->rr_len[i];
   1064 			j++;
   1065 		}
   1066 	}
   1067 	packed_rrset_ptr_fixup(sigd);
   1068 
   1069 	/* copy old values into new rrsig array */
   1070 	j = 0;
   1071 	for(i=0; i<sigold->count+sigold->rrsig_count; i++) {
   1072 		if(rrsig_rdata_get_type_covered(sigold->rr_data[i],
   1073 			sigold->rr_len[i]) != rr_type) {
   1074 			/* move this one over to location j */
   1075 			sigd->rr_ttl[j] = sigold->rr_ttl[i];
   1076 			memmove(sigd->rr_data[j], sigold->rr_data[i],
   1077 				sigold->rr_len[i]);
   1078 			if(j==0) sigd->ttl = sigd->rr_ttl[j];
   1079 			else {
   1080 				if(sigd->rr_ttl[j] < sigd->ttl)
   1081 					sigd->ttl = sigd->rr_ttl[j];
   1082 			}
   1083 			j++;
   1084 		}
   1085 	}
   1086 
   1087 	/* put it in and deallocate the old rrset */
   1088 	rrsig->data = sigd;
   1089 	free(sigold);
   1090 
   1091 	return 1;
   1092 }
   1093 
   1094 /** copy the rrsigs from the rrset to the rrsig rrset, because the rrset
   1095  * is going to be deleted.  reallocates the RRSIG rrset data. */
   1096 static int
   1097 rrsigs_copy_from_rrset_to_rrsigset(struct auth_rrset* rrset,
   1098 	struct auth_rrset* rrsigset)
   1099 {
   1100 	size_t i;
   1101 	if(rrset->data->rrsig_count == 0)
   1102 		return 1;
   1103 
   1104 	/* move them over one by one, because there might be duplicates,
   1105 	 * duplicates are ignored */
   1106 	for(i=rrset->data->count;
   1107 		i<rrset->data->count+rrset->data->rrsig_count; i++) {
   1108 		uint8_t* rdata = rrset->data->rr_data[i];
   1109 		size_t rdatalen = rrset->data->rr_len[i];
   1110 		time_t rr_ttl  = rrset->data->rr_ttl[i];
   1111 
   1112 		if(rdata_duplicate(rrsigset->data, rdata, rdatalen)) {
   1113 			continue;
   1114 		}
   1115 		if(!rrset_add_rr(rrsigset, rr_ttl, rdata, rdatalen, 0))
   1116 			return 0;
   1117 	}
   1118 	return 1;
   1119 }
   1120 
   1121 /** Add rr to node, ignores duplicate RRs,
   1122  * rdata points to buffer with rdatalen octets, starts with 2bytelength. */
   1123 static int
   1124 az_domain_add_rr(struct auth_data* node, uint16_t rr_type, uint32_t rr_ttl,
   1125 	uint8_t* rdata, size_t rdatalen, int* duplicate)
   1126 {
   1127 	struct auth_rrset* rrset;
   1128 	/* packed rrsets have their rrsigs along with them, sort them out */
   1129 	if(rr_type == LDNS_RR_TYPE_RRSIG) {
   1130 		uint16_t ctype = rrsig_rdata_get_type_covered(rdata, rdatalen);
   1131 		if((rrset=az_domain_rrset(node, ctype))!= NULL) {
   1132 			/* a node of the correct type exists, add the RRSIG
   1133 			 * to the rrset of the covered data type */
   1134 			if(rdata_duplicate(rrset->data, rdata, rdatalen)) {
   1135 				if(duplicate) *duplicate = 1;
   1136 				return 1;
   1137 			}
   1138 			if(!rrset_add_rr(rrset, rr_ttl, rdata, rdatalen, 1))
   1139 				return 0;
   1140 		} else if((rrset=az_domain_rrset(node, rr_type))!= NULL) {
   1141 			/* add RRSIG to rrset of type RRSIG */
   1142 			if(rdata_duplicate(rrset->data, rdata, rdatalen)) {
   1143 				if(duplicate) *duplicate = 1;
   1144 				return 1;
   1145 			}
   1146 			if(!rrset_add_rr(rrset, rr_ttl, rdata, rdatalen, 0))
   1147 				return 0;
   1148 		} else {
   1149 			/* create rrset of type RRSIG */
   1150 			if(!rrset_create(node, rr_type, rr_ttl, rdata,
   1151 				rdatalen))
   1152 				return 0;
   1153 		}
   1154 	} else {
   1155 		/* normal RR type */
   1156 		if((rrset=az_domain_rrset(node, rr_type))!= NULL) {
   1157 			/* add data to existing node with data type */
   1158 			if(rdata_duplicate(rrset->data, rdata, rdatalen)) {
   1159 				if(duplicate) *duplicate = 1;
   1160 				return 1;
   1161 			}
   1162 			if(!rrset_add_rr(rrset, rr_ttl, rdata, rdatalen, 0))
   1163 				return 0;
   1164 		} else {
   1165 			struct auth_rrset* rrsig;
   1166 			/* create new node with data type */
   1167 			if(!(rrset=rrset_create(node, rr_type, rr_ttl, rdata,
   1168 				rdatalen)))
   1169 				return 0;
   1170 
   1171 			/* see if node of type RRSIG has signatures that
   1172 			 * cover the data type, and move them over */
   1173 			/* and then make the RRSIG type smaller */
   1174 			if((rrsig=az_domain_rrset(node, LDNS_RR_TYPE_RRSIG))
   1175 				!= NULL) {
   1176 				if(!rrset_moveover_rrsigs(node, rr_type,
   1177 					rrset, rrsig))
   1178 					return 0;
   1179 			}
   1180 		}
   1181 	}
   1182 	return 1;
   1183 }
   1184 
   1185 /** insert RR into zone, ignore duplicates */
   1186 static int
   1187 az_insert_rr(struct auth_zone* z, uint8_t* rr, size_t rr_len,
   1188 	size_t dname_len, int* duplicate)
   1189 {
   1190 	struct auth_data* node;
   1191 	uint8_t* dname = rr;
   1192 	uint16_t rr_type = sldns_wirerr_get_type(rr, rr_len, dname_len);
   1193 	uint16_t rr_class = sldns_wirerr_get_class(rr, rr_len, dname_len);
   1194 	uint32_t rr_ttl = sldns_wirerr_get_ttl(rr, rr_len, dname_len);
   1195 	size_t rdatalen = ((size_t)sldns_wirerr_get_rdatalen(rr, rr_len,
   1196 		dname_len))+2;
   1197 	/* rdata points to rdata prefixed with uint16 rdatalength */
   1198 	uint8_t* rdata = sldns_wirerr_get_rdatawl(rr, rr_len, dname_len);
   1199 
   1200 	if(rr_class != z->dclass) {
   1201 		log_err("wrong class for RR");
   1202 		return 0;
   1203 	}
   1204 	if(rr_type == LDNS_RR_TYPE_A && rdatalen != 6 /* 2 + 4 */) {
   1205 		log_err("malformed A record");
   1206 		return 0;
   1207 	} else if(rr_type == LDNS_RR_TYPE_AAAA && rdatalen != 18 /* 2 + 16 */) {
   1208 		log_err("malformed AAAA record");
   1209 		return 0;
   1210 	}
   1211 	if(!dname_subdomain_c(dname, z->name)) {
   1212 		char nm[LDNS_MAX_DOMAINLEN], zn[LDNS_MAX_DOMAINLEN];
   1213 		dname_str(dname, nm);
   1214 		dname_str(z->name, zn);
   1215 		verbose(VERB_ALGO, "auth-zone %s: dropping out-of-zone RR "
   1216 			"%s", zn, nm);
   1217 		if(duplicate) *duplicate=1; /* treat as bad insert */
   1218 		return 1;
   1219 	}
   1220 	if(!(node=az_domain_find_or_create(z, dname, dname_len))) {
   1221 		log_err("cannot create domain");
   1222 		return 0;
   1223 	}
   1224 	if(!az_domain_add_rr(node, rr_type, rr_ttl, rdata, rdatalen,
   1225 		duplicate)) {
   1226 		log_err("cannot add RR to domain");
   1227 		if(node->rrsets == NULL) {
   1228 			(void)rbtree_delete(&z->data, node);
   1229 			auth_data_delete(node);
   1230 		}
   1231 		return 0;
   1232 	}
   1233 	if(z->rpz) {
   1234 		if(!(rpz_insert_rr(z->rpz, z->name, z->namelen, dname,
   1235 			dname_len, rr_type, rr_class, rr_ttl, rdata, rdatalen,
   1236 			rr, rr_len)))
   1237 			return 0;
   1238 	}
   1239 	return 1;
   1240 }
   1241 
   1242 /** Remove rr from node, ignores nonexisting RRs,
   1243  * rdata points to buffer with rdatalen octets, starts with 2bytelength. */
   1244 static int
   1245 az_domain_remove_rr(struct auth_data* node, uint16_t rr_type,
   1246 	uint8_t* rdata, size_t rdatalen, int* nonexist)
   1247 {
   1248 	struct auth_rrset* rrset;
   1249 	size_t index = 0;
   1250 
   1251 	/* find the plain RR of the given type */
   1252 	if((rrset=az_domain_rrset(node, rr_type))!= NULL) {
   1253 		if(packed_rrset_find_rr(rrset->data, rdata, rdatalen, &index)) {
   1254 			if(rrset->data->count == 1 &&
   1255 				rrset->data->rrsig_count == 0) {
   1256 				/* last RR, delete the rrset */
   1257 				domain_remove_rrset(node, rr_type);
   1258 			} else if(rrset->data->count == 1 &&
   1259 				rrset->data->rrsig_count != 0) {
   1260 				/* move RRSIGs to the RRSIG rrset, or
   1261 				 * this one becomes that RRset */
   1262 				struct auth_rrset* rrsigset = az_domain_rrset(
   1263 					node, LDNS_RR_TYPE_RRSIG);
   1264 				if(rrsigset) {
   1265 					/* move left over rrsigs to the
   1266 					 * existing rrset of type RRSIG */
   1267 					rrsigs_copy_from_rrset_to_rrsigset(
   1268 						rrset, rrsigset);
   1269 					/* and then delete the rrset */
   1270 					domain_remove_rrset(node, rr_type);
   1271 				} else {
   1272 					/* no rrset of type RRSIG, this
   1273 					 * set is now of that type,
   1274 					 * just remove the rr */
   1275 					if(!rrset_remove_rr(rrset, index))
   1276 						return 0;
   1277 					rrset->type = LDNS_RR_TYPE_RRSIG;
   1278 					rrset->data->count = rrset->data->rrsig_count;
   1279 					rrset->data->rrsig_count = 0;
   1280 				}
   1281 			} else {
   1282 				/* remove the RR from the rrset */
   1283 				if(!rrset_remove_rr(rrset, index))
   1284 					return 0;
   1285 			}
   1286 			return 1;
   1287 		}
   1288 		/* rr not found in rrset */
   1289 	}
   1290 
   1291 	/* is it a type RRSIG, look under the covered type */
   1292 	if(rr_type == LDNS_RR_TYPE_RRSIG) {
   1293 		uint16_t ctype = rrsig_rdata_get_type_covered(rdata, rdatalen);
   1294 		if((rrset=az_domain_rrset(node, ctype))!= NULL) {
   1295 			if(az_rrset_find_rrsig(rrset->data, rdata, rdatalen,
   1296 				&index)) {
   1297 				/* rrsig should have d->count > 0, be
   1298 				 * over some rr of that type */
   1299 				/* remove the rrsig from the rrsigs list of the
   1300 				 * rrset */
   1301 				if(!rrset_remove_rr(rrset, index))
   1302 					return 0;
   1303 				return 1;
   1304 			}
   1305 		}
   1306 		/* also RRSIG not found */
   1307 	}
   1308 
   1309 	/* nothing found to delete */
   1310 	if(nonexist) *nonexist = 1;
   1311 	return 1;
   1312 }
   1313 
   1314 /** remove RR from zone, ignore if it does not exist, false on alloc failure*/
   1315 static int
   1316 az_remove_rr(struct auth_zone* z, uint8_t* rr, size_t rr_len,
   1317 	size_t dname_len, int* nonexist)
   1318 {
   1319 	struct auth_data* node;
   1320 	uint8_t* dname = rr;
   1321 	uint16_t rr_type = sldns_wirerr_get_type(rr, rr_len, dname_len);
   1322 	uint16_t rr_class = sldns_wirerr_get_class(rr, rr_len, dname_len);
   1323 	size_t rdatalen = ((size_t)sldns_wirerr_get_rdatalen(rr, rr_len,
   1324 		dname_len))+2;
   1325 	/* rdata points to rdata prefixed with uint16 rdatalength */
   1326 	uint8_t* rdata = sldns_wirerr_get_rdatawl(rr, rr_len, dname_len);
   1327 
   1328 	if(rr_class != z->dclass) {
   1329 		log_err("wrong class for RR");
   1330 		/* really also a nonexisting entry, because no records
   1331 		 * of that class in the zone, but return an error because
   1332 		 * getting records of the wrong class is a failure of the
   1333 		 * zone transfer */
   1334 		return 0;
   1335 	}
   1336 	node = az_find_name(z, dname, dname_len);
   1337 	if(!node) {
   1338 		/* node with that name does not exist */
   1339 		/* nonexisting entry, because no such name */
   1340 		*nonexist = 1;
   1341 		return 1;
   1342 	}
   1343 	if(!az_domain_remove_rr(node, rr_type, rdata, rdatalen, nonexist)) {
   1344 		/* alloc failure or so */
   1345 		return 0;
   1346 	}
   1347 	/* remove the node, if necessary */
   1348 	/* an rrsets==NULL entry is not kept around for empty nonterminals,
   1349 	 * and also parent nodes are not kept around, so we just delete it */
   1350 	if(node->rrsets == NULL) {
   1351 		(void)rbtree_delete(&z->data, node);
   1352 		auth_data_delete(node);
   1353 	}
   1354 	if(z->rpz) {
   1355 		rpz_remove_rr(z->rpz, z->name, z->namelen, dname, dname_len,
   1356 			rr_type, rr_class, rdata, rdatalen);
   1357 	}
   1358 	return 1;
   1359 }
   1360 
   1361 /** decompress an RR into the buffer where it'll be an uncompressed RR
   1362  * with uncompressed dname and uncompressed rdata (dnames) */
   1363 static int
   1364 decompress_rr_into_buffer(struct sldns_buffer* buf, uint8_t* pkt,
   1365 	size_t pktlen, uint8_t* dname, uint16_t rr_type, uint16_t rr_class,
   1366 	uint32_t rr_ttl, uint8_t* rr_data, uint16_t rr_rdlen)
   1367 {
   1368 	sldns_buffer pktbuf;
   1369 	size_t dname_len = 0;
   1370 	size_t rdlenpos;
   1371 	size_t rdlen;
   1372 	uint8_t* rd;
   1373 	const sldns_rr_descriptor* desc;
   1374 	sldns_buffer_init_frm_data(&pktbuf, pkt, pktlen);
   1375 	sldns_buffer_clear(buf);
   1376 
   1377 	/* decompress dname */
   1378 	sldns_buffer_set_position(&pktbuf,
   1379 		(size_t)(dname - sldns_buffer_current(&pktbuf)));
   1380 	dname_len = pkt_dname_len(&pktbuf);
   1381 	if(dname_len == 0) return 0; /* parse fail on dname */
   1382 	if(!sldns_buffer_available(buf, dname_len)) return 0;
   1383 	dname_pkt_copy(&pktbuf, sldns_buffer_current(buf), dname);
   1384 	sldns_buffer_skip(buf, (ssize_t)dname_len);
   1385 
   1386 	/* type, class, ttl and rdatalength fields */
   1387 	if(!sldns_buffer_available(buf, 10)) return 0;
   1388 	sldns_buffer_write_u16(buf, rr_type);
   1389 	sldns_buffer_write_u16(buf, rr_class);
   1390 	sldns_buffer_write_u32(buf, rr_ttl);
   1391 	rdlenpos = sldns_buffer_position(buf);
   1392 	sldns_buffer_write_u16(buf, 0); /* rd length position */
   1393 
   1394 	/* decompress rdata */
   1395 	desc = sldns_rr_descript(rr_type);
   1396 	rd = rr_data;
   1397 	rdlen = rr_rdlen;
   1398 	if(rdlen > 0 && desc && desc->_dname_count > 0) {
   1399 		int count = (int)desc->_dname_count;
   1400 		int rdf = 0;
   1401 		size_t len; /* how much rdata to plain copy */
   1402 		size_t uncompressed_len, compressed_len;
   1403 		size_t oldpos;
   1404 		/* decompress dnames. */
   1405 		while(rdlen > 0 && count) {
   1406 			switch(desc->_wireformat[rdf]) {
   1407 			case LDNS_RDF_TYPE_DNAME:
   1408 				sldns_buffer_set_position(&pktbuf,
   1409 					(size_t)(rd -
   1410 					sldns_buffer_begin(&pktbuf)));
   1411 				oldpos = sldns_buffer_position(&pktbuf);
   1412 				/* moves pktbuf to right after the
   1413 				 * compressed dname, and returns uncompressed
   1414 				 * dname length */
   1415 				uncompressed_len = pkt_dname_len(&pktbuf);
   1416 				if(!uncompressed_len)
   1417 					return 0; /* parse error in dname */
   1418 				compressed_len = sldns_buffer_position(
   1419 					&pktbuf) - oldpos;
   1420 				if(compressed_len > rdlen)
   1421 					return 0; /* dname exceeds rdata */
   1422 				if(!sldns_buffer_available(buf,
   1423 					uncompressed_len))
   1424 					/* dname too long for buffer */
   1425 					return 0;
   1426 				dname_pkt_copy(&pktbuf,
   1427 					sldns_buffer_current(buf), rd);
   1428 				sldns_buffer_skip(buf, (ssize_t)uncompressed_len);
   1429 				rd += compressed_len;
   1430 				rdlen -= compressed_len;
   1431 				count--;
   1432 				len = 0;
   1433 				break;
   1434 			case LDNS_RDF_TYPE_STR:
   1435 				/* Check rdlen for resilience, because it is
   1436 				 * checked above, that rdlen > 0 */
   1437 				if(rdlen < 1) return 0; /* malformed */
   1438 				len = rd[0] + 1;
   1439 				break;
   1440 			default:
   1441 				len = get_rdf_size(desc->_wireformat[rdf]);
   1442 				break;
   1443 			}
   1444 			if(len) {
   1445 				if(len > rdlen)
   1446 					return 0; /* malformed */
   1447 				if(!sldns_buffer_available(buf, len))
   1448 					return 0; /* too long for buffer */
   1449 				sldns_buffer_write(buf, rd, len);
   1450 				rd += len;
   1451 				rdlen -= len;
   1452 			}
   1453 			rdf++;
   1454 		}
   1455 	}
   1456 	/* copy remaining data */
   1457 	if(rdlen > 0) {
   1458 		if(!sldns_buffer_available(buf, rdlen)) return 0;
   1459 		sldns_buffer_write(buf, rd, rdlen);
   1460 	}
   1461 	/* fixup rdlength */
   1462 	sldns_buffer_write_u16_at(buf, rdlenpos,
   1463 		sldns_buffer_position(buf)-rdlenpos-2);
   1464 	sldns_buffer_flip(buf);
   1465 	return 1;
   1466 }
   1467 
   1468 /** insert RR into zone, from packet, decompress RR,
   1469  * if duplicate is nonNULL set the flag but otherwise ignore duplicates */
   1470 static int
   1471 az_insert_rr_decompress(struct auth_zone* z, uint8_t* pkt, size_t pktlen,
   1472 	struct sldns_buffer* scratch_buffer, uint8_t* dname, uint16_t rr_type,
   1473 	uint16_t rr_class, uint32_t rr_ttl, uint8_t* rr_data,
   1474 	uint16_t rr_rdlen, int* duplicate)
   1475 {
   1476 	uint8_t* rr;
   1477 	size_t rr_len;
   1478 	size_t dname_len;
   1479 	if(!decompress_rr_into_buffer(scratch_buffer, pkt, pktlen, dname,
   1480 		rr_type, rr_class, rr_ttl, rr_data, rr_rdlen)) {
   1481 		log_err("could not decompress RR");
   1482 		return 0;
   1483 	}
   1484 	rr = sldns_buffer_begin(scratch_buffer);
   1485 	rr_len = sldns_buffer_limit(scratch_buffer);
   1486 	dname_len = dname_valid(rr, rr_len);
   1487 	return az_insert_rr(z, rr, rr_len, dname_len, duplicate);
   1488 }
   1489 
   1490 /** remove RR from zone, from packet, decompress RR,
   1491  * if nonexist is nonNULL set the flag but otherwise ignore nonexisting entries*/
   1492 static int
   1493 az_remove_rr_decompress(struct auth_zone* z, uint8_t* pkt, size_t pktlen,
   1494 	struct sldns_buffer* scratch_buffer, uint8_t* dname, uint16_t rr_type,
   1495 	uint16_t rr_class, uint32_t rr_ttl, uint8_t* rr_data,
   1496 	uint16_t rr_rdlen, int* nonexist)
   1497 {
   1498 	uint8_t* rr;
   1499 	size_t rr_len;
   1500 	size_t dname_len;
   1501 	if(!decompress_rr_into_buffer(scratch_buffer, pkt, pktlen, dname,
   1502 		rr_type, rr_class, rr_ttl, rr_data, rr_rdlen)) {
   1503 		log_err("could not decompress RR");
   1504 		return 0;
   1505 	}
   1506 	rr = sldns_buffer_begin(scratch_buffer);
   1507 	rr_len = sldns_buffer_limit(scratch_buffer);
   1508 	dname_len = dname_valid(rr, rr_len);
   1509 	return az_remove_rr(z, rr, rr_len, dname_len, nonexist);
   1510 }
   1511 
   1512 /**
   1513  * Parse zonefile
   1514  * @param z: zone to read in.
   1515  * @param in: file to read from (just opened).
   1516  * @param rr: buffer to use for RRs, 64k.
   1517  *	passed so that recursive includes can use the same buffer and do
   1518  *	not grow the stack too much.
   1519  * @param rrbuflen: sizeof rr buffer.
   1520  * @param state: parse state with $ORIGIN, $TTL and 'prev-dname' and so on,
   1521  *	that is kept between includes.
   1522  *	The lineno is set at 1 and then increased by the function.
   1523  * @param fname: file name.
   1524  * @param depth: recursion depth for includes
   1525  * @param cfg: config for chroot.
   1526  * returns false on failure, has printed an error message
   1527  */
   1528 static int
   1529 az_parse_file(struct auth_zone* z, FILE* in, uint8_t* rr, size_t rrbuflen,
   1530 	struct sldns_file_parse_state* state, char* fname, int depth,
   1531 	struct config_file* cfg)
   1532 {
   1533 	size_t rr_len, dname_len;
   1534 	int status;
   1535 	state->lineno = 1;
   1536 
   1537 	while(!feof(in)) {
   1538 		rr_len = rrbuflen;
   1539 		dname_len = 0;
   1540 		status = sldns_fp2wire_rr_buf(in, rr, &rr_len, &dname_len,
   1541 			state);
   1542 		if(status == LDNS_WIREPARSE_ERR_INCLUDE && rr_len == 0) {
   1543 			/* we have $INCLUDE or $something */
   1544 			if(strncmp((char*)rr, "$INCLUDE ", 9) == 0 ||
   1545 			   strncmp((char*)rr, "$INCLUDE\t", 9) == 0) {
   1546 				FILE* inc;
   1547 				int lineno_orig = state->lineno;
   1548 				char* incfile = (char*)rr + 8;
   1549 				if(depth > MAX_INCLUDE_DEPTH) {
   1550 					log_err("%s:%d max include depth"
   1551 					  "exceeded", fname, state->lineno);
   1552 					return 0;
   1553 				}
   1554 				/* A $INCLUDE is not expected for a secondary zone. */
   1555 				if(z->zone_is_slave) {
   1556 					log_err("%s:%d $INCLUDE not allowed for secondary zone", fname, state->lineno);
   1557 					return 0;
   1558 				}
   1559 				/* skip spaces */
   1560 				while(*incfile == ' ' || *incfile == '\t')
   1561 					incfile++;
   1562 				/* adjust for chroot on include file */
   1563 				if(cfg->chrootdir && cfg->chrootdir[0] &&
   1564 					strncmp(incfile, cfg->chrootdir,
   1565 						strlen(cfg->chrootdir)) == 0)
   1566 					incfile += strlen(cfg->chrootdir);
   1567 				incfile = strdup(incfile);
   1568 				if(!incfile) {
   1569 					log_err("malloc failure");
   1570 					return 0;
   1571 				}
   1572 				verbose(VERB_ALGO, "opening $INCLUDE %s",
   1573 					incfile);
   1574 				inc = fopen(incfile, "r");
   1575 				if(!inc) {
   1576 					log_err("%s:%d cannot open include "
   1577 						"file %s: %s", fname,
   1578 						lineno_orig, incfile,
   1579 						strerror(errno));
   1580 					free(incfile);
   1581 					return 0;
   1582 				}
   1583 				/* recurse read that file now */
   1584 				if(!az_parse_file(z, inc, rr, rrbuflen,
   1585 					state, incfile, depth+1, cfg)) {
   1586 					log_err("%s:%d cannot parse include "
   1587 						"file %s", fname,
   1588 						lineno_orig, incfile);
   1589 					fclose(inc);
   1590 					free(incfile);
   1591 					return 0;
   1592 				}
   1593 				fclose(inc);
   1594 				verbose(VERB_ALGO, "done with $INCLUDE %s",
   1595 					incfile);
   1596 				free(incfile);
   1597 				state->lineno = lineno_orig;
   1598 			}
   1599 			continue;
   1600 		}
   1601 		if(status != 0) {
   1602 			log_err("parse error %s %d:%d: %s", fname,
   1603 				state->lineno, LDNS_WIREPARSE_OFFSET(status),
   1604 				sldns_get_errorstr_parse(status));
   1605 			return 0;
   1606 		}
   1607 		if(rr_len == 0) {
   1608 			/* EMPTY line, TTL or ORIGIN */
   1609 			continue;
   1610 		}
   1611 		/* insert wirerr in rrbuf */
   1612 		if(!az_insert_rr(z, rr, rr_len, dname_len, NULL)) {
   1613 			char buf[17];
   1614 			sldns_wire2str_type_buf(sldns_wirerr_get_type(rr,
   1615 				rr_len, dname_len), buf, sizeof(buf));
   1616 			log_err("%s:%d cannot insert RR of type %s",
   1617 				fname, state->lineno, buf);
   1618 			return 0;
   1619 		}
   1620 	}
   1621 	return 1;
   1622 }
   1623 
   1624 void auth_zone_clear_data(struct auth_zone* z)
   1625 {
   1626 	/* clear the data tree */
   1627 	traverse_postorder(&z->data, auth_data_del, NULL);
   1628 	rbtree_init(&z->data, &auth_data_cmp);
   1629 	/* clear the RPZ policies */
   1630 	if(z->rpz)
   1631 		rpz_clear(z->rpz);
   1632 }
   1633 
   1634 int
   1635 auth_zone_read_zonefile(struct auth_zone* z, struct config_file* cfg)
   1636 {
   1637 	uint8_t rr[LDNS_RR_BUF_SIZE];
   1638 	struct sldns_file_parse_state state;
   1639 	char* zfilename;
   1640 	FILE* in;
   1641 	if(!z || !z->zonefile || z->zonefile[0]==0)
   1642 		return 1; /* no file, or "", nothing to read */
   1643 
   1644 	zfilename = z->zonefile;
   1645 	if(cfg->chrootdir && cfg->chrootdir[0] && strncmp(zfilename,
   1646 		cfg->chrootdir, strlen(cfg->chrootdir)) == 0)
   1647 		zfilename += strlen(cfg->chrootdir);
   1648 	if(verbosity >= VERB_ALGO) {
   1649 		char nm[LDNS_MAX_DOMAINLEN];
   1650 		dname_str(z->name, nm);
   1651 		verbose(VERB_ALGO, "read zonefile %s for %s", zfilename, nm);
   1652 	}
   1653 	in = fopen(zfilename, "r");
   1654 	if(!in) {
   1655 		char* n = sldns_wire2str_dname(z->name, z->namelen);
   1656 		if(errno == ENOENT) {
   1657 			/* For a secondary, fetch the zone contents later, no
   1658 			 * file yet. For a primary, no way to fetch the zone,
   1659 			 * so warn. */
   1660 			if(z->zone_is_slave)
   1661 				verbose(VERB_ALGO, "no zonefile %s for %s",
   1662 					zfilename, n?n:"error");
   1663 			else
   1664 				log_warn("no zonefile %s for %s",
   1665 					zfilename, n?n:"error");
   1666 			free(n);
   1667 			return 1;
   1668 		}
   1669 		log_err("cannot open zonefile %s for %s: %s",
   1670 			zfilename, n?n:"error", strerror(errno));
   1671 		free(n);
   1672 		return 0;
   1673 	}
   1674 
   1675 	/* clear the data tree */
   1676 	traverse_postorder(&z->data, auth_data_del, NULL);
   1677 	rbtree_init(&z->data, &auth_data_cmp);
   1678 	/* clear the RPZ policies */
   1679 	if(z->rpz)
   1680 		rpz_clear(z->rpz);
   1681 
   1682 	memset(&state, 0, sizeof(state));
   1683 	/* default TTL to 3600 */
   1684 	state.default_ttl = 3600;
   1685 	/* set $ORIGIN to the zone name */
   1686 	if(z->namelen <= sizeof(state.origin)) {
   1687 		memcpy(state.origin, z->name, z->namelen);
   1688 		state.origin_len = z->namelen;
   1689 	}
   1690 	/* parse the (toplevel) file */
   1691 	if(!az_parse_file(z, in, rr, sizeof(rr), &state, zfilename, 0, cfg)) {
   1692 		char* n = sldns_wire2str_dname(z->name, z->namelen);
   1693 		log_err("error parsing zonefile %s for %s",
   1694 			zfilename, n?n:"error");
   1695 		free(n);
   1696 		fclose(in);
   1697 		return 0;
   1698 	}
   1699 	fclose(in);
   1700 
   1701 	if(z->rpz)
   1702 		rpz_finish_config(z->rpz);
   1703 	return 1;
   1704 }
   1705 
   1706 /** write buffer to file and check return codes */
   1707 static int
   1708 write_out(FILE* out, const char* str, size_t len)
   1709 {
   1710 	size_t r;
   1711 	if(len == 0)
   1712 		return 1;
   1713 	r = fwrite(str, 1, len, out);
   1714 	if(r == 0) {
   1715 		log_err("write failed: %s", strerror(errno));
   1716 		return 0;
   1717 	} else if(r < len) {
   1718 		log_err("write failed: too short (disk full?)");
   1719 		return 0;
   1720 	}
   1721 	return 1;
   1722 }
   1723 
   1724 /** convert auth rr to string */
   1725 static int
   1726 auth_rr_to_string(uint8_t* nm, size_t nmlen, uint16_t tp, uint16_t cl,
   1727 	struct packed_rrset_data* data, size_t i, char* s, size_t buflen)
   1728 {
   1729 	int w = 0;
   1730 	size_t slen = buflen, datlen;
   1731 	uint8_t* dat;
   1732 	if(i >= data->count) tp = LDNS_RR_TYPE_RRSIG;
   1733 	dat = nm;
   1734 	datlen = nmlen;
   1735 	w += sldns_wire2str_dname_scan(&dat, &datlen, &s, &slen, NULL, 0, NULL);
   1736 	w += sldns_str_print(&s, &slen, "\t");
   1737 	w += sldns_str_print(&s, &slen, "%lu\t", (unsigned long)data->rr_ttl[i]);
   1738 	w += sldns_wire2str_class_print(&s, &slen, cl);
   1739 	w += sldns_str_print(&s, &slen, "\t");
   1740 	w += sldns_wire2str_type_print(&s, &slen, tp);
   1741 	w += sldns_str_print(&s, &slen, "\t");
   1742 	datlen = data->rr_len[i]-2;
   1743 	dat = data->rr_data[i]+2;
   1744 	w += sldns_wire2str_rdata_scan(&dat, &datlen, &s, &slen, tp, NULL, 0, NULL);
   1745 
   1746 	if(tp == LDNS_RR_TYPE_DNSKEY) {
   1747 		w += sldns_str_print(&s, &slen, " ;{id = %u}",
   1748 			sldns_calc_keytag_raw(data->rr_data[i]+2,
   1749 				data->rr_len[i]-2));
   1750 	}
   1751 	w += sldns_str_print(&s, &slen, "\n");
   1752 
   1753 	if(w >= (int)buflen) {
   1754 		log_nametypeclass(NO_VERBOSE, "RR too long to print", nm, tp, cl);
   1755 		return 0;
   1756 	}
   1757 	return 1;
   1758 }
   1759 
   1760 /** write rrset to file */
   1761 static int
   1762 auth_zone_write_rrset(struct auth_zone* z, struct auth_data* node,
   1763 	struct auth_rrset* r, FILE* out)
   1764 {
   1765 	size_t i, count = r->data->count + r->data->rrsig_count;
   1766 	char buf[LDNS_RR_BUF_SIZE];
   1767 	for(i=0; i<count; i++) {
   1768 		if(!auth_rr_to_string(node->name, node->namelen, r->type,
   1769 			z->dclass, r->data, i, buf, sizeof(buf))) {
   1770 			verbose(VERB_ALGO, "failed to rr2str rr %d", (int)i);
   1771 			continue;
   1772 		}
   1773 		if(!write_out(out, buf, strlen(buf)))
   1774 			return 0;
   1775 	}
   1776 	return 1;
   1777 }
   1778 
   1779 /** write domain to file */
   1780 static int
   1781 auth_zone_write_domain(struct auth_zone* z, struct auth_data* n, FILE* out)
   1782 {
   1783 	struct auth_rrset* r;
   1784 	/* if this is zone apex, write SOA first */
   1785 	if(z->namelen == n->namelen) {
   1786 		struct auth_rrset* soa = az_domain_rrset(n, LDNS_RR_TYPE_SOA);
   1787 		if(soa) {
   1788 			if(!auth_zone_write_rrset(z, n, soa, out))
   1789 				return 0;
   1790 		}
   1791 	}
   1792 	/* write all the RRsets for this domain */
   1793 	for(r = n->rrsets; r; r = r->next) {
   1794 		if(z->namelen == n->namelen &&
   1795 			r->type == LDNS_RR_TYPE_SOA)
   1796 			continue; /* skip SOA here */
   1797 		if(!auth_zone_write_rrset(z, n, r, out))
   1798 			return 0;
   1799 	}
   1800 	return 1;
   1801 }
   1802 
   1803 int auth_zone_write_file(struct auth_zone* z, const char* fname)
   1804 {
   1805 	FILE* out;
   1806 	struct auth_data* n;
   1807 	out = fopen(fname, "w");
   1808 	if(!out) {
   1809 		log_err("could not open %s: %s", fname, strerror(errno));
   1810 		return 0;
   1811 	}
   1812 	RBTREE_FOR(n, struct auth_data*, &z->data) {
   1813 		if(!auth_zone_write_domain(z, n, out)) {
   1814 			log_err("could not write domain to %s", fname);
   1815 			fclose(out);
   1816 			return 0;
   1817 		}
   1818 	}
   1819 	fclose(out);
   1820 	return 1;
   1821 }
   1822 
   1823 /** offline verify for zonemd, while reading a zone file to immediately
   1824  * spot bad hashes in zonefile as they are read.
   1825  * Creates temp buffers, but uses anchors and validation environment
   1826  * from the module_env. */
   1827 static void
   1828 zonemd_offline_verify(struct auth_zone* z, struct module_env* env_for_val,
   1829 	struct module_stack* mods)
   1830 {
   1831 	struct module_env env;
   1832 	time_t now = 0;
   1833 	if(!z->zonemd_check)
   1834 		return;
   1835 	env = *env_for_val;
   1836 	env.scratch_buffer = sldns_buffer_new(env.cfg->msg_buffer_size);
   1837 	if(!env.scratch_buffer) {
   1838 		log_err("out of memory");
   1839 		goto clean_exit;
   1840 	}
   1841 	env.scratch = regional_create();
   1842 	if(!env.now) {
   1843 		env.now = &now;
   1844 		now = time(NULL);
   1845 	}
   1846 	if(!env.scratch) {
   1847 		log_err("out of memory");
   1848 		goto clean_exit;
   1849 	}
   1850 	auth_zone_verify_zonemd(z, &env, mods, NULL, 1, 0);
   1851 
   1852 clean_exit:
   1853 	/* clean up and exit */
   1854 	sldns_buffer_free(env.scratch_buffer);
   1855 	regional_destroy(env.scratch);
   1856 }
   1857 
   1858 /** read all auth zones from file (if they have) */
   1859 static int
   1860 auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg,
   1861 	struct module_env* env, struct module_stack* mods)
   1862 {
   1863 	struct auth_zone* z;
   1864 	lock_rw_wrlock(&az->lock);
   1865 	RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
   1866 		lock_rw_wrlock(&z->lock);
   1867 		if(!auth_zone_read_zonefile(z, cfg)) {
   1868 			/* For both secondary and primary zones, not fatal.
   1869 			 * This keeps the server up. */
   1870 			auth_zone_clear_data(z);
   1871 			lock_rw_unlock(&z->lock);
   1872 			continue;
   1873 		}
   1874 		if(z->zonefile && z->zonefile[0]!=0 && env)
   1875 			zonemd_offline_verify(z, env, mods);
   1876 		lock_rw_unlock(&z->lock);
   1877 	}
   1878 	lock_rw_unlock(&az->lock);
   1879 	return 1;
   1880 }
   1881 
   1882 /** fetch the content of a ZONEMD RR from the rdata */
   1883 static int zonemd_fetch_parameters(struct auth_rrset* zonemd_rrset, size_t i,
   1884 	uint32_t* serial, int* scheme, int* hashalgo, uint8_t** hash,
   1885 	size_t* hashlen)
   1886 {
   1887 	size_t rr_len;
   1888 	uint8_t* rdata;
   1889 	if(i >= zonemd_rrset->data->count)
   1890 		return 0;
   1891 	rr_len = zonemd_rrset->data->rr_len[i];
   1892 	if(rr_len < 2+4+1+1)
   1893 		return 0; /* too short, for rdlen+serial+scheme+algo */
   1894 	rdata = zonemd_rrset->data->rr_data[i];
   1895 	*serial = sldns_read_uint32(rdata+2);
   1896 	*scheme = rdata[6];
   1897 	*hashalgo = rdata[7];
   1898 	*hashlen = rr_len - 8;
   1899 	if(*hashlen == 0)
   1900 		*hash = NULL;
   1901 	else	*hash = rdata+8;
   1902 	return 1;
   1903 }
   1904 
   1905 /**
   1906  * See if the ZONEMD scheme, hash occurs more than once.
   1907  * @param zonemd_rrset: the zonemd rrset to check with the RRs in it.
   1908  * @param index: index of the original, this is allowed to have that
   1909  * 	scheme and hashalgo, but other RRs should not have it.
   1910  * @param scheme: the scheme to check for.
   1911  * @param hashalgo: the hash algorithm to check for.
   1912  * @return true if it occurs more than once.
   1913  */
   1914 static int zonemd_is_duplicate_scheme_hash(struct auth_rrset* zonemd_rrset,
   1915 	size_t index, int scheme, int hashalgo)
   1916 {
   1917 	size_t j;
   1918 	for(j=0; j<zonemd_rrset->data->count; j++) {
   1919 		uint32_t serial2 = 0;
   1920 		int scheme2 = 0, hashalgo2 = 0;
   1921 		uint8_t* hash2 = NULL;
   1922 		size_t hashlen2 = 0;
   1923 		if(index == j) {
   1924 			/* this is the original */
   1925 			continue;
   1926 		}
   1927 		if(!zonemd_fetch_parameters(zonemd_rrset, j, &serial2,
   1928 			&scheme2, &hashalgo2, &hash2, &hashlen2)) {
   1929 			/* malformed, skip it */
   1930 			continue;
   1931 		}
   1932 		if(scheme == scheme2 && hashalgo == hashalgo2) {
   1933 			/* duplicate scheme, hash */
   1934 			verbose(VERB_ALGO, "zonemd duplicate for scheme %d "
   1935 				"and hash %d", scheme, hashalgo);
   1936 			return 1;
   1937 		}
   1938 	}
   1939 	return 0;
   1940 }
   1941 
   1942 /**
   1943  * Check ZONEMDs if present for the auth zone.  Depending on config
   1944  * it can warn or fail on that.  Checks the hash of the ZONEMD.
   1945  * @param z: auth zone to check for.
   1946  * 	caller must hold lock on zone.
   1947  * @param env: module env for temp buffers.
   1948  * @param reason: returned on failure.
   1949  * @return false on failure, true if hash checks out.
   1950  */
   1951 static int auth_zone_zonemd_check_hash(struct auth_zone* z,
   1952 	struct module_env* env, char** reason)
   1953 {
   1954 	/* loop over ZONEMDs and see which one is valid. if not print
   1955 	 * failure (depending on config) */
   1956 	struct auth_data* apex;
   1957 	struct auth_rrset* zonemd_rrset;
   1958 	size_t i;
   1959 	struct regional* region = NULL;
   1960 	struct sldns_buffer* buf = NULL;
   1961 	uint32_t soa_serial = 0;
   1962 	char* unsupported_reason = NULL;
   1963 	int only_unsupported = 1;
   1964 	region = env->scratch;
   1965 	regional_free_all(region);
   1966 	buf = env->scratch_buffer;
   1967 	if(!auth_zone_get_serial(z, &soa_serial)) {
   1968 		*reason = "zone has no SOA serial";
   1969 		return 0;
   1970 	}
   1971 
   1972 	apex = az_find_name(z, z->name, z->namelen);
   1973 	if(!apex) {
   1974 		*reason = "zone has no apex";
   1975 		return 0;
   1976 	}
   1977 	zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD);
   1978 	if(!zonemd_rrset || zonemd_rrset->data->count==0) {
   1979 		*reason = "zone has no ZONEMD";
   1980 		return 0; /* no RRset or no RRs in rrset */
   1981 	}
   1982 
   1983 	/* we have a ZONEMD, check if it is correct */
   1984 	for(i=0; i<zonemd_rrset->data->count; i++) {
   1985 		uint32_t serial = 0;
   1986 		int scheme = 0, hashalgo = 0;
   1987 		uint8_t* hash = NULL;
   1988 		size_t hashlen = 0;
   1989 		if(!zonemd_fetch_parameters(zonemd_rrset, i, &serial, &scheme,
   1990 			&hashalgo, &hash, &hashlen)) {
   1991 			/* malformed RR */
   1992 			*reason = "ZONEMD rdata malformed";
   1993 			only_unsupported = 0;
   1994 			continue;
   1995 		}
   1996 		/* check for duplicates */
   1997 		if(zonemd_is_duplicate_scheme_hash(zonemd_rrset, i, scheme,
   1998 			hashalgo)) {
   1999 			/* duplicate hash of the same scheme,hash
   2000 			 * is not allowed. */
   2001 			*reason = "ZONEMD RRSet contains more than one RR "
   2002 				"with the same scheme and hash algorithm";
   2003 			only_unsupported = 0;
   2004 			continue;
   2005 		}
   2006 		regional_free_all(region);
   2007 		if(serial != soa_serial) {
   2008 			*reason = "ZONEMD serial is wrong";
   2009 			only_unsupported = 0;
   2010 			continue;
   2011 		}
   2012 		*reason = NULL;
   2013 		if(auth_zone_generate_zonemd_check(z, scheme, hashalgo,
   2014 			hash, hashlen, region, buf, reason)) {
   2015 			/* success */
   2016 			if(*reason) {
   2017 				if(!unsupported_reason)
   2018 					unsupported_reason = *reason;
   2019 				/* continue to check for valid ZONEMD */
   2020 				if(verbosity >= VERB_ALGO) {
   2021 					char zstr[LDNS_MAX_DOMAINLEN];
   2022 					dname_str(z->name, zstr);
   2023 					verbose(VERB_ALGO, "auth-zone %s ZONEMD %d %d is unsupported: %s", zstr, (int)scheme, (int)hashalgo, *reason);
   2024 				}
   2025 				*reason = NULL;
   2026 				continue;
   2027 			}
   2028 			if(verbosity >= VERB_ALGO) {
   2029 				char zstr[LDNS_MAX_DOMAINLEN];
   2030 				dname_str(z->name, zstr);
   2031 				if(!*reason)
   2032 					verbose(VERB_ALGO, "auth-zone %s ZONEMD hash is correct", zstr);
   2033 			}
   2034 			return 1;
   2035 		}
   2036 		only_unsupported = 0;
   2037 		/* try next one */
   2038 	}
   2039 	/* have we seen no failures but only unsupported algo,
   2040 	 * and one unsupported algorithm, or more. */
   2041 	if(only_unsupported && unsupported_reason) {
   2042 		/* only unsupported algorithms, with valid serial, not
   2043 		 * malformed. Did not see supported algorithms, failed or
   2044 		 * successful ones. */
   2045 		*reason = unsupported_reason;
   2046 		return 1;
   2047 	}
   2048 	/* fail, we may have reason */
   2049 	if(!*reason)
   2050 		*reason = "no ZONEMD records found";
   2051 	if(verbosity >= VERB_ALGO) {
   2052 		char zstr[LDNS_MAX_DOMAINLEN];
   2053 		dname_str(z->name, zstr);
   2054 		verbose(VERB_ALGO, "auth-zone %s ZONEMD failed: %s", zstr, *reason);
   2055 	}
   2056 	return 0;
   2057 }
   2058 
   2059 /** find the apex SOA RRset, if it exists */
   2060 struct auth_rrset* auth_zone_get_soa_rrset(struct auth_zone* z)
   2061 {
   2062 	struct auth_data* apex;
   2063 	struct auth_rrset* soa;
   2064 	apex = az_find_name(z, z->name, z->namelen);
   2065 	if(!apex) return NULL;
   2066 	soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA);
   2067 	return soa;
   2068 }
   2069 
   2070 /** find serial number of zone or false if none */
   2071 int
   2072 auth_zone_get_serial(struct auth_zone* z, uint32_t* serial)
   2073 {
   2074 	struct auth_data* apex;
   2075 	struct auth_rrset* soa;
   2076 	struct packed_rrset_data* d;
   2077 	size_t primlen, mboxlen;
   2078 	apex = az_find_name(z, z->name, z->namelen);
   2079 	if(!apex) return 0;
   2080 	soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA);
   2081 	if(!soa || soa->data->count==0)
   2082 		return 0; /* no RRset or no RRs in rrset */
   2083 	if(soa->data->rr_len[0] < 2+4*5) return 0; /* SOA too short */
   2084 	if((primlen = dname_valid(soa->data->rr_data[0]+2,
   2085 		soa->data->rr_len[0]-2)) == 0)
   2086 		return 0; /* primary dname malformed */
   2087 	if((mboxlen = dname_valid(soa->data->rr_data[0]+2+primlen,
   2088 		soa->data->rr_len[0]-2-primlen)) == 0)
   2089 		return 0; /* mailbox dname malformed */
   2090 	if(2+primlen+mboxlen+4*5 != soa->data->rr_len[0])
   2091 		return 0; /* rdata malformed */
   2092 	d = soa->data;
   2093 	*serial = sldns_read_uint32(d->rr_data[0]+(d->rr_len[0]-20));
   2094 	return 1;
   2095 }
   2096 
   2097 /** Find auth_zone SOA and populate the values in xfr(soa values). */
   2098 int
   2099 xfr_find_soa(struct auth_zone* z, struct auth_xfer* xfr)
   2100 {
   2101 	struct auth_data* apex;
   2102 	struct auth_rrset* soa;
   2103 	struct packed_rrset_data* d;
   2104 	size_t primlen, mboxlen;
   2105 	apex = az_find_name(z, z->name, z->namelen);
   2106 	if(!apex) return 0;
   2107 	soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA);
   2108 	if(!soa || soa->data->count==0)
   2109 		return 0; /* no RRset or no RRs in rrset */
   2110 	if(soa->data->rr_len[0] < 2+4*5) return 0; /* SOA too short */
   2111 	if((primlen = dname_valid(soa->data->rr_data[0]+2,
   2112 		soa->data->rr_len[0]-2)) == 0)
   2113 		return 0; /* primary dname malformed */
   2114 	if((mboxlen = dname_valid(soa->data->rr_data[0]+2+primlen,
   2115 		soa->data->rr_len[0]-2-primlen)) == 0)
   2116 		return 0; /* mailbox dname malformed */
   2117 	if(2+primlen+mboxlen+4*5 != soa->data->rr_len[0])
   2118 		return 0; /* rdata malformed */
   2119 	/* SOA record ends with serial, refresh, retry, expiry, minimum,
   2120 	 * as 4 byte fields */
   2121 	d = soa->data;
   2122 	xfr->have_zone = 1;
   2123 	xfr->serial = sldns_read_uint32(d->rr_data[0]+(d->rr_len[0]-20));
   2124 	xfr->refresh = sldns_read_uint32(d->rr_data[0]+(d->rr_len[0]-16));
   2125 	xfr->retry = sldns_read_uint32(d->rr_data[0]+(d->rr_len[0]-12));
   2126 	xfr->expiry = sldns_read_uint32(d->rr_data[0]+(d->rr_len[0]-8));
   2127 	/* soa minimum at d->rr_len[0]-4 */
   2128 	return 1;
   2129 }
   2130 
   2131 /**
   2132  * Setup auth_xfer zone
   2133  * This populates the have_zone, soa values, and so on times.
   2134  * Doesn't do network traffic yet, can set option flags.
   2135  * @param z: locked by caller, and modified for setup
   2136  * @param x: locked by caller, and modified.
   2137  * @return false on failure.
   2138  */
   2139 static int
   2140 auth_xfer_setup(struct auth_zone* z, struct auth_xfer* x)
   2141 {
   2142 	/* for a zone without zone transfers, x==NULL, so skip them,
   2143 	 * i.e. the zone config is fixed with no masters or urls */
   2144 	if(!z || !x) return 1;
   2145 	if(!xfr_find_soa(z, x)) {
   2146 		return 1;
   2147 	}
   2148 	x->is_rpz = (z->rpz!=NULL);
   2149 	/* nothing for probe, nextprobe and transfer tasks */
   2150 	return 1;
   2151 }
   2152 
   2153 /**
   2154  * Setup all zones
   2155  * @param az: auth zones structure
   2156  * @return false on failure.
   2157  */
   2158 static int
   2159 auth_zones_setup_zones(struct auth_zones* az)
   2160 {
   2161 	struct auth_zone* z;
   2162 	struct auth_xfer* x;
   2163 	lock_rw_wrlock(&az->lock);
   2164 	RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
   2165 		lock_rw_wrlock(&z->lock);
   2166 		x = auth_xfer_find(az, z->name, z->namelen, z->dclass);
   2167 		if(x) {
   2168 			lock_basic_lock(&x->lock);
   2169 		}
   2170 		if(!auth_xfer_setup(z, x)) {
   2171 			if(x) {
   2172 				lock_basic_unlock(&x->lock);
   2173 			}
   2174 			lock_rw_unlock(&z->lock);
   2175 			lock_rw_unlock(&az->lock);
   2176 			return 0;
   2177 		}
   2178 		if(x) {
   2179 			lock_basic_unlock(&x->lock);
   2180 		}
   2181 		lock_rw_unlock(&z->lock);
   2182 	}
   2183 	lock_rw_unlock(&az->lock);
   2184 	return 1;
   2185 }
   2186 
   2187 /** set config items and create zones */
   2188 static int
   2189 auth_zones_cfg(struct auth_zones* az, struct config_auth* c)
   2190 {
   2191 	struct auth_zone* z;
   2192 	struct auth_xfer* x = NULL;
   2193 
   2194 	/* create zone */
   2195 	if(c->isrpz) {
   2196 		/* if the rpz lock is needed, grab it before the other
   2197 		 * locks to avoid a lock dependency cycle */
   2198 		lock_rw_wrlock(&az->rpz_lock);
   2199 	}
   2200 	lock_rw_wrlock(&az->lock);
   2201 	if(!(z=auth_zones_find_or_add_zone(az, c->name))) {
   2202 		lock_rw_unlock(&az->lock);
   2203 		if(c->isrpz) {
   2204 			lock_rw_unlock(&az->rpz_lock);
   2205 		}
   2206 		return 0;
   2207 	}
   2208 	/* Populate the xfer related options early since we may create one now */
   2209 	z->max_transfer_size = c->max_transfer_size;
   2210 	z->max_transfer_time = c->max_transfer_time;
   2211 	if(c->masters || c->urls) {
   2212 		if(!(x=auth_zones_find_or_add_xfer(az, z))) {
   2213 			lock_rw_unlock(&az->lock);
   2214 			lock_rw_unlock(&z->lock);
   2215 			if(c->isrpz) {
   2216 				lock_rw_unlock(&az->rpz_lock);
   2217 			}
   2218 			return 0;
   2219 		}
   2220 	}
   2221 	if(c->for_downstream)
   2222 		az->have_downstream = 1;
   2223 	lock_rw_unlock(&az->lock);
   2224 
   2225 	/* set options */
   2226 	z->zone_deleted = 0;
   2227 	if(!auth_zone_set_zonefile(z, c->zonefile)) {
   2228 		if(x) {
   2229 			lock_basic_unlock(&x->lock);
   2230 		}
   2231 		lock_rw_unlock(&z->lock);
   2232 		if(c->isrpz) {
   2233 			lock_rw_unlock(&az->rpz_lock);
   2234 		}
   2235 		return 0;
   2236 	}
   2237 	z->for_downstream = c->for_downstream;
   2238 	z->for_upstream = c->for_upstream;
   2239 	z->fallback_enabled = c->fallback_enabled;
   2240 	z->zonemd_check = c->zonemd_check;
   2241 	z->zonemd_reject_absence = c->zonemd_reject_absence;
   2242 	if(c->isrpz && !z->rpz){
   2243 		if(!(z->rpz = rpz_create(c))){
   2244 			log_err("Could not setup RPZ zones");
   2245 			if(x) {
   2246 				lock_basic_unlock(&x->lock);
   2247 			}
   2248 			lock_rw_unlock(&z->lock);
   2249 			lock_rw_unlock(&az->rpz_lock);
   2250 			return 0;
   2251 		}
   2252 		lock_protect(&z->lock, &z->rpz->local_zones, sizeof(*z->rpz));
   2253 		/* the az->rpz_lock is locked above */
   2254 		z->rpz_az_next = az->rpz_first;
   2255 		if(az->rpz_first)
   2256 			az->rpz_first->rpz_az_prev = z;
   2257 		az->rpz_first = z;
   2258 	} else if(c->isrpz && z->rpz) {
   2259 		if(!rpz_config(z->rpz, c)) {
   2260 			log_err("Could not change rpz config");
   2261 			if(x) {
   2262 				lock_basic_unlock(&x->lock);
   2263 			}
   2264 			lock_rw_unlock(&z->lock);
   2265 			lock_rw_unlock(&az->rpz_lock);
   2266 			return 0;
   2267 		}
   2268 	}
   2269 	if(c->isrpz) {
   2270 		lock_rw_unlock(&az->rpz_lock);
   2271 	}
   2272 
   2273 	/* xfer zone */
   2274 	if(x) {
   2275 		z->zone_is_slave = 1;
   2276 		/* set options on xfer zone */
   2277 		if(!xfer_set_masters(&x->task_probe->masters, c, 0)) {
   2278 			lock_basic_unlock(&x->lock);
   2279 			lock_rw_unlock(&z->lock);
   2280 			return 0;
   2281 		}
   2282 		if(!xfer_set_masters(&x->task_transfer->masters, c, 1)) {
   2283 			lock_basic_unlock(&x->lock);
   2284 			lock_rw_unlock(&z->lock);
   2285 			return 0;
   2286 		}
   2287 		/* Pick up allow notify entries, early. This works for
   2288 		 * addresses and netblocks. */
   2289 		if(!x->allow_notify_list)
   2290 			probe_copy_masters_for_allow_notify(x);
   2291 		lock_basic_unlock(&x->lock);
   2292 	}
   2293 
   2294 	lock_rw_unlock(&z->lock);
   2295 	return 1;
   2296 }
   2297 
   2298 /** set all auth zones deleted, then in auth_zones_cfg, it marks them
   2299  * as nondeleted (if they are still in the config), and then later
   2300  * we can find deleted zones */
   2301 static void
   2302 az_setall_deleted(struct auth_zones* az)
   2303 {
   2304 	struct auth_zone* z;
   2305 	lock_rw_wrlock(&az->lock);
   2306 	RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
   2307 		lock_rw_wrlock(&z->lock);
   2308 		z->zone_deleted = 1;
   2309 		lock_rw_unlock(&z->lock);
   2310 	}
   2311 	lock_rw_unlock(&az->lock);
   2312 }
   2313 
   2314 /** find zones that are marked deleted and delete them.
   2315  * This is called from apply_cfg, and there are no threads and no
   2316  * workers, so the xfr can just be deleted. */
   2317 static void
   2318 az_delete_deleted_zones(struct auth_zones* az)
   2319 {
   2320 	struct auth_zone* z;
   2321 	struct auth_zone* delete_list = NULL, *next;
   2322 	struct auth_xfer* xfr;
   2323 	lock_rw_wrlock(&az->lock);
   2324 	RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
   2325 		lock_rw_wrlock(&z->lock);
   2326 		if(z->zone_deleted) {
   2327 			/* we cannot alter the rbtree right now, but
   2328 			 * we can put it on a linked list and then
   2329 			 * delete it */
   2330 			z->delete_next = delete_list;
   2331 			delete_list = z;
   2332 		}
   2333 		lock_rw_unlock(&z->lock);
   2334 	}
   2335 	/* now we are out of the tree loop and we can loop and delete
   2336 	 * the zones */
   2337 	z = delete_list;
   2338 	while(z) {
   2339 		next = z->delete_next;
   2340 		xfr = auth_xfer_find(az, z->name, z->namelen, z->dclass);
   2341 		if(xfr) {
   2342 			(void)rbtree_delete(&az->xtree, &xfr->node);
   2343 			auth_xfer_delete(xfr);
   2344 		}
   2345 		(void)rbtree_delete(&az->ztree, &z->node);
   2346 		auth_zone_delete(z, az);
   2347 		z = next;
   2348 	}
   2349 	lock_rw_unlock(&az->lock);
   2350 }
   2351 
   2352 int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg,
   2353 	int setup, int* is_rpz, struct module_env* env,
   2354 	struct module_stack* mods)
   2355 {
   2356 	struct config_auth* p;
   2357 	az_setall_deleted(az);
   2358 	for(p = cfg->auths; p; p = p->next) {
   2359 		if(!p->name || p->name[0] == 0) {
   2360 			log_warn("auth-zone without a name, skipped");
   2361 			continue;
   2362 		}
   2363 		*is_rpz = (*is_rpz || p->isrpz);
   2364 		if(!auth_zones_cfg(az, p)) {
   2365 			log_err("cannot config auth zone %s", p->name);
   2366 			return 0;
   2367 		}
   2368 	}
   2369 	az_delete_deleted_zones(az);
   2370 	if(!auth_zones_read_zones(az, cfg, env, mods))
   2371 		return 0;
   2372 	if(setup) {
   2373 		if(!auth_zones_setup_zones(az))
   2374 			return 0;
   2375 	}
   2376 	return 1;
   2377 }
   2378 
   2379 /** delete chunks
   2380  * @param at: transfer structure with chunks list.  The chunks and their
   2381  * 	data are freed.
   2382  */
   2383 static void
   2384 auth_chunks_delete(struct auth_transfer* at)
   2385 {
   2386 	if(at->chunks_first) {
   2387 		auth_chunk_list_delete(at->chunks_first);
   2388 	}
   2389 	at->chunks_first = NULL;
   2390 	at->chunks_last = NULL;
   2391 	at->chunks_total = 0;
   2392 }
   2393 
   2394 /** free master addr list */
   2395 static void
   2396 auth_free_master_addrs(struct auth_addr* list)
   2397 {
   2398 	struct auth_addr *n;
   2399 	while(list) {
   2400 		n = list->next;
   2401 		free(list);
   2402 		list = n;
   2403 	}
   2404 }
   2405 
   2406 /** free the masters list */
   2407 static void
   2408 auth_free_masters(struct auth_master* list)
   2409 {
   2410 	struct auth_master* n;
   2411 	while(list) {
   2412 		n = list->next;
   2413 		auth_free_master_addrs(list->list);
   2414 		free(list->host);
   2415 		free(list->file);
   2416 		free(list);
   2417 		list = n;
   2418 	}
   2419 }
   2420 
   2421 void
   2422 auth_xfer_delete(struct auth_xfer* xfr)
   2423 {
   2424 	if(!xfr) return;
   2425 	lock_basic_destroy(&xfr->lock);
   2426 	free(xfr->name);
   2427 	if(xfr->task_nextprobe) {
   2428 		comm_timer_delete(xfr->task_nextprobe->timer);
   2429 		free(xfr->task_nextprobe);
   2430 	}
   2431 	if(xfr->task_probe) {
   2432 		auth_free_masters(xfr->task_probe->masters);
   2433 		comm_point_delete(xfr->task_probe->cp);
   2434 		comm_timer_delete(xfr->task_probe->timer);
   2435 		free(xfr->task_probe);
   2436 	}
   2437 	if(xfr->task_transfer) {
   2438 		auth_free_masters(xfr->task_transfer->masters);
   2439 		comm_point_delete(xfr->task_transfer->cp);
   2440 		comm_timer_delete(xfr->task_transfer->timer);
   2441 		if(xfr->task_transfer->chunks_first) {
   2442 			auth_chunks_delete(xfr->task_transfer);
   2443 		}
   2444 		free(xfr->task_transfer);
   2445 	}
   2446 	auth_free_masters(xfr->allow_notify_list);
   2447 	free(xfr);
   2448 }
   2449 
   2450 /** helper traverse to delete zones */
   2451 static void
   2452 auth_zone_del(rbnode_type* n, void* ATTR_UNUSED(arg))
   2453 {
   2454 	struct auth_zone* z = (struct auth_zone*)n->key;
   2455 	auth_zone_delete(z, NULL);
   2456 }
   2457 
   2458 /** helper traverse to delete xfer zones */
   2459 static void
   2460 auth_xfer_del(rbnode_type* n, void* ATTR_UNUSED(arg))
   2461 {
   2462 	struct auth_xfer* z = (struct auth_xfer*)n->key;
   2463 	auth_xfer_delete(z);
   2464 }
   2465 
   2466 void auth_zones_delete(struct auth_zones* az)
   2467 {
   2468 	if(!az) return;
   2469 	lock_rw_destroy(&az->lock);
   2470 	lock_rw_destroy(&az->rpz_lock);
   2471 	traverse_postorder(&az->ztree, auth_zone_del, NULL);
   2472 	traverse_postorder(&az->xtree, auth_xfer_del, NULL);
   2473 	free(az);
   2474 }
   2475 
   2476 /** true if domain has only nsec3 */
   2477 static int
   2478 domain_has_only_nsec3(struct auth_data* n)
   2479 {
   2480 	struct auth_rrset* rrset = n->rrsets;
   2481 	int nsec3_seen = 0;
   2482 	while(rrset) {
   2483 		if(rrset->type == LDNS_RR_TYPE_NSEC3) {
   2484 			nsec3_seen = 1;
   2485 		} else if(rrset->type != LDNS_RR_TYPE_RRSIG) {
   2486 			return 0;
   2487 		}
   2488 		rrset = rrset->next;
   2489 	}
   2490 	return nsec3_seen;
   2491 }
   2492 
   2493 /** see if the domain has a wildcard child '*.domain' */
   2494 static struct auth_data*
   2495 az_find_wildcard_domain(struct auth_zone* z, uint8_t* nm, size_t nmlen)
   2496 {
   2497 	uint8_t wc[LDNS_MAX_DOMAINLEN];
   2498 	if(nmlen+2 > sizeof(wc))
   2499 		return NULL; /* result would be too long */
   2500 	wc[0] = 1; /* length of wildcard label */
   2501 	wc[1] = (uint8_t)'*'; /* wildcard label */
   2502 	memmove(wc+2, nm, nmlen);
   2503 	return az_find_name(z, wc, nmlen+2);
   2504 }
   2505 
   2506 /** find wildcard between qname and cename */
   2507 static struct auth_data*
   2508 az_find_wildcard(struct auth_zone* z, struct query_info* qinfo,
   2509 	struct auth_data* ce)
   2510 {
   2511 	uint8_t* nm = qinfo->qname;
   2512 	size_t nmlen = qinfo->qname_len;
   2513 	struct auth_data* node;
   2514 	if(!dname_subdomain_c(nm, z->name))
   2515 		return NULL; /* out of zone */
   2516 	while((node=az_find_wildcard_domain(z, nm, nmlen))==NULL) {
   2517 		if(nmlen == z->namelen)
   2518 			return NULL; /* top of zone reached */
   2519 		if(ce && nmlen == ce->namelen)
   2520 			return NULL; /* ce reached */
   2521 		if(!dname_remove_label_limit_len(&nm, &nmlen, z->namelen))
   2522 			return NULL; /* can't go up */
   2523 	}
   2524 	return node;
   2525 }
   2526 
   2527 /** domain is not exact, find first candidate ce (name that matches
   2528  * a part of qname) in tree */
   2529 static struct auth_data*
   2530 az_find_candidate_ce(struct auth_zone* z, struct query_info* qinfo,
   2531 	struct auth_data* n)
   2532 {
   2533 	uint8_t* nm;
   2534 	size_t nmlen;
   2535 	if(n) {
   2536 		nm = dname_get_shared_topdomain(qinfo->qname, n->name);
   2537 	} else {
   2538 		nm = qinfo->qname;
   2539 	}
   2540 	dname_count_size_labels(nm, &nmlen);
   2541 	n = az_find_name(z, nm, nmlen);
   2542 	/* delete labels and go up on name */
   2543 	while(!n) {
   2544 		if(!dname_remove_label_limit_len(&nm, &nmlen, z->namelen))
   2545 			return NULL; /* can't go up */
   2546 		n = az_find_name(z, nm, nmlen);
   2547 	}
   2548 	return n;
   2549 }
   2550 
   2551 /** go up the auth tree to next existing name. */
   2552 static struct auth_data*
   2553 az_domain_go_up(struct auth_zone* z, struct auth_data* n)
   2554 {
   2555 	uint8_t* nm = n->name;
   2556 	size_t nmlen = n->namelen;
   2557 	while(dname_remove_label_limit_len(&nm, &nmlen, z->namelen)) {
   2558 		if((n=az_find_name(z, nm, nmlen)) != NULL)
   2559 			return n;
   2560 	}
   2561 	return NULL;
   2562 }
   2563 
   2564 /** Find the closest encloser, an name that exists and is above the
   2565  * qname.
   2566  * return true if the node (param node) is existing, nonobscured and
   2567  * 	can be used to generate answers from.  It is then also node_exact.
   2568  * returns false if the node is not good enough (or it wasn't node_exact)
   2569  *	in this case the ce can be filled.
   2570  *	if ce is NULL, no ce exists, and likely the zone is completely empty,
   2571  *	not even with a zone apex.
   2572  *	if ce is nonNULL it is the closest enclosing upper name (that exists
   2573  *	itself for answer purposes).  That name may have DNAME, NS or wildcard
   2574  *	rrset is the closest DNAME or NS rrset that was found.
   2575  */
   2576 static int
   2577 az_find_ce(struct auth_zone* z, struct query_info* qinfo,
   2578 	struct auth_data* node, int node_exact, struct auth_data** ce,
   2579 	struct auth_rrset** rrset)
   2580 {
   2581 	struct auth_data* n = node;
   2582 	struct auth_rrset* lookrrset;
   2583 	*ce = NULL;
   2584 	*rrset = NULL;
   2585 	if(!node_exact) {
   2586 		/* if not exact, lookup closest exact match */
   2587 		n = az_find_candidate_ce(z, qinfo, n);
   2588 	} else {
   2589 		/* if exact, the node itself is the first candidate ce */
   2590 		*ce = n;
   2591 	}
   2592 
   2593 	/* no direct answer from nsec3-only domains */
   2594 	if(n && domain_has_only_nsec3(n)) {
   2595 		node_exact = 0;
   2596 		*ce = NULL;
   2597 	}
   2598 
   2599 	/* with exact matches, walk up the labels until we find the
   2600 	 * delegation, or DNAME or zone end */
   2601 	while(n) {
   2602 		/* see if the current candidate has issues */
   2603 		/* not zone apex and has type NS */
   2604 		if(n->namelen != z->namelen &&
   2605 			(lookrrset=az_domain_rrset(n, LDNS_RR_TYPE_NS)) &&
   2606 			/* delegate here, but DS at exact the dp has notype */
   2607 			(qinfo->qtype != LDNS_RR_TYPE_DS ||
   2608 			n->namelen != qinfo->qname_len)) {
   2609 			/* referral */
   2610 			/* this is ce and the lowernode is nonexisting */
   2611 			*ce = n;
   2612 			*rrset = lookrrset;
   2613 			node_exact = 0;
   2614 		}
   2615 		/* not equal to qname and has type DNAME */
   2616 		if(n->namelen != qinfo->qname_len &&
   2617 			(lookrrset=az_domain_rrset(n, LDNS_RR_TYPE_DNAME))) {
   2618 			/* this is ce and the lowernode is nonexisting */
   2619 			*ce = n;
   2620 			*rrset = lookrrset;
   2621 			node_exact = 0;
   2622 		}
   2623 
   2624 		if(*ce == NULL && !domain_has_only_nsec3(n)) {
   2625 			/* if not found yet, this exact name must be
   2626 			 * our lowest match (but not nsec3onlydomain) */
   2627 			*ce = n;
   2628 		}
   2629 
   2630 		/* walk up the tree by removing labels from name and lookup */
   2631 		n = az_domain_go_up(z, n);
   2632 	}
   2633 	/* found no problems, if it was an exact node, it is fine to use */
   2634 	return node_exact;
   2635 }
   2636 
   2637 /** add additional A/AAAA from domain names in rrset rdata (+offset)
   2638  * offset is number of bytes in rdata where the dname is located. */
   2639 static int
   2640 az_add_additionals_from(struct auth_zone* z, struct regional* region,
   2641 	struct dns_msg* msg, struct auth_rrset* rrset, size_t offset)
   2642 {
   2643 	struct packed_rrset_data* d = rrset->data;
   2644 	size_t i;
   2645 	if(!d) return 0;
   2646 	for(i=0; i<d->count; i++) {
   2647 		size_t dlen;
   2648 		struct auth_data* domain;
   2649 		struct auth_rrset* ref;
   2650 		if(d->rr_len[i] < 2+offset)
   2651 			continue; /* too short */
   2652 		if(!(dlen = dname_valid(d->rr_data[i]+2+offset,
   2653 			d->rr_len[i]-2-offset)))
   2654 			continue; /* malformed */
   2655 		domain = az_find_name(z, d->rr_data[i]+2+offset, dlen);
   2656 		if(!domain)
   2657 			continue;
   2658 		if((ref=az_domain_rrset(domain, LDNS_RR_TYPE_A)) != NULL) {
   2659 			if(!msg_add_rrset_ar(z, region, msg, domain, ref))
   2660 				return 0;
   2661 		}
   2662 		if((ref=az_domain_rrset(domain, LDNS_RR_TYPE_AAAA)) != NULL) {
   2663 			if(!msg_add_rrset_ar(z, region, msg, domain, ref))
   2664 				return 0;
   2665 		}
   2666 	}
   2667 	return 1;
   2668 }
   2669 
   2670 /** add negative SOA record (with negative TTL) */
   2671 static int
   2672 az_add_negative_soa(struct auth_zone* z, struct regional* region,
   2673 	struct dns_msg* msg)
   2674 {
   2675 	time_t minimum;
   2676 	size_t i;
   2677 	struct packed_rrset_data* d;
   2678 	struct auth_rrset* soa;
   2679 	struct auth_data* apex = az_find_name(z, z->name, z->namelen);
   2680 	if(!apex) return 0;
   2681 	soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA);
   2682 	if(!soa) return 0;
   2683 	/* must be first to put in message; we want to fix the TTL with
   2684 	 * one RRset here, otherwise we'd need to loop over the RRs to get
   2685 	 * the resulting lower TTL */
   2686 	log_assert(msg->rep->rrset_count == 0);
   2687 	if(!msg_add_rrset_ns(z, region, msg, apex, soa)) return 0;
   2688 	/* fixup TTL */
   2689 	d = (struct packed_rrset_data*)msg->rep->rrsets[msg->rep->rrset_count-1]->entry.data;
   2690 	/* last 4 bytes are minimum ttl in network format */
   2691 	if(d->count == 0) return 0;
   2692 	if(d->rr_len[0] < 2+4) return 0;
   2693 	minimum = (time_t)sldns_read_uint32(d->rr_data[0]+(d->rr_len[0]-4));
   2694 	minimum = d->ttl<minimum?d->ttl:minimum;
   2695 	d->ttl = minimum;
   2696 	for(i=0; i < d->count + d->rrsig_count; i++)
   2697 		d->rr_ttl[i] = minimum;
   2698 	msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[0]);
   2699 	msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
   2700 	msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
   2701 	return 1;
   2702 }
   2703 
   2704 /** See if the query goes to empty nonterminal (that has no auth_data,
   2705  * but there are nodes underneath.  We already checked that there are
   2706  * not NS, or DNAME above, so that we only need to check if some node
   2707  * exists below (with nonempty rr list), return true if emptynonterminal */
   2708 static int
   2709 az_empty_nonterminal(struct auth_zone* z, struct query_info* qinfo,
   2710 	struct auth_data* node)
   2711 {
   2712 	struct auth_data* next;
   2713 	if(!node) {
   2714 		/* no smaller was found, use first (smallest) node as the
   2715 		 * next one */
   2716 		next = (struct auth_data*)rbtree_first(&z->data);
   2717 	} else {
   2718 		next = (struct auth_data*)rbtree_next(&node->node);
   2719 	}
   2720 	while(next && (rbnode_type*)next != RBTREE_NULL && next->rrsets == NULL) {
   2721 		/* the next name has empty rrsets, is an empty nonterminal
   2722 		 * itself, see if there exists something below it */
   2723 		next = (struct auth_data*)rbtree_next(&next->node);
   2724 	}
   2725 	if((rbnode_type*)next == RBTREE_NULL || !next) {
   2726 		/* there is no next node, so something below it cannot
   2727 		 * exist */
   2728 		return 0;
   2729 	}
   2730 	/* a next node exists, if there was something below the query,
   2731 	 * this node has to be it.  See if it is below the query name */
   2732 	if(dname_strict_subdomain_c(next->name, qinfo->qname))
   2733 		return 1;
   2734 	return 0;
   2735 }
   2736 
   2737 /** create synth cname target name in buffer, or fail if too long */
   2738 static size_t
   2739 synth_cname_buf(uint8_t* qname, size_t qname_len, size_t dname_len,
   2740 	uint8_t* dtarg, size_t dtarglen, uint8_t* buf, size_t buflen)
   2741 {
   2742 	size_t newlen = qname_len + dtarglen - dname_len;
   2743 	if(newlen > buflen) {
   2744 		/* YXDOMAIN error */
   2745 		return 0;
   2746 	}
   2747 	/* new name is concatenation of qname front (without DNAME owner)
   2748 	 * and DNAME target name */
   2749 	memcpy(buf, qname, qname_len-dname_len);
   2750 	memmove(buf+(qname_len-dname_len), dtarg, dtarglen);
   2751 	return newlen;
   2752 }
   2753 
   2754 /** create synthetic CNAME rrset for in a DNAME answer in region,
   2755  * false on alloc failure, cname==NULL when name too long. */
   2756 static int
   2757 create_synth_cname(uint8_t* qname, size_t qname_len, struct regional* region,
   2758 	struct auth_data* node, struct auth_rrset* dname, uint16_t dclass,
   2759 	struct ub_packed_rrset_key** cname)
   2760 {
   2761 	uint8_t buf[LDNS_MAX_DOMAINLEN];
   2762 	uint8_t* dtarg;
   2763 	size_t dtarglen, newlen;
   2764 	struct packed_rrset_data* d;
   2765 
   2766 	/* get DNAME target name */
   2767 	if(dname->data->count < 1) return 0;
   2768 	if(dname->data->rr_len[0] < 3) return 0; /* at least rdatalen +1 */
   2769 	dtarg = dname->data->rr_data[0]+2;
   2770 	dtarglen = dname->data->rr_len[0]-2;
   2771 	if(sldns_read_uint16(dname->data->rr_data[0]) != dtarglen)
   2772 		return 0; /* rdatalen in DNAME rdata is malformed */
   2773 	if(dname_valid(dtarg, dtarglen) != dtarglen)
   2774 		return 0; /* DNAME RR has malformed rdata */
   2775 	if(qname_len == 0)
   2776 		return 0; /* too short */
   2777 	if(qname_len <= node->namelen)
   2778 		return 0; /* qname too short for dname removal */
   2779 
   2780 	/* synthesize a CNAME */
   2781 	newlen = synth_cname_buf(qname, qname_len, node->namelen,
   2782 		dtarg, dtarglen, buf, sizeof(buf));
   2783 	if(newlen == 0) {
   2784 		/* YXDOMAIN error */
   2785 		*cname = NULL;
   2786 		return 1;
   2787 	}
   2788 	*cname = (struct ub_packed_rrset_key*)regional_alloc(region,
   2789 		sizeof(struct ub_packed_rrset_key));
   2790 	if(!*cname)
   2791 		return 0; /* out of memory */
   2792 	memset(&(*cname)->entry, 0, sizeof((*cname)->entry));
   2793 	(*cname)->entry.key = (*cname);
   2794 	(*cname)->rk.type = htons(LDNS_RR_TYPE_CNAME);
   2795 	(*cname)->rk.rrset_class = htons(dclass);
   2796 	(*cname)->rk.flags = 0;
   2797 	(*cname)->rk.dname = regional_alloc_init(region, qname, qname_len);
   2798 	if(!(*cname)->rk.dname)
   2799 		return 0; /* out of memory */
   2800 	(*cname)->rk.dname_len = qname_len;
   2801 	(*cname)->entry.hash = rrset_key_hash(&(*cname)->rk);
   2802 	d = (struct packed_rrset_data*)regional_alloc_zero(region,
   2803 		sizeof(struct packed_rrset_data) + sizeof(size_t) +
   2804 		sizeof(uint8_t*) + sizeof(time_t) + sizeof(uint16_t)
   2805 		+ newlen);
   2806 	if(!d)
   2807 		return 0; /* out of memory */
   2808 	(*cname)->entry.data = d;
   2809 	d->ttl = dname->data->ttl; /* RFC6672: synth CNAME TTL == DNAME TTL */
   2810 	d->count = 1;
   2811 	d->rrsig_count = 0;
   2812 	d->trust = rrset_trust_ans_noAA;
   2813 	d->rr_len = (size_t*)((uint8_t*)d +
   2814 		sizeof(struct packed_rrset_data));
   2815 	d->rr_len[0] = newlen + sizeof(uint16_t);
   2816 	packed_rrset_ptr_fixup(d);
   2817 	d->rr_ttl[0] = d->ttl;
   2818 	sldns_write_uint16(d->rr_data[0], newlen);
   2819 	memmove(d->rr_data[0] + sizeof(uint16_t), buf, newlen);
   2820 	return 1;
   2821 }
   2822 
   2823 /** add a synthesized CNAME to the answer section */
   2824 static int
   2825 add_synth_cname(struct auth_zone* z, uint8_t* qname, size_t qname_len,
   2826 	struct regional* region, struct dns_msg* msg, struct auth_data* dname,
   2827 	struct auth_rrset* rrset)
   2828 {
   2829 	struct ub_packed_rrset_key* cname;
   2830 	/* synthesize a CNAME */
   2831 	if(!create_synth_cname(qname, qname_len, region, dname, rrset,
   2832 		z->dclass, &cname)) {
   2833 		/* out of memory */
   2834 		return 0;
   2835 	}
   2836 	if(!cname) {
   2837 		/* cname cannot be create because of YXDOMAIN */
   2838 		msg->rep->flags |= LDNS_RCODE_YXDOMAIN;
   2839 		return 1;
   2840 	}
   2841 	/* add cname to message */
   2842 	if(!msg_grow_array(region, msg))
   2843 		return 0;
   2844 	msg->rep->rrsets[msg->rep->rrset_count] = cname;
   2845 	msg->rep->rrset_count++;
   2846 	msg->rep->an_numrrsets++;
   2847 	msg_ttl(msg);
   2848 	return 1;
   2849 }
   2850 
   2851 /** Change a dname to a different one, for wildcard namechange */
   2852 static void
   2853 az_change_dnames(struct dns_msg* msg, uint8_t* oldname, uint8_t* newname,
   2854 	size_t newlen, int an_only)
   2855 {
   2856 	size_t i;
   2857 	size_t start = 0, end = msg->rep->rrset_count;
   2858 	if(!an_only) start = msg->rep->an_numrrsets;
   2859 	if(an_only) end = msg->rep->an_numrrsets;
   2860 	for(i=start; i<end; i++) {
   2861 		/* allocated in region so we can change the ptrs */
   2862 		if(query_dname_compare(msg->rep->rrsets[i]->rk.dname, oldname)
   2863 			== 0) {
   2864 			msg->rep->rrsets[i]->rk.dname = newname;
   2865 			msg->rep->rrsets[i]->rk.dname_len = newlen;
   2866 			msg->rep->rrsets[i]->entry.hash = rrset_key_hash(&msg->rep->rrsets[i]->rk);
   2867 		}
   2868 	}
   2869 }
   2870 
   2871 /** find NSEC record covering the query, with the given node in the zone */
   2872 static struct auth_rrset*
   2873 az_find_nsec_cover(struct auth_zone* z, struct auth_data** node)
   2874 {
   2875 	uint8_t* nm;
   2876 	size_t nmlen;
   2877 	struct auth_rrset* rrset;
   2878 	log_assert(*node); /* we already have a node when calling this */
   2879 	nm = (*node)->name;
   2880 	nmlen = (*node)->namelen;
   2881 	/* find the NSEC for the smallest-or-equal node */
   2882 	/* But there could be glue, and then it has no NSEC.
   2883 	 * Go up to find nonglue (previous) NSEC-holding nodes */
   2884 	while((rrset=az_domain_rrset(*node, LDNS_RR_TYPE_NSEC)) == NULL) {
   2885 		if(nmlen == z->namelen) return NULL;
   2886 		if(!dname_remove_label_limit_len(&nm, &nmlen, z->namelen))
   2887 			return NULL; /* can't go up */
   2888 		/* adjust *node for the nsec rrset to find in */
   2889 		*node = az_find_name(z, nm, nmlen);
   2890 	}
   2891 	return rrset;
   2892 }
   2893 
   2894 /** Find NSEC and add for wildcard denial */
   2895 static int
   2896 az_nsec_wildcard_denial(struct auth_zone* z, struct regional* region,
   2897 	struct dns_msg* msg, uint8_t* cenm, size_t cenmlen)
   2898 {
   2899 	struct query_info qinfo;
   2900 	int node_exact;
   2901 	struct auth_data* node;
   2902 	struct auth_rrset* nsec;
   2903 	uint8_t wc[LDNS_MAX_DOMAINLEN];
   2904 	if(cenmlen+2 > sizeof(wc))
   2905 		return 0; /* result would be too long */
   2906 	wc[0] = 1; /* length of wildcard label */
   2907 	wc[1] = (uint8_t)'*'; /* wildcard label */
   2908 	memmove(wc+2, cenm, cenmlen);
   2909 
   2910 	/* we have '*.ce' in wc wildcard name buffer */
   2911 	/* get nsec cover for that */
   2912 	qinfo.qname = wc;
   2913 	qinfo.qname_len = cenmlen+2;
   2914 	qinfo.qtype = 0;
   2915 	qinfo.qclass = 0;
   2916 	az_find_domain(z, &qinfo, &node_exact, &node);
   2917 	if((nsec=az_find_nsec_cover(z, &node)) != NULL) {
   2918 		if(!msg_add_rrset_ns(z, region, msg, node, nsec)) return 0;
   2919 	}
   2920 	return 1;
   2921 }
   2922 
   2923 /** Find the NSEC3PARAM rrset (if any) and if true you have the parameters */
   2924 static int
   2925 az_nsec3_param(struct auth_zone* z, int* algo, size_t* iter, uint8_t** salt,
   2926 	size_t* saltlen)
   2927 {
   2928 	struct auth_data* apex;
   2929 	struct auth_rrset* param;
   2930 	size_t i;
   2931 	apex = az_find_name(z, z->name, z->namelen);
   2932 	if(!apex) return 0;
   2933 	param = az_domain_rrset(apex, LDNS_RR_TYPE_NSEC3PARAM);
   2934 	if(!param || param->data->count==0)
   2935 		return 0; /* no RRset or no RRs in rrset */
   2936 	/* find out which NSEC3PARAM RR has supported parameters */
   2937 	/* skip unknown flags (dynamic signer is recalculating nsec3 chain) */
   2938 	for(i=0; i<param->data->count; i++) {
   2939 		uint8_t* rdata = param->data->rr_data[i]+2;
   2940 		size_t rdatalen = param->data->rr_len[i];
   2941 		if(rdatalen < 2+5)
   2942 			continue; /* too short */
   2943 		if(!nsec3_hash_algo_size_supported((int)(rdata[0])))
   2944 			continue; /* unsupported algo */
   2945 		if(rdatalen < (size_t)(2+5+(size_t)rdata[4]))
   2946 			continue; /* salt missing */
   2947 		if((rdata[1]&NSEC3_UNKNOWN_FLAGS)!=0)
   2948 			continue; /* unknown flags */
   2949 		*algo = (int)(rdata[0]);
   2950 		*iter = sldns_read_uint16(rdata+2);
   2951 		*saltlen = rdata[4];
   2952 		if(*saltlen == 0)
   2953 			*salt = NULL;
   2954 		else	*salt = rdata+5;
   2955 		return 1;
   2956 	}
   2957 	/* no supported params */
   2958 	return 0;
   2959 }
   2960 
   2961 /** Hash a name with nsec3param into buffer, it has zone name appended.
   2962  * return length of hash */
   2963 static size_t
   2964 az_nsec3_hash(uint8_t* buf, size_t buflen, uint8_t* nm, size_t nmlen,
   2965 	int algo, size_t iter, uint8_t* salt, size_t saltlen)
   2966 {
   2967 	size_t hlen = nsec3_hash_algo_size_supported(algo);
   2968 	/* buffer has domain name, nsec3hash, and 256 is for max saltlen
   2969 	 * (salt has 0-255 length) */
   2970 	unsigned char p[LDNS_MAX_DOMAINLEN+1+N3HASHBUFLEN+256];
   2971 	size_t i;
   2972 	if(nmlen+saltlen > sizeof(p) || hlen+saltlen > sizeof(p))
   2973 		return 0;
   2974 	if(hlen > buflen)
   2975 		return 0; /* somehow too large for destination buffer */
   2976 	/* hashfunc(name, salt) */
   2977 	memmove(p, nm, nmlen);
   2978 	query_dname_tolower(p);
   2979 	if(salt && saltlen > 0)
   2980 		memmove(p+nmlen, salt, saltlen);
   2981 	(void)secalgo_nsec3_hash(algo, p, nmlen+saltlen, (unsigned char*)buf);
   2982 	for(i=0; i<iter; i++) {
   2983 		/* hashfunc(hash, salt) */
   2984 		memmove(p, buf, hlen);
   2985 		if(salt && saltlen > 0)
   2986 			memmove(p+hlen, salt, saltlen);
   2987 		(void)secalgo_nsec3_hash(algo, p, hlen+saltlen,
   2988 			(unsigned char*)buf);
   2989 	}
   2990 	return hlen;
   2991 }
   2992 
   2993 /** Hash name and return b32encoded hashname for lookup, zone name appended */
   2994 static int
   2995 az_nsec3_hashname(struct auth_zone* z, uint8_t* hashname, size_t* hashnmlen,
   2996 	uint8_t* nm, size_t nmlen, int algo, size_t iter, uint8_t* salt,
   2997 	size_t saltlen)
   2998 {
   2999 	uint8_t hash[N3HASHBUFLEN];
   3000 	size_t hlen;
   3001 	int ret;
   3002 	hlen = az_nsec3_hash(hash, sizeof(hash), nm, nmlen, algo, iter,
   3003 		salt, saltlen);
   3004 	if(!hlen) return 0;
   3005 	/* b32 encode */
   3006 	if(*hashnmlen < hlen*2+1+z->namelen) /* approx b32 as hexb16 */
   3007 		return 0;
   3008 	ret = sldns_b32_ntop_extended_hex(hash, hlen, (char*)(hashname+1),
   3009 		(*hashnmlen)-1);
   3010 	if(ret<1)
   3011 		return 0;
   3012 	hashname[0] = (uint8_t)ret;
   3013 	ret++;
   3014 	if((*hashnmlen) - ret < z->namelen)
   3015 		return 0;
   3016 	memmove(hashname+ret, z->name, z->namelen);
   3017 	*hashnmlen = z->namelen+(size_t)ret;
   3018 	return 1;
   3019 }
   3020 
   3021 /** Find the datanode that covers the nsec3hash-name */
   3022 static struct auth_data*
   3023 az_nsec3_findnode(struct auth_zone* z, uint8_t* hashnm, size_t hashnmlen)
   3024 {
   3025 	struct query_info qinfo;
   3026 	struct auth_data* node;
   3027 	int node_exact;
   3028 	qinfo.qclass = 0;
   3029 	qinfo.qtype = 0;
   3030 	qinfo.qname = hashnm;
   3031 	qinfo.qname_len = hashnmlen;
   3032 	/* because canonical ordering and b32 nsec3 ordering are the same.
   3033 	 * this is a good lookup to find the nsec3 name. */
   3034 	az_find_domain(z, &qinfo, &node_exact, &node);
   3035 	/* but we may have to skip non-nsec3 nodes */
   3036 	/* this may be a lot, the way to speed that up is to have a
   3037 	 * separate nsec3 tree with nsec3 nodes */
   3038 	while(node && (rbnode_type*)node != RBTREE_NULL &&
   3039 		!az_domain_rrset(node, LDNS_RR_TYPE_NSEC3)) {
   3040 		node = (struct auth_data*)rbtree_previous(&node->node);
   3041 	}
   3042 	if((rbnode_type*)node == RBTREE_NULL)
   3043 		node = NULL;
   3044 	return node;
   3045 }
   3046 
   3047 /** Find cover for hashed(nm, nmlen) (or NULL) */
   3048 static struct auth_data*
   3049 az_nsec3_find_cover(struct auth_zone* z, uint8_t* nm, size_t nmlen,
   3050 	int algo, size_t iter, uint8_t* salt, size_t saltlen)
   3051 {
   3052 	struct auth_data* node;
   3053 	uint8_t hname[LDNS_MAX_DOMAINLEN];
   3054 	size_t hlen = sizeof(hname);
   3055 	if(!az_nsec3_hashname(z, hname, &hlen, nm, nmlen, algo, iter,
   3056 		salt, saltlen))
   3057 		return NULL;
   3058 	node = az_nsec3_findnode(z, hname, hlen);
   3059 	if(node)
   3060 		return node;
   3061 	/* we did not find any, perhaps because the NSEC3 hash is before
   3062 	 * the first hash, we have to find the 'last hash' in the zone */
   3063 	node = (struct auth_data*)rbtree_last(&z->data);
   3064 	while(node && (rbnode_type*)node != RBTREE_NULL &&
   3065 		!az_domain_rrset(node, LDNS_RR_TYPE_NSEC3)) {
   3066 		node = (struct auth_data*)rbtree_previous(&node->node);
   3067 	}
   3068 	if((rbnode_type*)node == RBTREE_NULL)
   3069 		node = NULL;
   3070 	return node;
   3071 }
   3072 
   3073 /** Find exact match for hashed(nm, nmlen) NSEC3 record or NULL */
   3074 static struct auth_data*
   3075 az_nsec3_find_exact(struct auth_zone* z, uint8_t* nm, size_t nmlen,
   3076 	int algo, size_t iter, uint8_t* salt, size_t saltlen)
   3077 {
   3078 	struct auth_data* node;
   3079 	uint8_t hname[LDNS_MAX_DOMAINLEN];
   3080 	size_t hlen = sizeof(hname);
   3081 	if(!az_nsec3_hashname(z, hname, &hlen, nm, nmlen, algo, iter,
   3082 		salt, saltlen))
   3083 		return NULL;
   3084 	node = az_find_name(z, hname, hlen);
   3085 	if(az_domain_rrset(node, LDNS_RR_TYPE_NSEC3))
   3086 		return node;
   3087 	return NULL;
   3088 }
   3089 
   3090 /** Return nextcloser name (as a ref into the qname).  This is one label
   3091  * more than the cenm (cename must be a suffix of qname) */
   3092 static void
   3093 az_nsec3_get_nextcloser(uint8_t* cenm, uint8_t* qname, size_t qname_len,
   3094 	uint8_t** nx, size_t* nxlen)
   3095 {
   3096 	int celabs = dname_count_labels(cenm);
   3097 	int qlabs = dname_count_labels(qname);
   3098 	int strip = qlabs - celabs -1;
   3099 	log_assert(dname_strict_subdomain(qname, qlabs, cenm, celabs));
   3100 	*nx = qname;
   3101 	*nxlen = qname_len;
   3102 	if(strip>0)
   3103 		dname_remove_labels(nx, nxlen, strip);
   3104 }
   3105 
   3106 /** Find the closest encloser that has exact NSEC3.
   3107  * updated cenm to the new name. If it went up no-exact-ce is true. */
   3108 static struct auth_data*
   3109 az_nsec3_find_ce(struct auth_zone* z, uint8_t** cenm, size_t* cenmlen,
   3110 	int* no_exact_ce, int algo, size_t iter, uint8_t* salt, size_t saltlen)
   3111 {
   3112 	struct auth_data* node;
   3113 	while((node = az_nsec3_find_exact(z, *cenm, *cenmlen,
   3114 		algo, iter, salt, saltlen)) == NULL) {
   3115 		if(!dname_remove_label_limit_len(cenm, cenmlen, z->namelen))
   3116 			return NULL; /* can't go up */
   3117 		*no_exact_ce = 1;
   3118 	}
   3119 	return node;
   3120 }
   3121 
   3122 /* Insert NSEC3 record in authority section, if NULL does nothing */
   3123 static int
   3124 az_nsec3_insert(struct auth_zone* z, struct regional* region,
   3125 	struct dns_msg* msg, struct auth_data* node)
   3126 {
   3127 	struct auth_rrset* nsec3;
   3128 	if(!node) return 1; /* no node, skip this */
   3129 	nsec3 = az_domain_rrset(node, LDNS_RR_TYPE_NSEC3);
   3130 	if(!nsec3) return 1; /* if no nsec3 RR, skip it */
   3131 	if(!msg_add_rrset_ns(z, region, msg, node, nsec3)) return 0;
   3132 	return 1;
   3133 }
   3134 
   3135 /** add NSEC3 records to the zone for the nsec3 proof.
   3136  * Specify with the flags with parts of the proof are required.
   3137  * the ce is the exact matching name (for notype) but also delegation points.
   3138  * qname is the one where the nextcloser name can be derived from.
   3139  * If NSEC3 is not properly there (in the zone) nothing is added.
   3140  * always enabled: include nsec3 proving about the Closest Encloser.
   3141  * 	that is an exact match that should exist for it.
   3142  * 	If that does not exist, a higher exact match + nxproof is enabled
   3143  * 	(for some sort of opt-out empty nonterminal cases).
   3144  * nodataproof: search for exact match and include that instead.
   3145  * ceproof: include ce proof NSEC3 (omitted for wildcard replies).
   3146  * nxproof: include denial of the qname.
   3147  * wcproof: include denial of wildcard (wildcard.ce).
   3148  */
   3149 static int
   3150 az_add_nsec3_proof(struct auth_zone* z, struct regional* region,
   3151 	struct dns_msg* msg, uint8_t* cenm, size_t cenmlen, uint8_t* qname,
   3152 	size_t qname_len, int nodataproof, int ceproof, int nxproof,
   3153 	int wcproof)
   3154 {
   3155 	int algo;
   3156 	size_t iter, saltlen;
   3157 	uint8_t* salt;
   3158 	int no_exact_ce = 0;
   3159 	struct auth_data* node;
   3160 
   3161 	/* find parameters of nsec3 proof */
   3162 	if(!az_nsec3_param(z, &algo, &iter, &salt, &saltlen))
   3163 		return 1; /* no nsec3 */
   3164 	if(nodataproof) {
   3165 		/* see if the node has a hash of itself for the nodata
   3166 		 * proof nsec3, this has to be an exact match nsec3. */
   3167 		struct auth_data* match;
   3168 		match = az_nsec3_find_exact(z, qname, qname_len, algo,
   3169 			iter, salt, saltlen);
   3170 		if(match) {
   3171 			if(!az_nsec3_insert(z, region, msg, match))
   3172 				return 0;
   3173 			/* only nodata NSEC3 needed, no CE or others. */
   3174 			return 1;
   3175 		}
   3176 	}
   3177 	/* find ce that has an NSEC3 */
   3178 	if(ceproof) {
   3179 		node = az_nsec3_find_ce(z, &cenm, &cenmlen, &no_exact_ce,
   3180 			algo, iter, salt, saltlen);
   3181 		if(no_exact_ce) nxproof = 1;
   3182 		if(!az_nsec3_insert(z, region, msg, node))
   3183 			return 0;
   3184 	}
   3185 
   3186 	if(nxproof) {
   3187 		uint8_t* nx;
   3188 		size_t nxlen;
   3189 		/* create nextcloser domain name */
   3190 		az_nsec3_get_nextcloser(cenm, qname, qname_len, &nx, &nxlen);
   3191 		/* find nsec3 that matches or covers it */
   3192 		node = az_nsec3_find_cover(z, nx, nxlen, algo, iter, salt,
   3193 			saltlen);
   3194 		if(!az_nsec3_insert(z, region, msg, node))
   3195 			return 0;
   3196 	}
   3197 	if(wcproof) {
   3198 		/* create wildcard name *.ce */
   3199 		uint8_t wc[LDNS_MAX_DOMAINLEN];
   3200 		size_t wclen;
   3201 		if(cenmlen+2 > sizeof(wc))
   3202 			return 0; /* result would be too long */
   3203 		wc[0] = 1; /* length of wildcard label */
   3204 		wc[1] = (uint8_t)'*'; /* wildcard label */
   3205 		memmove(wc+2, cenm, cenmlen);
   3206 		wclen = cenmlen+2;
   3207 		/* find nsec3 that matches or covers it */
   3208 		node = az_nsec3_find_cover(z, wc, wclen, algo, iter, salt,
   3209 			saltlen);
   3210 		if(!az_nsec3_insert(z, region, msg, node))
   3211 			return 0;
   3212 	}
   3213 	return 1;
   3214 }
   3215 
   3216 /** generate answer for positive answer */
   3217 static int
   3218 az_generate_positive_answer(struct auth_zone* z, struct regional* region,
   3219 	struct dns_msg* msg, struct auth_data* node, struct auth_rrset* rrset)
   3220 {
   3221 	if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
   3222 	/* see if we want additional rrs */
   3223 	if(rrset->type == LDNS_RR_TYPE_MX) {
   3224 		if(!az_add_additionals_from(z, region, msg, rrset, 2))
   3225 			return 0;
   3226 	} else if(rrset->type == LDNS_RR_TYPE_SRV) {
   3227 		if(!az_add_additionals_from(z, region, msg, rrset, 6))
   3228 			return 0;
   3229 	} else if(rrset->type == LDNS_RR_TYPE_NS) {
   3230 		if(!az_add_additionals_from(z, region, msg, rrset, 0))
   3231 			return 0;
   3232 	}
   3233 	return 1;
   3234 }
   3235 
   3236 /** generate answer for type ANY answer */
   3237 static int
   3238 az_generate_any_answer(struct auth_zone* z, struct regional* region,
   3239 	struct dns_msg* msg, struct auth_data* node)
   3240 {
   3241 	struct auth_rrset* rrset;
   3242 	int added = 0;
   3243 	/* add a couple (at least one) RRs */
   3244 	if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_SOA)) != NULL) {
   3245 		if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
   3246 		added++;
   3247 	}
   3248 	if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_MX)) != NULL) {
   3249 		if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
   3250 		added++;
   3251 	}
   3252 	if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_A)) != NULL) {
   3253 		if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
   3254 		added++;
   3255 	}
   3256 	if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_AAAA)) != NULL) {
   3257 		if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
   3258 		added++;
   3259 	}
   3260 	if(added == 0 && node && node->rrsets) {
   3261 		if(!msg_add_rrset_an(z, region, msg, node,
   3262 			node->rrsets)) return 0;
   3263 	}
   3264 	return 1;
   3265 }
   3266 
   3267 /** follow cname chain and add more data to the answer section */
   3268 static int
   3269 follow_cname_chain(struct auth_zone* z, uint16_t qtype,
   3270 	struct regional* region, struct dns_msg* msg,
   3271 	struct packed_rrset_data* d)
   3272 {
   3273 	int maxchain = 0;
   3274 	/* see if we can add the target of the CNAME into the answer */
   3275 	while(maxchain++ < MAX_CNAME_CHAIN) {
   3276 		struct auth_data* node;
   3277 		struct auth_rrset* rrset;
   3278 		size_t clen;
   3279 		/* d has cname rdata */
   3280 		if(d->count == 0) break; /* no CNAME */
   3281 		if(d->rr_len[0] < 2+1) break; /* too small */
   3282 		if((clen=dname_valid(d->rr_data[0]+2, d->rr_len[0]-2))==0)
   3283 			break; /* malformed */
   3284 		if(!dname_subdomain_c(d->rr_data[0]+2, z->name))
   3285 			break; /* target out of zone */
   3286 		if((node = az_find_name(z, d->rr_data[0]+2, clen))==NULL)
   3287 			break; /* no such target name */
   3288 		if((rrset=az_domain_rrset(node, qtype))!=NULL) {
   3289 			/* done we found the target */
   3290 			if(!msg_add_rrset_an(z, region, msg, node, rrset))
   3291 				return 0;
   3292 			break;
   3293 		}
   3294 		if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_CNAME))==NULL)
   3295 			break; /* no further CNAME chain, notype */
   3296 		if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
   3297 		d = rrset->data;
   3298 	}
   3299 	return 1;
   3300 }
   3301 
   3302 /** generate answer for cname answer */
   3303 static int
   3304 az_generate_cname_answer(struct auth_zone* z, struct query_info* qinfo,
   3305 	struct regional* region, struct dns_msg* msg,
   3306 	struct auth_data* node, struct auth_rrset* rrset)
   3307 {
   3308 	if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
   3309 	if(!rrset) return 1;
   3310 	if(!follow_cname_chain(z, qinfo->qtype, region, msg, rrset->data))
   3311 		return 0;
   3312 	return 1;
   3313 }
   3314 
   3315 /** generate answer for notype answer */
   3316 static int
   3317 az_generate_notype_answer(struct auth_zone* z, struct regional* region,
   3318 	struct dns_msg* msg, struct auth_data* node)
   3319 {
   3320 	struct auth_rrset* rrset;
   3321 	if(!az_add_negative_soa(z, region, msg)) return 0;
   3322 	/* DNSSEC denial NSEC */
   3323 	if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_NSEC))!=NULL) {
   3324 		if(!msg_add_rrset_ns(z, region, msg, node, rrset)) return 0;
   3325 	} else if(node) {
   3326 		/* DNSSEC denial NSEC3 */
   3327 		if(!az_add_nsec3_proof(z, region, msg, node->name,
   3328 			node->namelen, msg->qinfo.qname,
   3329 			msg->qinfo.qname_len, 1, 1, 0, 0))
   3330 			return 0;
   3331 	}
   3332 	return 1;
   3333 }
   3334 
   3335 /** generate answer for referral answer */
   3336 static int
   3337 az_generate_referral_answer(struct auth_zone* z, struct regional* region,
   3338 	struct dns_msg* msg, struct auth_data* ce, struct auth_rrset* rrset)
   3339 {
   3340 	struct auth_rrset* ds, *nsec;
   3341 	/* turn off AA flag, referral is nonAA because it leaves the zone */
   3342 	log_assert(ce);
   3343 	msg->rep->flags &= ~BIT_AA;
   3344 	if(!msg_add_rrset_ns(z, region, msg, ce, rrset)) return 0;
   3345 	/* add DS or deny it */
   3346 	if((ds=az_domain_rrset(ce, LDNS_RR_TYPE_DS))!=NULL) {
   3347 		if(!msg_add_rrset_ns(z, region, msg, ce, ds)) return 0;
   3348 	} else {
   3349 		/* deny the DS */
   3350 		if((nsec=az_domain_rrset(ce, LDNS_RR_TYPE_NSEC))!=NULL) {
   3351 			if(!msg_add_rrset_ns(z, region, msg, ce, nsec))
   3352 				return 0;
   3353 		} else {
   3354 			if(!az_add_nsec3_proof(z, region, msg, ce->name,
   3355 				ce->namelen, msg->qinfo.qname,
   3356 				msg->qinfo.qname_len, 1, 1, 0, 0))
   3357 				return 0;
   3358 		}
   3359 	}
   3360 	/* add additional rrs for type NS */
   3361 	if(!az_add_additionals_from(z, region, msg, rrset, 0)) return 0;
   3362 	return 1;
   3363 }
   3364 
   3365 /** generate answer for DNAME answer */
   3366 static int
   3367 az_generate_dname_answer(struct auth_zone* z, struct query_info* qinfo,
   3368 	struct regional* region, struct dns_msg* msg, struct auth_data* ce,
   3369 	struct auth_rrset* rrset)
   3370 {
   3371 	log_assert(ce);
   3372 	/* add the DNAME and then a CNAME */
   3373 	if(!msg_add_rrset_an(z, region, msg, ce, rrset)) return 0;
   3374 	if(!add_synth_cname(z, qinfo->qname, qinfo->qname_len, region,
   3375 		msg, ce, rrset)) return 0;
   3376 	if(FLAGS_GET_RCODE(msg->rep->flags) == LDNS_RCODE_YXDOMAIN)
   3377 		return 1;
   3378 	if(msg->rep->rrset_count == 0 ||
   3379 		!msg->rep->rrsets[msg->rep->rrset_count-1])
   3380 		return 0;
   3381 	if(!follow_cname_chain(z, qinfo->qtype, region, msg,
   3382 		(struct packed_rrset_data*)msg->rep->rrsets[
   3383 		msg->rep->rrset_count-1]->entry.data))
   3384 		return 0;
   3385 	return 1;
   3386 }
   3387 
   3388 /** generate answer for wildcard answer */
   3389 static int
   3390 az_generate_wildcard_answer(struct auth_zone* z, struct query_info* qinfo,
   3391 	struct regional* region, struct dns_msg* msg, struct auth_data* ce,
   3392 	struct auth_data* wildcard, struct auth_data* node)
   3393 {
   3394 	struct auth_rrset* rrset, *nsec;
   3395 	int insert_ce = 0;
   3396 	if((rrset=az_domain_rrset(wildcard, qinfo->qtype)) != NULL) {
   3397 		/* wildcard has type, add it */
   3398 		if(!msg_add_rrset_an(z, region, msg, wildcard, rrset))
   3399 			return 0;
   3400 		az_change_dnames(msg, wildcard->name, msg->qinfo.qname,
   3401 			msg->qinfo.qname_len, 1);
   3402 	} else if((rrset=az_domain_rrset(wildcard, LDNS_RR_TYPE_CNAME))!=NULL) {
   3403 		/* wildcard has cname instead, do that */
   3404 		if(!msg_add_rrset_an(z, region, msg, wildcard, rrset))
   3405 			return 0;
   3406 		az_change_dnames(msg, wildcard->name, msg->qinfo.qname,
   3407 			msg->qinfo.qname_len, 1);
   3408 		if(!follow_cname_chain(z, qinfo->qtype, region, msg,
   3409 			rrset->data))
   3410 			return 0;
   3411 	} else if(qinfo->qtype == LDNS_RR_TYPE_ANY && wildcard->rrsets) {
   3412 		/* add ANY rrsets from wildcard node */
   3413 		if(!az_generate_any_answer(z, region, msg, wildcard))
   3414 			return 0;
   3415 		az_change_dnames(msg, wildcard->name, msg->qinfo.qname,
   3416 			msg->qinfo.qname_len, 1);
   3417 	} else {
   3418 		/* wildcard has nodata, notype answer */
   3419 		/* call other notype routine for dnssec notype denials */
   3420 		if(!az_generate_notype_answer(z, region, msg, wildcard))
   3421 			return 0;
   3422 		/* because the notype, there is no positive data with an
   3423 		 * RRSIG that indicates the wildcard position.  Thus the
   3424 		 * wildcard qname denial needs to have a CE nsec3. */
   3425 		insert_ce = 1;
   3426 	}
   3427 
   3428 	/* ce and node for dnssec denial of wildcard original name */
   3429 	if((nsec=az_find_nsec_cover(z, &node)) != NULL) {
   3430 		if(!msg_add_rrset_ns(z, region, msg, node, nsec)) return 0;
   3431 	} else if(ce) {
   3432 		uint8_t* wildup = wildcard->name;
   3433 		size_t wilduplen= wildcard->namelen;
   3434 		if(!dname_remove_label_limit_len(&wildup, &wilduplen, z->namelen))
   3435 			return 0; /* can't go up */
   3436 		if(!az_add_nsec3_proof(z, region, msg, wildup,
   3437 			wilduplen, msg->qinfo.qname,
   3438 			msg->qinfo.qname_len, 0, insert_ce, 1, 0))
   3439 			return 0;
   3440 	}
   3441 
   3442 	/* fixup name of wildcard from *.zone to qname, use already allocated
   3443 	 * pointer to msg qname */
   3444 	az_change_dnames(msg, wildcard->name, msg->qinfo.qname,
   3445 		msg->qinfo.qname_len, 0);
   3446 	return 1;
   3447 }
   3448 
   3449 /** generate answer for nxdomain answer */
   3450 static int
   3451 az_generate_nxdomain_answer(struct auth_zone* z, struct regional* region,
   3452 	struct dns_msg* msg, struct auth_data* ce, struct auth_data* node)
   3453 {
   3454 	struct auth_rrset* nsec;
   3455 	msg->rep->flags |= LDNS_RCODE_NXDOMAIN;
   3456 	if(!az_add_negative_soa(z, region, msg)) return 0;
   3457 	if((nsec=az_find_nsec_cover(z, &node)) != NULL) {
   3458 		if(!msg_add_rrset_ns(z, region, msg, node, nsec)) return 0;
   3459 		if(ce && !az_nsec_wildcard_denial(z, region, msg, ce->name,
   3460 			ce->namelen)) return 0;
   3461 	} else if(ce) {
   3462 		if(!az_add_nsec3_proof(z, region, msg, ce->name,
   3463 			ce->namelen, msg->qinfo.qname,
   3464 			msg->qinfo.qname_len, 0, 1, 1, 1))
   3465 			return 0;
   3466 	}
   3467 	return 1;
   3468 }
   3469 
   3470 /** Create answers when an exact match exists for the domain name */
   3471 static int
   3472 az_generate_answer_with_node(struct auth_zone* z, struct query_info* qinfo,
   3473 	struct regional* region, struct dns_msg* msg, struct auth_data* node)
   3474 {
   3475 	struct auth_rrset* rrset;
   3476 	/* positive answer, rrset we are looking for exists */
   3477 	if((rrset=az_domain_rrset(node, qinfo->qtype)) != NULL) {
   3478 		return az_generate_positive_answer(z, region, msg, node, rrset);
   3479 	}
   3480 	/* CNAME? */
   3481 	if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_CNAME)) != NULL) {
   3482 		return az_generate_cname_answer(z, qinfo, region, msg,
   3483 			node, rrset);
   3484 	}
   3485 	/* type ANY ? */
   3486 	if(qinfo->qtype == LDNS_RR_TYPE_ANY) {
   3487 		return az_generate_any_answer(z, region, msg, node);
   3488 	}
   3489 	/* NOERROR/NODATA (no such type at domain name) */
   3490 	return az_generate_notype_answer(z, region, msg, node);
   3491 }
   3492 
   3493 /** Generate answer without an existing-node that we can use.
   3494  * So it'll be a referral, DNAME, notype, wildcard or nxdomain */
   3495 static int
   3496 az_generate_answer_nonexistnode(struct auth_zone* z, struct query_info* qinfo,
   3497 	struct regional* region, struct dns_msg* msg, struct auth_data* ce,
   3498 	struct auth_rrset* rrset, struct auth_data* node)
   3499 {
   3500 	struct auth_data* wildcard;
   3501 
   3502 	/* we do not have an exact matching name (that exists) */
   3503 	/* see if we have a NS or DNAME in the ce */
   3504 	if(ce && rrset && rrset->type == LDNS_RR_TYPE_NS) {
   3505 		return az_generate_referral_answer(z, region, msg, ce, rrset);
   3506 	}
   3507 	if(ce && rrset && rrset->type == LDNS_RR_TYPE_DNAME) {
   3508 		return az_generate_dname_answer(z, qinfo, region, msg, ce,
   3509 			rrset);
   3510 	}
   3511 	/* if there is an empty nonterminal, wildcard and nxdomain don't
   3512 	 * happen, it is a notype answer */
   3513 	if(az_empty_nonterminal(z, qinfo, node)) {
   3514 		return az_generate_notype_answer(z, region, msg, node);
   3515 	}
   3516 	/* see if we have a wildcard under the ce */
   3517 	if((wildcard=az_find_wildcard(z, qinfo, ce)) != NULL) {
   3518 		return az_generate_wildcard_answer(z, qinfo, region, msg,
   3519 			ce, wildcard, node);
   3520 	}
   3521 	/* generate nxdomain answer */
   3522 	return az_generate_nxdomain_answer(z, region, msg, ce, node);
   3523 }
   3524 
   3525 /** Lookup answer in a zone. */
   3526 static int
   3527 auth_zone_generate_answer(struct auth_zone* z, struct query_info* qinfo,
   3528 	struct regional* region, struct dns_msg** msg, int* fallback)
   3529 {
   3530 	struct auth_data* node, *ce;
   3531 	struct auth_rrset* rrset;
   3532 	int node_exact, node_exists;
   3533 	/* does the zone want fallback in case of failure? */
   3534 	*fallback = z->fallback_enabled;
   3535 	if(!(*msg=msg_create(region, qinfo))) return 0;
   3536 
   3537 	/* lookup if there is a matching domain name for the query */
   3538 	az_find_domain(z, qinfo, &node_exact, &node);
   3539 
   3540 	/* see if node exists for generating answers from (i.e. not glue and
   3541 	 * obscured by NS or DNAME or NSEC3-only), and also return the
   3542 	 * closest-encloser from that, closest node that should be used
   3543 	 * to generate answers from that is above the query */
   3544 	node_exists = az_find_ce(z, qinfo, node, node_exact, &ce, &rrset);
   3545 
   3546 	if(verbosity >= VERB_ALGO) {
   3547 		char zname[256], qname[256], nname[256], cename[256],
   3548 			tpstr[32], rrstr[32];
   3549 		sldns_wire2str_dname_buf(qinfo->qname, qinfo->qname_len, qname,
   3550 			sizeof(qname));
   3551 		sldns_wire2str_type_buf(qinfo->qtype, tpstr, sizeof(tpstr));
   3552 		sldns_wire2str_dname_buf(z->name, z->namelen, zname,
   3553 			sizeof(zname));
   3554 		if(node)
   3555 			sldns_wire2str_dname_buf(node->name, node->namelen,
   3556 				nname, sizeof(nname));
   3557 		else	snprintf(nname, sizeof(nname), "NULL");
   3558 		if(ce)
   3559 			sldns_wire2str_dname_buf(ce->name, ce->namelen,
   3560 				cename, sizeof(cename));
   3561 		else	snprintf(cename, sizeof(cename), "NULL");
   3562 		if(rrset) sldns_wire2str_type_buf(rrset->type, rrstr,
   3563 			sizeof(rrstr));
   3564 		else	snprintf(rrstr, sizeof(rrstr), "NULL");
   3565 		log_info("auth_zone %s query %s %s, domain %s %s %s, "
   3566 			"ce %s, rrset %s", zname, qname, tpstr, nname,
   3567 			(node_exact?"exact":"notexact"),
   3568 			(node_exists?"exist":"notexist"), cename, rrstr);
   3569 	}
   3570 
   3571 	if(node_exists) {
   3572 		/* the node is fine, generate answer from node */
   3573 		return az_generate_answer_with_node(z, qinfo, region, *msg,
   3574 			node);
   3575 	}
   3576 	return az_generate_answer_nonexistnode(z, qinfo, region, *msg,
   3577 		ce, rrset, node);
   3578 }
   3579 
   3580 int auth_zones_lookup(struct auth_zones* az, struct query_info* qinfo,
   3581 	struct regional* region, struct dns_msg** msg, int* fallback,
   3582 	uint8_t* dp_nm, size_t dp_nmlen)
   3583 {
   3584 	int r;
   3585 	struct auth_zone* z;
   3586 	/* find the zone that should contain the answer. */
   3587 	lock_rw_rdlock(&az->lock);
   3588 	z = auth_zone_find(az, dp_nm, dp_nmlen, qinfo->qclass);
   3589 	if(!z) {
   3590 		lock_rw_unlock(&az->lock);
   3591 		/* no auth zone, fallback to internet */
   3592 		*fallback = 1;
   3593 		return 0;
   3594 	}
   3595 	lock_rw_rdlock(&z->lock);
   3596 	lock_rw_unlock(&az->lock);
   3597 
   3598 	/* if not for upstream queries, fallback */
   3599 	if(!z->for_upstream) {
   3600 		lock_rw_unlock(&z->lock);
   3601 		*fallback = 1;
   3602 		return 0;
   3603 	}
   3604 	if(z->zone_expired || (z->zonemd_check && z->zonemd_callback_env)) {
   3605 		/* Do not serve from a zonemd-check zone while its ZONEMD
   3606 		 * verification is still pending: the content is not yet known
   3607 		 * to pass the configured check. The pending marker
   3608 		 * (zonemd_callback_env) is set under z->lock when the async
   3609 		 * lookup is spawned and cleared by the callback under z->lock,
   3610 		 * so this test is race-free. */
   3611 		*fallback = z->fallback_enabled;
   3612 		lock_rw_unlock(&z->lock);
   3613 		return 0;
   3614 	}
   3615 	/* see what answer that zone would generate */
   3616 	r = auth_zone_generate_answer(z, qinfo, region, msg, fallback);
   3617 	lock_rw_unlock(&z->lock);
   3618 	return r;
   3619 }
   3620 
   3621 /** encode auth answer */
   3622 static void
   3623 auth_answer_encode(struct query_info* qinfo, struct module_env* env,
   3624 	struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
   3625 	struct regional* temp, struct dns_msg* msg)
   3626 {
   3627 	uint16_t udpsize;
   3628 	udpsize = edns->udp_size;
   3629 	edns->edns_version = EDNS_ADVERTISED_VERSION;
   3630 	edns->udp_size = EDNS_ADVERTISED_SIZE;
   3631 	edns->ext_rcode = 0;
   3632 	edns->bits &= EDNS_DO;
   3633 
   3634 	if(!inplace_cb_reply_local_call(env, qinfo, NULL, msg->rep,
   3635 		(int)FLAGS_GET_RCODE(msg->rep->flags), edns, repinfo, temp, env->now_tv)
   3636 		|| !reply_info_answer_encode(qinfo, msg->rep,
   3637 		*(uint16_t*)sldns_buffer_begin(buf),
   3638 		sldns_buffer_read_u16_at(buf, 2),
   3639 		buf, 0, 0, temp, udpsize, edns,
   3640 		(int)(edns->bits&EDNS_DO), 0)) {
   3641 		error_encode(buf, (LDNS_RCODE_SERVFAIL|BIT_AA), qinfo,
   3642 			*(uint16_t*)sldns_buffer_begin(buf),
   3643 			sldns_buffer_read_u16_at(buf, 2), edns);
   3644 	}
   3645 }
   3646 
   3647 /** encode auth error answer */
   3648 static void
   3649 auth_error_encode(struct query_info* qinfo, struct module_env* env,
   3650 	struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
   3651 	struct regional* temp, int rcode)
   3652 {
   3653 	edns->edns_version = EDNS_ADVERTISED_VERSION;
   3654 	edns->udp_size = EDNS_ADVERTISED_SIZE;
   3655 	edns->ext_rcode = 0;
   3656 	edns->bits &= EDNS_DO;
   3657 
   3658 	if(!inplace_cb_reply_local_call(env, qinfo, NULL, NULL,
   3659 		rcode, edns, repinfo, temp, env->now_tv))
   3660 		edns->opt_list_inplace_cb_out = NULL;
   3661 	error_encode(buf, rcode|BIT_AA, qinfo,
   3662 		*(uint16_t*)sldns_buffer_begin(buf),
   3663 		sldns_buffer_read_u16_at(buf, 2), edns);
   3664 }
   3665 
   3666 int auth_zones_downstream_answer(struct auth_zones* az, struct module_env* env,
   3667 	struct query_info* qinfo, struct edns_data* edns,
   3668 	struct comm_reply* repinfo, struct sldns_buffer* buf,
   3669 	struct regional* temp)
   3670 {
   3671 	struct dns_msg* msg = NULL;
   3672 	struct auth_zone* z;
   3673 	int r;
   3674 	int fallback = 0;
   3675 	/* Copy the qinfo in case of cname aliasing from local-zone */
   3676 	struct query_info zqinfo = *qinfo;
   3677 
   3678 	lock_rw_rdlock(&az->lock);
   3679 	if(!az->have_downstream) {
   3680 		/* no downstream auth zones */
   3681 		lock_rw_unlock(&az->lock);
   3682 		return 0;
   3683 	}
   3684 
   3685 	if(qinfo->qtype == LDNS_RR_TYPE_DS) {
   3686 		uint8_t* delname = qinfo->qname;
   3687 		size_t delnamelen = qinfo->qname_len;
   3688 		dname_remove_label(&delname, &delnamelen);
   3689 		z = auth_zones_find_zone(az, delname, delnamelen,
   3690 			qinfo->qclass);
   3691 	} else {
   3692 		if(zqinfo.local_alias && !local_alias_shallow_copy_qname(
   3693 			zqinfo.local_alias, &zqinfo.qname,
   3694 			&zqinfo.qname_len)) {
   3695 			lock_rw_unlock(&az->lock);
   3696 			return 0;
   3697 		}
   3698 		z = auth_zones_find_zone(az, zqinfo.qname, zqinfo.qname_len,
   3699 			zqinfo.qclass);
   3700 	}
   3701 	if(!z) {
   3702 		/* no zone above it */
   3703 		lock_rw_unlock(&az->lock);
   3704 		return 0;
   3705 	}
   3706 	lock_rw_rdlock(&z->lock);
   3707 	lock_rw_unlock(&az->lock);
   3708 	if(!z->for_downstream) {
   3709 		lock_rw_unlock(&z->lock);
   3710 		return 0;
   3711 	}
   3712 	if(z->zone_expired || (z->zonemd_check && z->zonemd_callback_env)) {
   3713 		/* see auth_zones_lookup: a pending ZONEMD verification is
   3714 		 * treated like expiry - the zone content is not yet known
   3715 		 * to pass the configured check. */
   3716 		if(z->fallback_enabled) {
   3717 			lock_rw_unlock(&z->lock);
   3718 			return 0;
   3719 		}
   3720 		lock_rw_unlock(&z->lock);
   3721 		env->mesh->num_query_authzone_down++;
   3722 		auth_error_encode(qinfo, env, edns, repinfo, buf, temp,
   3723 			LDNS_RCODE_SERVFAIL);
   3724 		return 1;
   3725 	}
   3726 
   3727 	/* answer it from zone z */
   3728 	r = auth_zone_generate_answer(z, &zqinfo, temp, &msg, &fallback);
   3729 	lock_rw_unlock(&z->lock);
   3730 	if(!r && fallback) {
   3731 		/* fallback to regular answering (recursive) */
   3732 		return 0;
   3733 	}
   3734 	env->mesh->num_query_authzone_down++;
   3735 
   3736 	/* encode answer */
   3737 	if(!r)
   3738 		auth_error_encode(qinfo, env, edns, repinfo, buf, temp,
   3739 			LDNS_RCODE_SERVFAIL);
   3740 	else	auth_answer_encode(qinfo, env, edns, repinfo, buf, temp, msg);
   3741 
   3742 	return 1;
   3743 }
   3744 
   3745 int auth_zones_can_fallback(struct auth_zones* az, uint8_t* nm, size_t nmlen,
   3746 	uint16_t dclass)
   3747 {
   3748 	int r;
   3749 	struct auth_zone* z;
   3750 	lock_rw_rdlock(&az->lock);
   3751 	z = auth_zone_find(az, nm, nmlen, dclass);
   3752 	if(!z) {
   3753 		lock_rw_unlock(&az->lock);
   3754 		/* no such auth zone, fallback */
   3755 		return 1;
   3756 	}
   3757 	lock_rw_rdlock(&z->lock);
   3758 	lock_rw_unlock(&az->lock);
   3759 	r = z->fallback_enabled || (!z->for_upstream);
   3760 	lock_rw_unlock(&z->lock);
   3761 	return r;
   3762 }
   3763 
   3764 int
   3765 auth_zone_parse_notify_serial(sldns_buffer* pkt, uint32_t *serial)
   3766 {
   3767 	struct query_info q;
   3768 	uint16_t rdlen;
   3769 	memset(&q, 0, sizeof(q));
   3770 	sldns_buffer_set_position(pkt, 0);
   3771 	if(!query_info_parse(&q, pkt)) return 0;
   3772 	if(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) == 0) return 0;
   3773 	/* skip name of RR in answer section */
   3774 	if(sldns_buffer_remaining(pkt) < 1) return 0;
   3775 	if(pkt_dname_len(pkt) == 0) return 0;
   3776 	/* check type */
   3777 	if(sldns_buffer_remaining(pkt) < 10 /* type,class,ttl,rdatalen*/)
   3778 		return 0;
   3779 	if(sldns_buffer_read_u16(pkt) != LDNS_RR_TYPE_SOA) return 0;
   3780 	sldns_buffer_skip(pkt, 2); /* class */
   3781 	sldns_buffer_skip(pkt, 4); /* ttl */
   3782 	rdlen = sldns_buffer_read_u16(pkt); /* rdatalen */
   3783 	if(sldns_buffer_remaining(pkt) < rdlen) return 0;
   3784 	if(rdlen < 22) return 0; /* bad soa length */
   3785 	sldns_buffer_skip(pkt, (ssize_t)(rdlen-20));
   3786 	*serial = sldns_buffer_read_u32(pkt);
   3787 	/* return true when has serial in answer section */
   3788 	return 1;
   3789 }
   3790 
   3791 /** print addr to str, and if not 53, append "@port_number", for logs. */
   3792 static void addr_port_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
   3793 	char* buf, size_t len)
   3794 {
   3795 	uint16_t port = 0;
   3796 	if(addr_is_ip6(addr, addrlen)) {
   3797 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
   3798 		port = ntohs((uint16_t)sa->sin6_port);
   3799 	} else {
   3800 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
   3801 		port = ntohs((uint16_t)sa->sin_port);
   3802 	}
   3803 	if(port == UNBOUND_DNS_PORT) {
   3804 		/* If it is port 53, print it plainly. */
   3805 		addr_to_str(addr, addrlen, buf, len);
   3806 	} else {
   3807 		char a[256];
   3808 		a[0]=0;
   3809 		addr_to_str(addr, addrlen, a, sizeof(a));
   3810 		snprintf(buf, len, "%s@%d", a, (int)port);
   3811 	}
   3812 }
   3813 
   3814 /** see if addr appears in the list */
   3815 static int
   3816 addr_in_list(struct auth_addr* list, struct sockaddr_storage* addr,
   3817 	socklen_t addrlen)
   3818 {
   3819 	struct auth_addr* p;
   3820 	for(p=list; p; p=p->next) {
   3821 		if(sockaddr_cmp_addr(addr, addrlen, &p->addr, p->addrlen)==0)
   3822 			return 1;
   3823 	}
   3824 	return 0;
   3825 }
   3826 
   3827 /** check if an address matches a master specification (or one of its
   3828  * addresses in the addr list) */
   3829 static int
   3830 addr_matches_master(struct auth_master* master, struct sockaddr_storage* addr,
   3831 	socklen_t addrlen, struct auth_master** fromhost)
   3832 {
   3833 	struct sockaddr_storage a;
   3834 	socklen_t alen = 0;
   3835 	int net = 0;
   3836 	if(addr_in_list(master->list, addr, addrlen)) {
   3837 		*fromhost = master;
   3838 		return 1;
   3839 	}
   3840 	/* compare address (but not port number, that is the destination
   3841 	 * port of the master, the port number of the received notify is
   3842 	 * allowed to by any port on that master) */
   3843 	if(extstrtoaddr(master->host, &a, &alen, UNBOUND_DNS_PORT) &&
   3844 		sockaddr_cmp_addr(addr, addrlen, &a, alen)==0) {
   3845 		*fromhost = master;
   3846 		return 1;
   3847 	}
   3848 	/* prefixes, addr/len, like 10.0.0.0/8 */
   3849 	/* not http and has a / and there is one / */
   3850 	if(master->allow_notify && !master->http &&
   3851 		strchr(master->host, '/') != NULL &&
   3852 		strchr(master->host, '/') == strrchr(master->host, '/') &&
   3853 		netblockstrtoaddr(master->host, UNBOUND_DNS_PORT, &a, &alen,
   3854 		&net) && alen == addrlen) {
   3855 		if(addr_in_common(addr, (addr_is_ip6(addr, addrlen)?128:32),
   3856 			&a, net, alen) >= net) {
   3857 			*fromhost = NULL; /* prefix does not have destination
   3858 				to send the probe or transfer with */
   3859 			return 1; /* matches the netblock */
   3860 		}
   3861 	}
   3862 	return 0;
   3863 }
   3864 
   3865 /** check access list for notifies */
   3866 static int
   3867 az_xfr_allowed_notify(struct auth_xfer* xfr, struct sockaddr_storage* addr,
   3868 	socklen_t addrlen, struct auth_master** fromhost)
   3869 {
   3870 	struct auth_master* p;
   3871 	for(p=xfr->allow_notify_list; p; p=p->next) {
   3872 		if(addr_matches_master(p, addr, addrlen, fromhost)) {
   3873 			return 1;
   3874 		}
   3875 	}
   3876 	return 0;
   3877 }
   3878 
   3879 /** see if the serial means the zone has to be updated, i.e. the serial
   3880  * is newer than the zone serial, or we have no zone */
   3881 static int
   3882 xfr_serial_means_update(struct auth_xfer* xfr, uint32_t serial)
   3883 {
   3884 	if(!xfr->have_zone)
   3885 		return 1; /* no zone, anything is better */
   3886 	if(xfr->zone_expired)
   3887 		return 1; /* expired, the sent serial is better than expired
   3888 			data */
   3889 	if(compare_serial(xfr->serial, serial) < 0)
   3890 		return 1; /* our serial is smaller than the sent serial,
   3891 			the data is newer, fetch it */
   3892 	return 0;
   3893 }
   3894 
   3895 /** note notify serial, updates the notify information in the xfr struct */
   3896 static void
   3897 xfr_note_notify_serial(struct auth_xfer* xfr, int has_serial, uint32_t serial)
   3898 {
   3899 	if(xfr->notify_received && xfr->notify_has_serial && has_serial) {
   3900 		/* see if this serial is newer */
   3901 		if(compare_serial(xfr->notify_serial, serial) < 0)
   3902 			xfr->notify_serial = serial;
   3903 	} else if(xfr->notify_received && xfr->notify_has_serial &&
   3904 		!has_serial) {
   3905 		/* remove serial, we have notify without serial */
   3906 		xfr->notify_has_serial = 0;
   3907 		xfr->notify_serial = 0;
   3908 	} else if(xfr->notify_received && !xfr->notify_has_serial) {
   3909 		/* we already have notify without serial, keep it
   3910 		 * that way; no serial check when current operation
   3911 		 * is done */
   3912 	} else {
   3913 		xfr->notify_received = 1;
   3914 		xfr->notify_has_serial = has_serial;
   3915 		xfr->notify_serial = serial;
   3916 	}
   3917 }
   3918 
   3919 /** process a notify serial, start new probe or note serial. xfr is locked */
   3920 static void
   3921 xfr_process_notify(struct auth_xfer* xfr, struct module_env* env,
   3922 	int has_serial, uint32_t serial, struct auth_master* fromhost)
   3923 {
   3924 	/* if the serial of notify is older than we have, don't fetch
   3925 	 * a zone, we already have it */
   3926 	if(has_serial && !xfr_serial_means_update(xfr, serial)) {
   3927 		lock_basic_unlock(&xfr->lock);
   3928 		return;
   3929 	}
   3930 	/* start new probe with this addr src, or note serial */
   3931 	if(!xfr_start_probe(xfr, env, fromhost)) {
   3932 		/* not started because already in progress, note the serial */
   3933 		xfr_note_notify_serial(xfr, has_serial, serial);
   3934 		lock_basic_unlock(&xfr->lock);
   3935 	}
   3936 	/* successful end of start_probe unlocked xfr->lock */
   3937 }
   3938 
   3939 int auth_zones_notify(struct auth_zones* az, struct module_env* env,
   3940 	uint8_t* nm, size_t nmlen, uint16_t dclass,
   3941 	struct sockaddr_storage* addr, socklen_t addrlen, int has_serial,
   3942 	uint32_t serial, int* refused)
   3943 {
   3944 	struct auth_xfer* xfr;
   3945 	struct auth_master* fromhost = NULL;
   3946 	/* see which zone this is */
   3947 	lock_rw_rdlock(&az->lock);
   3948 	xfr = auth_xfer_find(az, nm, nmlen, dclass);
   3949 	if(!xfr) {
   3950 		lock_rw_unlock(&az->lock);
   3951 		/* no such zone, refuse the notify */
   3952 		*refused = 1;
   3953 		return 0;
   3954 	}
   3955 	lock_basic_lock(&xfr->lock);
   3956 	lock_rw_unlock(&az->lock);
   3957 
   3958 	/* check access list for notifies */
   3959 	if(!az_xfr_allowed_notify(xfr, addr, addrlen, &fromhost)) {
   3960 		lock_basic_unlock(&xfr->lock);
   3961 		/* notify not allowed, refuse the notify */
   3962 		*refused = 1;
   3963 		return 0;
   3964 	}
   3965 
   3966 	/* process the notify */
   3967 	xfr_process_notify(xfr, env, has_serial, serial, fromhost);
   3968 	return 1;
   3969 }
   3970 
   3971 int auth_zones_startprobesequence(struct auth_zones* az,
   3972 	struct module_env* env, uint8_t* nm, size_t nmlen, uint16_t dclass)
   3973 {
   3974 	struct auth_xfer* xfr;
   3975 	lock_rw_rdlock(&az->lock);
   3976 	xfr = auth_xfer_find(az, nm, nmlen, dclass);
   3977 	if(!xfr) {
   3978 		lock_rw_unlock(&az->lock);
   3979 		return 0;
   3980 	}
   3981 	lock_basic_lock(&xfr->lock);
   3982 	lock_rw_unlock(&az->lock);
   3983 
   3984 	xfr_process_notify(xfr, env, 0, 0, NULL);
   3985 	return 1;
   3986 }
   3987 
   3988 /** set a zone expired */
   3989 static void
   3990 auth_xfer_set_expired(struct auth_xfer* xfr, struct module_env* env,
   3991 	int expired)
   3992 {
   3993 	struct auth_zone* z;
   3994 
   3995 	/* expire xfr */
   3996 	lock_basic_lock(&xfr->lock);
   3997 	xfr->zone_expired = expired;
   3998 	lock_basic_unlock(&xfr->lock);
   3999 
   4000 	/* find auth_zone */
   4001 	lock_rw_rdlock(&env->auth_zones->lock);
   4002 	z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen,
   4003 		xfr->dclass);
   4004 	if(!z) {
   4005 		lock_rw_unlock(&env->auth_zones->lock);
   4006 		return;
   4007 	}
   4008 	lock_rw_wrlock(&z->lock);
   4009 	lock_rw_unlock(&env->auth_zones->lock);
   4010 
   4011 	/* expire auth_zone */
   4012 	z->zone_expired = expired;
   4013 	lock_rw_unlock(&z->lock);
   4014 }
   4015 
   4016 /** find master (from notify or probe) in list of masters */
   4017 static struct auth_master*
   4018 find_master_by_host(struct auth_master* list, char* host)
   4019 {
   4020 	struct auth_master* p;
   4021 	for(p=list; p; p=p->next) {
   4022 		if(strcmp(p->host, host) == 0)
   4023 			return p;
   4024 	}
   4025 	return NULL;
   4026 }
   4027 
   4028 /** delete the looked up auth_addrs for all the masters in the list */
   4029 static void
   4030 xfr_masterlist_free_addrs(struct auth_master* list)
   4031 {
   4032 	struct auth_master* m;
   4033 	for(m=list; m; m=m->next) {
   4034 		if(m->list) {
   4035 			auth_free_master_addrs(m->list);
   4036 			m->list = NULL;
   4037 		}
   4038 	}
   4039 }
   4040 
   4041 /** copy a list of auth_addrs */
   4042 static struct auth_addr*
   4043 auth_addr_list_copy(struct auth_addr* source)
   4044 {
   4045 	struct auth_addr* list = NULL, *last = NULL;
   4046 	struct auth_addr* p;
   4047 	for(p=source; p; p=p->next) {
   4048 		struct auth_addr* a = (struct auth_addr*)memdup(p, sizeof(*p));
   4049 		if(!a) {
   4050 			log_err("malloc failure");
   4051 			auth_free_master_addrs(list);
   4052 			return NULL;
   4053 		}
   4054 		a->next = NULL;
   4055 		if(last) last->next = a;
   4056 		if(!list) list = a;
   4057 		last = a;
   4058 	}
   4059 	return list;
   4060 }
   4061 
   4062 /** copy a master to a new structure, NULL on alloc failure */
   4063 static struct auth_master*
   4064 auth_master_copy(struct auth_master* o)
   4065 {
   4066 	struct auth_master* m;
   4067 	if(!o) return NULL;
   4068 	m = (struct auth_master*)memdup(o, sizeof(*o));
   4069 	if(!m) {
   4070 		log_err("malloc failure");
   4071 		return NULL;
   4072 	}
   4073 	m->next = NULL;
   4074 	if(m->host) {
   4075 		m->host = strdup(m->host);
   4076 		if(!m->host) {
   4077 			free(m);
   4078 			log_err("malloc failure");
   4079 			return NULL;
   4080 		}
   4081 	}
   4082 	if(m->file) {
   4083 		m->file = strdup(m->file);
   4084 		if(!m->file) {
   4085 			free(m->host);
   4086 			free(m);
   4087 			log_err("malloc failure");
   4088 			return NULL;
   4089 		}
   4090 	}
   4091 	if(m->list) {
   4092 		m->list = auth_addr_list_copy(m->list);
   4093 		if(!m->list) {
   4094 			free(m->file);
   4095 			free(m->host);
   4096 			free(m);
   4097 			return NULL;
   4098 		}
   4099 	}
   4100 	return m;
   4101 }
   4102 
   4103 /** append the master to the copied list. */
   4104 static int
   4105 auth_master_copy_and_append(struct auth_master* p, struct auth_master** list,
   4106 	struct auth_master** last)
   4107 {
   4108 	struct auth_master* m = auth_master_copy(p);
   4109 	if(!m) {
   4110 		return 0;
   4111 	}
   4112 	m->next = NULL;
   4113 	if(*last) (*last)->next = m;
   4114 	if(!*list) *list = m;
   4115 	*last = m;
   4116 	return 1;
   4117 }
   4118 
   4119 /** copy the master addresses from the task_probe lookups to the allow_notify
   4120  * list of masters */
   4121 static void
   4122 probe_copy_masters_for_allow_notify(struct auth_xfer* xfr)
   4123 {
   4124 	struct auth_master* list = NULL, *last = NULL;
   4125 	struct auth_master* p;
   4126 	/* build up new list with copies */
   4127 	/* The list in task probe has been looked up before the list in
   4128 	 * task transfer. */
   4129 	for(p = xfr->task_probe->masters; p; p=p->next) {
   4130 		if(!auth_master_copy_and_append(p, &list, &last)) {
   4131 			auth_free_masters(list);
   4132 			/* failed because of malloc failure, use old list */
   4133 			return;
   4134 		}
   4135 	}
   4136 	/* The list in task transfer also contains the http entries. */
   4137 	for(p = xfr->task_transfer->masters; p; p=p->next) {
   4138 		/* Copy the http entries from this lookup. The allow_notify
   4139 		 * entries are not looked up from this list. The other
   4140 		 * ones are already in from the probe lookups. */
   4141 		if(!p->http)
   4142 			continue;
   4143 		if(!auth_master_copy_and_append(p, &list, &last)) {
   4144 			auth_free_masters(list);
   4145 			/* failed because of malloc failure, use old list */
   4146 			return;
   4147 		}
   4148 	}
   4149 	/* success, replace list */
   4150 	auth_free_masters(xfr->allow_notify_list);
   4151 	xfr->allow_notify_list = list;
   4152 }
   4153 
   4154 /** start the lookups for task_transfer */
   4155 static void
   4156 xfr_transfer_start_lookups(struct auth_xfer* xfr)
   4157 {
   4158 	/* delete all the looked up addresses in the list */
   4159 	xfr->task_transfer->scan_addr = NULL;
   4160 	xfr_masterlist_free_addrs(xfr->task_transfer->masters);
   4161 
   4162 	/* start lookup at the first master */
   4163 	xfr->task_transfer->lookup_target = xfr->task_transfer->masters;
   4164 	xfr->task_transfer->lookup_aaaa = 0;
   4165 }
   4166 
   4167 /** move to the next lookup of hostname for task_transfer */
   4168 static void
   4169 xfr_transfer_move_to_next_lookup(struct auth_xfer* xfr, struct module_env* env)
   4170 {
   4171 	if(!xfr->task_transfer->lookup_target)
   4172 		return; /* already at end of list */
   4173 	if(!xfr->task_transfer->lookup_aaaa && env->cfg->do_ip6) {
   4174 		/* move to lookup AAAA */
   4175 		xfr->task_transfer->lookup_aaaa = 1;
   4176 		return;
   4177 	}
   4178 	xfr->task_transfer->lookup_target =
   4179 		xfr->task_transfer->lookup_target->next;
   4180 	xfr->task_transfer->lookup_aaaa = 0;
   4181 	if(!env->cfg->do_ip4 && xfr->task_transfer->lookup_target!=NULL)
   4182 		xfr->task_transfer->lookup_aaaa = 1;
   4183 }
   4184 
   4185 /** start the lookups for task_probe */
   4186 static void
   4187 xfr_probe_start_lookups(struct auth_xfer* xfr)
   4188 {
   4189 	/* delete all the looked up addresses in the list */
   4190 	xfr->task_probe->scan_addr = NULL;
   4191 	xfr_masterlist_free_addrs(xfr->task_probe->masters);
   4192 
   4193 	/* start lookup at the first master */
   4194 	xfr->task_probe->lookup_target = xfr->task_probe->masters;
   4195 	xfr->task_probe->lookup_aaaa = 0;
   4196 }
   4197 
   4198 /** move to the next lookup of hostname for task_probe */
   4199 static void
   4200 xfr_probe_move_to_next_lookup(struct auth_xfer* xfr, struct module_env* env)
   4201 {
   4202 	if(!xfr->task_probe->lookup_target)
   4203 		return; /* already at end of list */
   4204 	if(!xfr->task_probe->lookup_aaaa && env->cfg->do_ip6) {
   4205 		/* move to lookup AAAA */
   4206 		xfr->task_probe->lookup_aaaa = 1;
   4207 		return;
   4208 	}
   4209 	xfr->task_probe->lookup_target = xfr->task_probe->lookup_target->next;
   4210 	xfr->task_probe->lookup_aaaa = 0;
   4211 	if(!env->cfg->do_ip4 && xfr->task_probe->lookup_target!=NULL)
   4212 		xfr->task_probe->lookup_aaaa = 1;
   4213 }
   4214 
   4215 /** start the iteration of the task_transfer list of masters */
   4216 static void
   4217 xfr_transfer_start_list(struct auth_xfer* xfr, struct auth_master* spec)
   4218 {
   4219 	if(spec) {
   4220 		xfr->task_transfer->scan_specific = find_master_by_host(
   4221 			xfr->task_transfer->masters, spec->host);
   4222 		if(xfr->task_transfer->scan_specific) {
   4223 			xfr->task_transfer->scan_target = NULL;
   4224 			xfr->task_transfer->scan_addr = NULL;
   4225 			if(xfr->task_transfer->scan_specific->list)
   4226 				xfr->task_transfer->scan_addr =
   4227 					xfr->task_transfer->scan_specific->list;
   4228 			return;
   4229 		}
   4230 	}
   4231 	/* no specific (notified) host to scan */
   4232 	xfr->task_transfer->scan_specific = NULL;
   4233 	xfr->task_transfer->scan_addr = NULL;
   4234 	/* pick up first scan target */
   4235 	xfr->task_transfer->scan_target = xfr->task_transfer->masters;
   4236 	if(xfr->task_transfer->scan_target && xfr->task_transfer->
   4237 		scan_target->list)
   4238 		xfr->task_transfer->scan_addr =
   4239 			xfr->task_transfer->scan_target->list;
   4240 }
   4241 
   4242 /** start the iteration of the task_probe list of masters */
   4243 static void
   4244 xfr_probe_start_list(struct auth_xfer* xfr, struct auth_master* spec)
   4245 {
   4246 	if(spec) {
   4247 		xfr->task_probe->scan_specific = find_master_by_host(
   4248 			xfr->task_probe->masters, spec->host);
   4249 		if(xfr->task_probe->scan_specific) {
   4250 			xfr->task_probe->scan_target = NULL;
   4251 			xfr->task_probe->scan_addr = NULL;
   4252 			if(xfr->task_probe->scan_specific->list)
   4253 				xfr->task_probe->scan_addr =
   4254 					xfr->task_probe->scan_specific->list;
   4255 			return;
   4256 		}
   4257 	}
   4258 	/* no specific (notified) host to scan */
   4259 	xfr->task_probe->scan_specific = NULL;
   4260 	xfr->task_probe->scan_addr = NULL;
   4261 	/* pick up first scan target */
   4262 	xfr->task_probe->scan_target = xfr->task_probe->masters;
   4263 	if(xfr->task_probe->scan_target && xfr->task_probe->scan_target->list)
   4264 		xfr->task_probe->scan_addr =
   4265 			xfr->task_probe->scan_target->list;
   4266 }
   4267 
   4268 /** pick up the master that is being scanned right now, task_transfer */
   4269 static struct auth_master*
   4270 xfr_transfer_current_master(struct auth_xfer* xfr)
   4271 {
   4272 	if(xfr->task_transfer->scan_specific)
   4273 		return xfr->task_transfer->scan_specific;
   4274 	return xfr->task_transfer->scan_target;
   4275 }
   4276 
   4277 /** pick up the master that is being scanned right now, task_probe */
   4278 static struct auth_master*
   4279 xfr_probe_current_master(struct auth_xfer* xfr)
   4280 {
   4281 	if(xfr->task_probe->scan_specific)
   4282 		return xfr->task_probe->scan_specific;
   4283 	return xfr->task_probe->scan_target;
   4284 }
   4285 
   4286 /** true if at end of list, task_transfer */
   4287 static int
   4288 xfr_transfer_end_of_list(struct auth_xfer* xfr)
   4289 {
   4290 	return !xfr->task_transfer->scan_specific &&
   4291 		!xfr->task_transfer->scan_target;
   4292 }
   4293 
   4294 /** true if at end of list, task_probe */
   4295 static int
   4296 xfr_probe_end_of_list(struct auth_xfer* xfr)
   4297 {
   4298 	return !xfr->task_probe->scan_specific && !xfr->task_probe->scan_target;
   4299 }
   4300 
   4301 /** move to next master in list, task_transfer */
   4302 static void
   4303 xfr_transfer_nextmaster(struct auth_xfer* xfr)
   4304 {
   4305 	if(!xfr->task_transfer->scan_specific &&
   4306 		!xfr->task_transfer->scan_target)
   4307 		return;
   4308 	if(xfr->task_transfer->scan_addr) {
   4309 		xfr->task_transfer->scan_addr =
   4310 			xfr->task_transfer->scan_addr->next;
   4311 		if(xfr->task_transfer->scan_addr)
   4312 			return;
   4313 	}
   4314 	if(xfr->task_transfer->scan_specific) {
   4315 		xfr->task_transfer->scan_specific = NULL;
   4316 		xfr->task_transfer->scan_target = xfr->task_transfer->masters;
   4317 		if(xfr->task_transfer->scan_target && xfr->task_transfer->
   4318 			scan_target->list)
   4319 			xfr->task_transfer->scan_addr =
   4320 				xfr->task_transfer->scan_target->list;
   4321 		return;
   4322 	}
   4323 	if(!xfr->task_transfer->scan_target)
   4324 		return;
   4325 	xfr->task_transfer->scan_target = xfr->task_transfer->scan_target->next;
   4326 	if(xfr->task_transfer->scan_target && xfr->task_transfer->
   4327 		scan_target->list)
   4328 		xfr->task_transfer->scan_addr =
   4329 			xfr->task_transfer->scan_target->list;
   4330 	return;
   4331 }
   4332 
   4333 /** move to next master in list, task_probe */
   4334 static void
   4335 xfr_probe_nextmaster(struct auth_xfer* xfr)
   4336 {
   4337 	if(!xfr->task_probe->scan_specific && !xfr->task_probe->scan_target)
   4338 		return;
   4339 	if(xfr->task_probe->scan_addr) {
   4340 		xfr->task_probe->scan_addr = xfr->task_probe->scan_addr->next;
   4341 		if(xfr->task_probe->scan_addr)
   4342 			return;
   4343 	}
   4344 	if(xfr->task_probe->scan_specific) {
   4345 		xfr->task_probe->scan_specific = NULL;
   4346 		xfr->task_probe->scan_target = xfr->task_probe->masters;
   4347 		if(xfr->task_probe->scan_target && xfr->task_probe->
   4348 			scan_target->list)
   4349 			xfr->task_probe->scan_addr =
   4350 				xfr->task_probe->scan_target->list;
   4351 		return;
   4352 	}
   4353 	if(!xfr->task_probe->scan_target)
   4354 		return;
   4355 	xfr->task_probe->scan_target = xfr->task_probe->scan_target->next;
   4356 	if(xfr->task_probe->scan_target && xfr->task_probe->
   4357 		scan_target->list)
   4358 		xfr->task_probe->scan_addr =
   4359 			xfr->task_probe->scan_target->list;
   4360 	return;
   4361 }
   4362 
   4363 /** create SOA probe packet for xfr */
   4364 static void
   4365 xfr_create_soa_probe_packet(struct auth_xfer* xfr, sldns_buffer* buf,
   4366 	uint16_t id)
   4367 {
   4368 	struct query_info qinfo;
   4369 
   4370 	memset(&qinfo, 0, sizeof(qinfo));
   4371 	qinfo.qname = xfr->name;
   4372 	qinfo.qname_len = xfr->namelen;
   4373 	qinfo.qtype = LDNS_RR_TYPE_SOA;
   4374 	qinfo.qclass = xfr->dclass;
   4375 	qinfo_query_encode(buf, &qinfo);
   4376 	sldns_buffer_write_u16_at(buf, 0, id);
   4377 }
   4378 
   4379 /** create IXFR/AXFR packet for xfr */
   4380 static void
   4381 xfr_create_ixfr_packet(struct auth_xfer* xfr, sldns_buffer* buf, uint16_t id,
   4382 	struct auth_master* master)
   4383 {
   4384 	struct query_info qinfo;
   4385 	uint32_t serial;
   4386 	int have_zone, get_full = 0;
   4387 	have_zone = xfr->have_zone;
   4388 	serial = xfr->serial;
   4389 
   4390 	memset(&qinfo, 0, sizeof(qinfo));
   4391 	qinfo.qname = xfr->name;
   4392 	qinfo.qname_len = xfr->namelen;
   4393 	xfr->task_transfer->got_xfr_serial = 0;
   4394 	xfr->task_transfer->rr_scan_num = 0;
   4395 	xfr->task_transfer->incoming_xfr_serial = 0;
   4396 	xfr->task_transfer->on_ixfr_is_axfr = 0;
   4397 	xfr->task_transfer->on_ixfr = 1;
   4398 	qinfo.qtype = LDNS_RR_TYPE_IXFR;
   4399 	if(xfr->num_ixfrs >= NUM_IXFR_BEFORE_AXFR && xfr->is_rpz) {
   4400 		/* For the RPZ, an IXFR is going to grow regions, and a
   4401 		 * full transfer, zonefile read, AXFR and HTTP clear the
   4402 		 * region, but IXFR does not. That memory keeps growing,
   4403 		 * and getting a full transfer with AXFR here resets that.
   4404 		 * The rpz->client_set->region, rpz->ns_set->region and
   4405 		 * rpz->respip_set->region need to be reset, they are for
   4406 		 * rpz-client-ip, rpz-nsip and rpz-ip. */
   4407 		get_full = 1;
   4408 	}
   4409 	if(!have_zone || xfr->task_transfer->ixfr_fail || !master->ixfr
   4410 		|| get_full) {
   4411 		qinfo.qtype = LDNS_RR_TYPE_AXFR;
   4412 		xfr->task_transfer->ixfr_fail = 0;
   4413 		xfr->task_transfer->on_ixfr = 0;
   4414 	}
   4415 
   4416 	qinfo.qclass = xfr->dclass;
   4417 	qinfo_query_encode(buf, &qinfo);
   4418 	sldns_buffer_write_u16_at(buf, 0, id);
   4419 
   4420 	/* append serial for IXFR */
   4421 	if(qinfo.qtype == LDNS_RR_TYPE_IXFR) {
   4422 		size_t end = sldns_buffer_limit(buf);
   4423 		sldns_buffer_clear(buf);
   4424 		sldns_buffer_set_position(buf, end);
   4425 		/* auth section count 1 */
   4426 		sldns_buffer_write_u16_at(buf, LDNS_NSCOUNT_OFF, 1);
   4427 		/* write SOA */
   4428 		sldns_buffer_write_u8(buf, 0xC0); /* compressed ptr to qname */
   4429 		sldns_buffer_write_u8(buf, 0x0C);
   4430 		sldns_buffer_write_u16(buf, LDNS_RR_TYPE_SOA);
   4431 		sldns_buffer_write_u16(buf, qinfo.qclass);
   4432 		sldns_buffer_write_u32(buf, 0); /* ttl */
   4433 		sldns_buffer_write_u16(buf, 22); /* rdata length */
   4434 		sldns_buffer_write_u8(buf, 0); /* . */
   4435 		sldns_buffer_write_u8(buf, 0); /* . */
   4436 		sldns_buffer_write_u32(buf, serial); /* serial */
   4437 		sldns_buffer_write_u32(buf, 0); /* refresh */
   4438 		sldns_buffer_write_u32(buf, 0); /* retry */
   4439 		sldns_buffer_write_u32(buf, 0); /* expire */
   4440 		sldns_buffer_write_u32(buf, 0); /* minimum */
   4441 		sldns_buffer_flip(buf);
   4442 	}
   4443 }
   4444 
   4445 /** check if returned packet is OK */
   4446 static int
   4447 check_packet_ok(sldns_buffer* pkt, uint16_t qtype, struct auth_xfer* xfr,
   4448 	uint32_t* serial)
   4449 {
   4450 	/* parse to see if packet worked, valid reply */
   4451 
   4452 	/* check serial number of SOA */
   4453 	if(sldns_buffer_limit(pkt) < LDNS_HEADER_SIZE)
   4454 		return 0;
   4455 
   4456 	/* check ID */
   4457 	if(LDNS_ID_WIRE(sldns_buffer_begin(pkt)) != xfr->task_probe->id)
   4458 		return 0;
   4459 
   4460 	/* check flag bits and rcode */
   4461 	if(!LDNS_QR_WIRE(sldns_buffer_begin(pkt)))
   4462 		return 0;
   4463 	if(LDNS_OPCODE_WIRE(sldns_buffer_begin(pkt)) != LDNS_PACKET_QUERY)
   4464 		return 0;
   4465 	if(LDNS_RCODE_WIRE(sldns_buffer_begin(pkt)) != LDNS_RCODE_NOERROR)
   4466 		return 0;
   4467 
   4468 	/* check qname */
   4469 	if(LDNS_QDCOUNT(sldns_buffer_begin(pkt)) != 1)
   4470 		return 0;
   4471 	sldns_buffer_skip(pkt, LDNS_HEADER_SIZE);
   4472 	if(sldns_buffer_remaining(pkt) < xfr->namelen)
   4473 		return 0;
   4474 	if(query_dname_compare(sldns_buffer_current(pkt), xfr->name) != 0)
   4475 		return 0;
   4476 	sldns_buffer_skip(pkt, (ssize_t)xfr->namelen);
   4477 
   4478 	/* check qtype, qclass */
   4479 	if(sldns_buffer_remaining(pkt) < 4)
   4480 		return 0;
   4481 	if(sldns_buffer_read_u16(pkt) != qtype)
   4482 		return 0;
   4483 	if(sldns_buffer_read_u16(pkt) != xfr->dclass)
   4484 		return 0;
   4485 
   4486 	if(serial) {
   4487 		uint16_t rdlen;
   4488 		/* read serial number, from answer section SOA */
   4489 		if(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) == 0)
   4490 			return 0;
   4491 		/* read from first record SOA record */
   4492 		if(sldns_buffer_remaining(pkt) < 1)
   4493 			return 0;
   4494 		if(dname_pkt_compare(pkt, sldns_buffer_current(pkt),
   4495 			xfr->name) != 0)
   4496 			return 0;
   4497 		if(!pkt_dname_len(pkt))
   4498 			return 0;
   4499 		/* type, class, ttl, rdatalen */
   4500 		if(sldns_buffer_remaining(pkt) < 4+4+2)
   4501 			return 0;
   4502 		if(sldns_buffer_read_u16(pkt) != qtype)
   4503 			return 0;
   4504 		if(sldns_buffer_read_u16(pkt) != xfr->dclass)
   4505 			return 0;
   4506 		sldns_buffer_skip(pkt, 4); /* ttl */
   4507 		rdlen = sldns_buffer_read_u16(pkt);
   4508 		if(sldns_buffer_remaining(pkt) < rdlen)
   4509 			return 0;
   4510 		if(sldns_buffer_remaining(pkt) < 1)
   4511 			return 0;
   4512 		if(!pkt_dname_len(pkt)) /* soa name */
   4513 			return 0;
   4514 		if(sldns_buffer_remaining(pkt) < 1)
   4515 			return 0;
   4516 		if(!pkt_dname_len(pkt)) /* soa name */
   4517 			return 0;
   4518 		if(sldns_buffer_remaining(pkt) < 20)
   4519 			return 0;
   4520 		*serial = sldns_buffer_read_u32(pkt);
   4521 	}
   4522 	return 1;
   4523 }
   4524 
   4525 /** read one line from chunks into buffer at current position */
   4526 static int
   4527 chunkline_get_line(struct auth_chunk** chunk, size_t* chunk_pos,
   4528 	sldns_buffer* buf)
   4529 {
   4530 	int readsome = 0;
   4531 	while(*chunk) {
   4532 		/* more text in this chunk? */
   4533 		if(*chunk_pos < (*chunk)->len) {
   4534 			readsome = 1;
   4535 			while(*chunk_pos < (*chunk)->len) {
   4536 				char c = (char)((*chunk)->data[*chunk_pos]);
   4537 				(*chunk_pos)++;
   4538 				if(sldns_buffer_remaining(buf) < 2) {
   4539 					/* buffer too short */
   4540 					verbose(VERB_ALGO, "http chunkline, "
   4541 						"line too long");
   4542 					return 0;
   4543 				}
   4544 				sldns_buffer_write_u8(buf, (uint8_t)c);
   4545 				if(c == '\n') {
   4546 					/* we are done */
   4547 					return 1;
   4548 				}
   4549 			}
   4550 		}
   4551 		/* move to next chunk */
   4552 		*chunk = (*chunk)->next;
   4553 		*chunk_pos = 0;
   4554 	}
   4555 	/* no more text */
   4556 	if(readsome) return 1;
   4557 	return 0;
   4558 }
   4559 
   4560 /** count number of open and closed parenthesis in a chunkline */
   4561 int
   4562 chunkline_count_parens(sldns_buffer* buf, size_t start)
   4563 {
   4564 	size_t end = sldns_buffer_position(buf);
   4565 	size_t i;
   4566 	int count = 0;
   4567 	int dquote = 0;
   4568 	char prev_c = 0;
   4569 	for(i=start; i<end; i++) {
   4570 		char c = (char)sldns_buffer_read_u8_at(buf, i);
   4571 		if(dquote && !(c == '"' && prev_c != '\\')) {
   4572 			prev_c = (prev_c == '\\' && c == '\\') ? 0 : c;
   4573 			continue;
   4574 		}
   4575 		if(c == '"' && prev_c != '\\')
   4576 			dquote = !dquote; /* skip quoted part */
   4577 		else if(c == '(' && prev_c != '\\')
   4578 			count ++;
   4579 		else if(c == ')' && prev_c != '\\')
   4580 			count --;
   4581 		else if(c == ';' && prev_c != '\\') {
   4582 			/* rest is a comment */
   4583 			return count;
   4584 		}
   4585 		prev_c = (prev_c == '\\' && c == '\\') ? 0 : c;
   4586 	}
   4587 	return count;
   4588 }
   4589 
   4590 /** remove trailing ;... comment from a line in the chunkline buffer */
   4591 static void
   4592 chunkline_remove_trailcomment(sldns_buffer* buf, size_t start)
   4593 {
   4594 	size_t end = sldns_buffer_position(buf);
   4595 	size_t i;
   4596 	int dquote = 0;
   4597 	char prev_c = 0;
   4598 	for(i=start; i<end; i++) {
   4599 		char c = (char)sldns_buffer_read_u8_at(buf, i);
   4600 		if(dquote && !(c == '"' && prev_c != '\\')) {
   4601 			prev_c = (prev_c == '\\' && c == '\\') ? 0 : c;
   4602 			continue;
   4603 		}
   4604 		if(c == '"' && prev_c != '\\')
   4605 			dquote = !dquote; /* skip quoted part */
   4606 		else if(c == ';' && prev_c != '\\') {
   4607 			/* rest is a comment */
   4608 			sldns_buffer_set_position(buf, i);
   4609 			return;
   4610 		}
   4611 		prev_c = (prev_c == '\\' && c == '\\') ? 0 : c;
   4612 	}
   4613 	/* nothing to remove */
   4614 }
   4615 
   4616 /** see if a chunkline is a comment line (or empty line) */
   4617 static int
   4618 chunkline_is_comment_line_or_empty(sldns_buffer* buf)
   4619 {
   4620 	size_t i, end = sldns_buffer_limit(buf);
   4621 	for(i=0; i<end; i++) {
   4622 		char c = (char)sldns_buffer_read_u8_at(buf, i);
   4623 		if(c == ';')
   4624 			return 1; /* comment */
   4625 		else if(c != ' ' && c != '\t' && c != '\r' && c != '\n')
   4626 			return 0; /* not a comment */
   4627 	}
   4628 	return 1; /* empty */
   4629 }
   4630 
   4631 /** find a line with ( ) collated */
   4632 static int
   4633 chunkline_get_line_collated(struct auth_chunk** chunk, size_t* chunk_pos,
   4634 	sldns_buffer* buf)
   4635 {
   4636 	size_t pos;
   4637 	int parens = 0;
   4638 	sldns_buffer_clear(buf);
   4639 	pos = sldns_buffer_position(buf);
   4640 	if(!chunkline_get_line(chunk, chunk_pos, buf)) {
   4641 		if(sldns_buffer_position(buf) < sldns_buffer_limit(buf))
   4642 			sldns_buffer_write_u8_at(buf, sldns_buffer_position(buf), 0);
   4643 		else sldns_buffer_write_u8_at(buf, sldns_buffer_position(buf)-1, 0);
   4644 		sldns_buffer_flip(buf);
   4645 		return 0;
   4646 	}
   4647 	parens += chunkline_count_parens(buf, pos);
   4648 	while(parens > 0) {
   4649 		chunkline_remove_trailcomment(buf, pos);
   4650 		pos = sldns_buffer_position(buf);
   4651 		if(!chunkline_get_line(chunk, chunk_pos, buf)) {
   4652 			if(sldns_buffer_position(buf) < sldns_buffer_limit(buf))
   4653 				sldns_buffer_write_u8_at(buf, sldns_buffer_position(buf), 0);
   4654 			else sldns_buffer_write_u8_at(buf, sldns_buffer_position(buf)-1, 0);
   4655 			sldns_buffer_flip(buf);
   4656 			return 0;
   4657 		}
   4658 		parens += chunkline_count_parens(buf, pos);
   4659 	}
   4660 
   4661 	if(sldns_buffer_remaining(buf) < 1) {
   4662 		verbose(VERB_ALGO, "http chunkline: "
   4663 			"line too long");
   4664 		return 0;
   4665 	}
   4666 	sldns_buffer_write_u8_at(buf, sldns_buffer_position(buf), 0);
   4667 	sldns_buffer_flip(buf);
   4668 	return 1;
   4669 }
   4670 
   4671 /** process $ORIGIN for http, 0 nothing, 1 done, 2 error */
   4672 static int
   4673 http_parse_origin(sldns_buffer* buf, struct sldns_file_parse_state* pstate)
   4674 {
   4675 	char* line = (char*)sldns_buffer_begin(buf);
   4676 	if(strncmp(line, "$ORIGIN", 7) == 0 &&
   4677 		isspace((unsigned char)line[7])) {
   4678 		int s;
   4679 		pstate->origin_len = sizeof(pstate->origin);
   4680 		s = sldns_str2wire_dname_buf(sldns_strip_ws(line+8),
   4681 			pstate->origin, &pstate->origin_len);
   4682 		if(s) {
   4683 			pstate->origin_len = 0;
   4684 			return 2;
   4685 		}
   4686 		return 1;
   4687 	}
   4688 	return 0;
   4689 }
   4690 
   4691 /** process $TTL for http, 0 nothing, 1 done, 2 error */
   4692 static int
   4693 http_parse_ttl(sldns_buffer* buf, struct sldns_file_parse_state* pstate)
   4694 {
   4695 	char* line = (char*)sldns_buffer_begin(buf);
   4696 	if(strncmp(line, "$TTL", 4) == 0 &&
   4697 		isspace((unsigned char)line[4])) {
   4698 		const char* end = NULL;
   4699 		int overflow = 0;
   4700 		pstate->default_ttl = sldns_str2period(
   4701 			sldns_strip_ws(line+5), &end, &overflow);
   4702 		if(overflow) {
   4703 			return 2;
   4704 		}
   4705 		return 1;
   4706 	}
   4707 	return 0;
   4708 }
   4709 
   4710 /** remove newlines from collated line */
   4711 static void
   4712 chunkline_newline_removal(sldns_buffer* buf)
   4713 {
   4714 	size_t i, end=sldns_buffer_limit(buf);
   4715 	for(i=0; i<end; i++) {
   4716 		char c = (char)sldns_buffer_read_u8_at(buf, i);
   4717 		if(c == '\n' && i==end-1) {
   4718 			sldns_buffer_write_u8_at(buf, i, 0);
   4719 			sldns_buffer_set_limit(buf, end-1);
   4720 			return;
   4721 		}
   4722 		if(c == '\n')
   4723 			sldns_buffer_write_u8_at(buf, i, (uint8_t)' ');
   4724 	}
   4725 }
   4726 
   4727 /** find noncomment RR line in chunks, collates lines if ( ) format */
   4728 static int
   4729 chunkline_non_comment_RR(struct auth_chunk** chunk, size_t* chunk_pos,
   4730 	sldns_buffer* buf, struct sldns_file_parse_state* pstate)
   4731 {
   4732 	int ret;
   4733 	while(chunkline_get_line_collated(chunk, chunk_pos, buf)) {
   4734 		chunkline_newline_removal(buf);
   4735 		if(chunkline_is_comment_line_or_empty(buf)) {
   4736 			/* a comment, go to next line */
   4737 			continue;
   4738 		}
   4739 		if((ret=http_parse_origin(buf, pstate))!=0) {
   4740 			if(ret == 2)
   4741 				return 0;
   4742 			continue; /* $ORIGIN has been handled */
   4743 		}
   4744 		if((ret=http_parse_ttl(buf, pstate))!=0) {
   4745 			if(ret == 2)
   4746 				return 0;
   4747 			continue; /* $TTL has been handled */
   4748 		}
   4749 		return 1;
   4750 	}
   4751 	/* no noncomments, fail */
   4752 	return 0;
   4753 }
   4754 
   4755 /** check syntax of chunklist zonefile, parse first RR, return false on
   4756  * failure and return a string in the scratch buffer (first RR string)
   4757  * on failure. */
   4758 static int
   4759 http_zonefile_syntax_check(struct auth_xfer* xfr, sldns_buffer* buf)
   4760 {
   4761 	uint8_t rr[LDNS_RR_BUF_SIZE];
   4762 	size_t rr_len, dname_len = 0;
   4763 	struct sldns_file_parse_state pstate;
   4764 	struct auth_chunk* chunk;
   4765 	size_t chunk_pos;
   4766 	int e;
   4767 	memset(&pstate, 0, sizeof(pstate));
   4768 	pstate.default_ttl = 3600;
   4769 	if(xfr->namelen < sizeof(pstate.origin)) {
   4770 		pstate.origin_len = xfr->namelen;
   4771 		memmove(pstate.origin, xfr->name, xfr->namelen);
   4772 	}
   4773 	chunk = xfr->task_transfer->chunks_first;
   4774 	chunk_pos = 0;
   4775 	if(!chunkline_non_comment_RR(&chunk, &chunk_pos, buf, &pstate)) {
   4776 		return 0;
   4777 	}
   4778 	rr_len = sizeof(rr);
   4779 	e=sldns_str2wire_rr_buf((char*)sldns_buffer_begin(buf), rr, &rr_len,
   4780 		&dname_len, pstate.default_ttl,
   4781 		pstate.origin_len?pstate.origin:NULL, pstate.origin_len,
   4782 		pstate.prev_rr_len?pstate.prev_rr:NULL, pstate.prev_rr_len);
   4783 	if(e != 0) {
   4784 		log_err("parse failure on first RR[%d]: %s",
   4785 			LDNS_WIREPARSE_OFFSET(e),
   4786 			sldns_get_errorstr_parse(LDNS_WIREPARSE_ERROR(e)));
   4787 		return 0;
   4788 	}
   4789 	/* check that class is correct */
   4790 	if(sldns_wirerr_get_class(rr, rr_len, dname_len) != xfr->dclass) {
   4791 		log_err("parse failure: first record in downloaded zonefile "
   4792 			"from wrong RR class");
   4793 		return 0;
   4794 	}
   4795 	return 1;
   4796 }
   4797 
   4798 /** sum sizes of chunklist */
   4799 static size_t
   4800 chunklist_sum(struct auth_chunk* list)
   4801 {
   4802 	struct auth_chunk* p;
   4803 	size_t s = 0;
   4804 	for(p=list; p; p=p->next) {
   4805 		s += p->len;
   4806 	}
   4807 	return s;
   4808 }
   4809 
   4810 /** for http download, parse and add RR to zone */
   4811 static int
   4812 http_parse_add_rr(struct auth_xfer* xfr, struct auth_zone* z,
   4813 	sldns_buffer* buf, struct sldns_file_parse_state* pstate)
   4814 {
   4815 	uint8_t rr[LDNS_RR_BUF_SIZE];
   4816 	size_t rr_len, dname_len = 0;
   4817 	int e;
   4818 	char* line = (char*)sldns_buffer_begin(buf);
   4819 	rr_len = sizeof(rr);
   4820 	e = sldns_str2wire_rr_buf(line, rr, &rr_len, &dname_len,
   4821 		pstate->default_ttl,
   4822 		pstate->origin_len?pstate->origin:NULL, pstate->origin_len,
   4823 		pstate->prev_rr_len?pstate->prev_rr:NULL, pstate->prev_rr_len);
   4824 	if(e != 0) {
   4825 		log_err("%s/%s parse failure RR[%d]: %s in '%s'",
   4826 			xfr->task_transfer->master->host,
   4827 			xfr->task_transfer->master->file,
   4828 			LDNS_WIREPARSE_OFFSET(e),
   4829 			sldns_get_errorstr_parse(LDNS_WIREPARSE_ERROR(e)),
   4830 			line);
   4831 		return 0;
   4832 	}
   4833 	if(rr_len == 0)
   4834 		return 1; /* empty line or so */
   4835 
   4836 	/* set prev */
   4837 	if(dname_len < sizeof(pstate->prev_rr)) {
   4838 		memmove(pstate->prev_rr, rr, dname_len);
   4839 		pstate->prev_rr_len = dname_len;
   4840 	}
   4841 
   4842 	return az_insert_rr(z, rr, rr_len, dname_len, NULL);
   4843 }
   4844 
   4845 /** RR list iterator, returns RRs from answer section one by one from the
   4846  * dns packets in the chunklist */
   4847 static void
   4848 chunk_rrlist_start(struct auth_xfer* xfr, struct auth_chunk** rr_chunk,
   4849 	int* rr_num, size_t* rr_pos)
   4850 {
   4851 	*rr_chunk = xfr->task_transfer->chunks_first;
   4852 	*rr_num = 0;
   4853 	*rr_pos = 0;
   4854 }
   4855 
   4856 /** RR list iterator, see if we are at the end of the list */
   4857 static int
   4858 chunk_rrlist_end(struct auth_chunk* rr_chunk, int rr_num)
   4859 {
   4860 	while(rr_chunk) {
   4861 		if(rr_chunk->len < LDNS_HEADER_SIZE)
   4862 			return 1;
   4863 		if(rr_num < (int)LDNS_ANCOUNT(rr_chunk->data))
   4864 			return 0;
   4865 		/* no more RRs in this chunk */
   4866 		/* continue with next chunk, see if it has RRs */
   4867 		rr_chunk = rr_chunk->next;
   4868 		rr_num = 0;
   4869 	}
   4870 	return 1;
   4871 }
   4872 
   4873 /** RR list iterator, move to next RR */
   4874 static void
   4875 chunk_rrlist_gonext(struct auth_chunk** rr_chunk, int* rr_num,
   4876 	size_t* rr_pos, size_t rr_nextpos)
   4877 {
   4878 	/* already at end of chunks? */
   4879 	if(!*rr_chunk)
   4880 		return;
   4881 	/* move within this chunk */
   4882 	if((*rr_chunk)->len >= LDNS_HEADER_SIZE &&
   4883 		(*rr_num)+1 < (int)LDNS_ANCOUNT((*rr_chunk)->data)) {
   4884 		(*rr_num) += 1;
   4885 		*rr_pos = rr_nextpos;
   4886 		return;
   4887 	}
   4888 	/* no more RRs in this chunk */
   4889 	/* continue with next chunk, see if it has RRs */
   4890 	if(*rr_chunk)
   4891 		*rr_chunk = (*rr_chunk)->next;
   4892 	while(*rr_chunk) {
   4893 		*rr_num = 0;
   4894 		*rr_pos = 0;
   4895 		if((*rr_chunk)->len >= LDNS_HEADER_SIZE &&
   4896 			LDNS_ANCOUNT((*rr_chunk)->data) > 0) {
   4897 			return;
   4898 		}
   4899 		*rr_chunk = (*rr_chunk)->next;
   4900 	}
   4901 }
   4902 
   4903 /** RR iterator, get current RR information, false on parse error */
   4904 static int
   4905 chunk_rrlist_get_current(struct auth_chunk* rr_chunk, int rr_num,
   4906 	size_t rr_pos, uint8_t** rr_dname, uint16_t* rr_type,
   4907 	uint16_t* rr_class, uint32_t* rr_ttl, uint16_t* rr_rdlen,
   4908 	uint8_t** rr_rdata, size_t* rr_nextpos)
   4909 {
   4910 	sldns_buffer pkt;
   4911 	/* integrity checks on position */
   4912 	if(!rr_chunk) return 0;
   4913 	if(rr_chunk->len < LDNS_HEADER_SIZE) return 0;
   4914 	if(rr_num >= (int)LDNS_ANCOUNT(rr_chunk->data)) return 0;
   4915 	if(rr_pos >= rr_chunk->len) return 0;
   4916 
   4917 	/* fetch rr information */
   4918 	sldns_buffer_init_frm_data(&pkt, rr_chunk->data, rr_chunk->len);
   4919 	if(rr_pos == 0) {
   4920 		size_t i;
   4921 		/* skip question section */
   4922 		sldns_buffer_set_position(&pkt, LDNS_HEADER_SIZE);
   4923 		for(i=0; i<LDNS_QDCOUNT(rr_chunk->data); i++) {
   4924 			if(pkt_dname_len(&pkt) == 0) return 0;
   4925 			if(sldns_buffer_remaining(&pkt) < 4) return 0;
   4926 			sldns_buffer_skip(&pkt, 4); /* type and class */
   4927 		}
   4928 	} else	{
   4929 		sldns_buffer_set_position(&pkt, rr_pos);
   4930 	}
   4931 	*rr_dname = sldns_buffer_current(&pkt);
   4932 	if(pkt_dname_len(&pkt) == 0) return 0;
   4933 	if(sldns_buffer_remaining(&pkt) < 10) return 0;
   4934 	*rr_type = sldns_buffer_read_u16(&pkt);
   4935 	*rr_class = sldns_buffer_read_u16(&pkt);
   4936 	*rr_ttl = sldns_buffer_read_u32(&pkt);
   4937 	*rr_rdlen = sldns_buffer_read_u16(&pkt);
   4938 	if(sldns_buffer_remaining(&pkt) < (*rr_rdlen)) return 0;
   4939 	*rr_rdata = sldns_buffer_current(&pkt);
   4940 	sldns_buffer_skip(&pkt, (ssize_t)(*rr_rdlen));
   4941 	*rr_nextpos = sldns_buffer_position(&pkt);
   4942 	return 1;
   4943 }
   4944 
   4945 /** print log message where we are in parsing the zone transfer */
   4946 static void
   4947 log_rrlist_position(const char* label, struct auth_chunk* rr_chunk,
   4948 	uint8_t* rr_dname, uint16_t rr_type, size_t rr_counter)
   4949 {
   4950 	sldns_buffer pkt;
   4951 	size_t dlen;
   4952 	uint8_t buf[LDNS_MAX_DOMAINLEN];
   4953 	char str[LDNS_MAX_DOMAINLEN];
   4954 	char typestr[32];
   4955 	sldns_buffer_init_frm_data(&pkt, rr_chunk->data, rr_chunk->len);
   4956 	sldns_buffer_set_position(&pkt, (size_t)(rr_dname -
   4957 		sldns_buffer_begin(&pkt)));
   4958 	if((dlen=pkt_dname_len(&pkt)) == 0) return;
   4959 	if(dlen >= sizeof(buf)) return;
   4960 	dname_pkt_copy(&pkt, buf, rr_dname);
   4961 	dname_str(buf, str);
   4962 	(void)sldns_wire2str_type_buf(rr_type, typestr, sizeof(typestr));
   4963 	verbose(VERB_ALGO, "%s at[%d] %s %s", label, (int)rr_counter,
   4964 		str, typestr);
   4965 }
   4966 
   4967 /** check that start serial is OK for ixfr. we are at rr_counter == 0,
   4968  * and we are going to check rr_counter == 1 (has to be type SOA) serial */
   4969 static int
   4970 ixfr_start_serial(struct auth_chunk* rr_chunk, int rr_num, size_t rr_pos,
   4971 	uint8_t* rr_dname, uint16_t rr_type, uint16_t rr_class,
   4972 	uint32_t rr_ttl, uint16_t rr_rdlen, uint8_t* rr_rdata,
   4973 	size_t rr_nextpos, uint32_t transfer_serial, uint32_t xfr_serial)
   4974 {
   4975 	uint32_t startserial;
   4976 	/* move forward on RR */
   4977 	chunk_rrlist_gonext(&rr_chunk, &rr_num, &rr_pos, rr_nextpos);
   4978 	if(chunk_rrlist_end(rr_chunk, rr_num)) {
   4979 		/* no second SOA */
   4980 		verbose(VERB_OPS, "IXFR has no second SOA record");
   4981 		return 0;
   4982 	}
   4983 	if(!chunk_rrlist_get_current(rr_chunk, rr_num, rr_pos,
   4984 		&rr_dname, &rr_type, &rr_class, &rr_ttl, &rr_rdlen,
   4985 		&rr_rdata, &rr_nextpos)) {
   4986 		verbose(VERB_OPS, "IXFR cannot parse second SOA record");
   4987 		/* failed to parse RR */
   4988 		return 0;
   4989 	}
   4990 	if(rr_type != LDNS_RR_TYPE_SOA) {
   4991 		verbose(VERB_OPS, "IXFR second record is not type SOA");
   4992 		return 0;
   4993 	}
   4994 	if(rr_rdlen < 22) {
   4995 		verbose(VERB_OPS, "IXFR, second SOA has short rdlength");
   4996 		return 0; /* bad SOA rdlen */
   4997 	}
   4998 	startserial = sldns_read_uint32(rr_rdata+rr_rdlen-20);
   4999 	if(startserial == transfer_serial) {
   5000 		/* empty AXFR, not an IXFR */
   5001 		verbose(VERB_OPS, "IXFR second serial same as first");
   5002 		return 0;
   5003 	}
   5004 	if(startserial != xfr_serial) {
   5005 		/* wrong start serial, it does not match the serial in
   5006 		 * memory */
   5007 		verbose(VERB_OPS, "IXFR is from serial %u to %u but %u "
   5008 			"in memory, rejecting the zone transfer",
   5009 			(unsigned)startserial, (unsigned)transfer_serial,
   5010 			(unsigned)xfr_serial);
   5011 		return 0;
   5012 	}
   5013 	/* everything OK in second SOA serial */
   5014 	return 1;
   5015 }
   5016 
   5017 /** apply IXFR to zone in memory. z is locked. false on failure(mallocfail) */
   5018 static int
   5019 apply_ixfr(struct auth_xfer* xfr, struct auth_zone* z,
   5020 	struct sldns_buffer* scratch_buffer)
   5021 {
   5022 	struct auth_chunk* rr_chunk;
   5023 	int rr_num;
   5024 	size_t rr_pos;
   5025 	uint8_t* rr_dname, *rr_rdata;
   5026 	uint16_t rr_type, rr_class, rr_rdlen;
   5027 	uint32_t rr_ttl;
   5028 	size_t rr_nextpos;
   5029 	int have_transfer_serial = 0;
   5030 	uint32_t transfer_serial = 0;
   5031 	size_t rr_counter = 0;
   5032 	int delmode = 0;
   5033 	int softfail = 0;
   5034 
   5035 	xfr->num_ixfrs++;
   5036 
   5037 	/* start RR iterator over chunklist of packets */
   5038 	chunk_rrlist_start(xfr, &rr_chunk, &rr_num, &rr_pos);
   5039 	while(!chunk_rrlist_end(rr_chunk, rr_num)) {
   5040 		if(!chunk_rrlist_get_current(rr_chunk, rr_num, rr_pos,
   5041 			&rr_dname, &rr_type, &rr_class, &rr_ttl, &rr_rdlen,
   5042 			&rr_rdata, &rr_nextpos)) {
   5043 			/* failed to parse RR */
   5044 			return 0;
   5045 		}
   5046 		if(verbosity>=7) log_rrlist_position("apply ixfr",
   5047 			rr_chunk, rr_dname, rr_type, rr_counter);
   5048 		/* twiddle add/del mode and check for start and end */
   5049 		if(rr_counter == 0 && rr_type != LDNS_RR_TYPE_SOA)
   5050 			return 0;
   5051 		if(rr_counter == 1 && rr_type != LDNS_RR_TYPE_SOA) {
   5052 			/* this is an AXFR returned from the IXFR master */
   5053 			/* but that should already have been detected, by
   5054 			 * on_ixfr_is_axfr */
   5055 			return 0;
   5056 		}
   5057 		if(rr_type == LDNS_RR_TYPE_SOA) {
   5058 			uint32_t serial;
   5059 			if(rr_rdlen < 22) return 0; /* bad SOA rdlen */
   5060 			serial = sldns_read_uint32(rr_rdata+rr_rdlen-20);
   5061 			if(have_transfer_serial == 0) {
   5062 				have_transfer_serial = 1;
   5063 				transfer_serial = serial;
   5064 				delmode = 1; /* gets negated below */
   5065 				/* check second RR before going any further */
   5066 				if(!ixfr_start_serial(rr_chunk, rr_num, rr_pos,
   5067 					rr_dname, rr_type, rr_class, rr_ttl,
   5068 					rr_rdlen, rr_rdata, rr_nextpos,
   5069 					transfer_serial, xfr->serial)) {
   5070 					return 0;
   5071 				}
   5072 			} else if(transfer_serial == serial) {
   5073 				have_transfer_serial++;
   5074 				if(rr_counter == 1) {
   5075 					/* empty AXFR, with SOA; SOA; */
   5076 					/* should have been detected by
   5077 					 * on_ixfr_is_axfr */
   5078 					return 0;
   5079 				}
   5080 				if(have_transfer_serial == 3) {
   5081 					/* see serial three times for end */
   5082 					/* eg. IXFR:
   5083 					 *  SOA 3 start
   5084 					 *  SOA 1 second RR, followed by del
   5085 					 *  SOA 2 followed by add
   5086 					 *  SOA 2 followed by del
   5087 					 *  SOA 3 followed by add
   5088 					 *  SOA 3 end */
   5089 					/* ended by SOA record */
   5090 					xfr->serial = transfer_serial;
   5091 					break;
   5092 				}
   5093 			}
   5094 			/* twiddle add/del mode */
   5095 			/* switch from delete part to add part and back again
   5096 			 * just before the soa, it gets deleted and added too
   5097 			 * this means we switch to delete mode for the final
   5098 			 * SOA(so skip that one) */
   5099 			delmode = !delmode;
   5100 		}
   5101 		/* process this RR */
   5102 		/* if the RR is deleted twice or added twice, then we
   5103 		 * softfail, and continue with the rest of the IXFR, so
   5104 		 * that we serve something fairly nice during the refetch */
   5105 		if(verbosity>=7) log_rrlist_position((delmode?"del":"add"),
   5106 			rr_chunk, rr_dname, rr_type, rr_counter);
   5107 		if(delmode) {
   5108 			/* delete this RR */
   5109 			int nonexist = 0;
   5110 			if(!az_remove_rr_decompress(z, rr_chunk->data,
   5111 				rr_chunk->len, scratch_buffer, rr_dname,
   5112 				rr_type, rr_class, rr_ttl, rr_rdata, rr_rdlen,
   5113 				&nonexist)) {
   5114 				/* failed, malloc error or so */
   5115 				return 0;
   5116 			}
   5117 			if(nonexist) {
   5118 				/* it was removal of a nonexisting RR */
   5119 				if(verbosity>=4) log_rrlist_position(
   5120 					"IXFR error nonexistent RR",
   5121 					rr_chunk, rr_dname, rr_type, rr_counter);
   5122 				softfail = 1;
   5123 			}
   5124 		} else if(rr_counter != 0) {
   5125 			/* skip first SOA RR for addition, it is added in
   5126 			 * the addition part near the end of the ixfr, when
   5127 			 * that serial is seen the second time. */
   5128 			int duplicate = 0;
   5129 			/* add this RR */
   5130 			if(!az_insert_rr_decompress(z, rr_chunk->data,
   5131 				rr_chunk->len, scratch_buffer, rr_dname,
   5132 				rr_type, rr_class, rr_ttl, rr_rdata, rr_rdlen,
   5133 				&duplicate)) {
   5134 				/* failed, malloc error or so */
   5135 				return 0;
   5136 			}
   5137 			if(duplicate) {
   5138 				/* it was a duplicate */
   5139 				if(verbosity>=4) log_rrlist_position(
   5140 					"IXFR error duplicate RR",
   5141 					rr_chunk, rr_dname, rr_type, rr_counter);
   5142 				softfail = 1;
   5143 			}
   5144 		}
   5145 
   5146 		rr_counter++;
   5147 		chunk_rrlist_gonext(&rr_chunk, &rr_num, &rr_pos, rr_nextpos);
   5148 	}
   5149 	if(softfail) {
   5150 		verbose(VERB_ALGO, "IXFR did not apply cleanly, fetching full zone");
   5151 		return 0;
   5152 	}
   5153 	return 1;
   5154 }
   5155 
   5156 /** apply AXFR to zone in memory. z is locked. false on failure(mallocfail) */
   5157 static int
   5158 apply_axfr(struct auth_xfer* xfr, struct auth_zone* z,
   5159 	struct sldns_buffer* scratch_buffer)
   5160 {
   5161 	struct auth_chunk* rr_chunk;
   5162 	int rr_num;
   5163 	size_t rr_pos;
   5164 	uint8_t* rr_dname, *rr_rdata;
   5165 	uint16_t rr_type, rr_class, rr_rdlen;
   5166 	uint32_t rr_ttl;
   5167 	uint32_t serial = 0;
   5168 	size_t rr_nextpos;
   5169 	size_t rr_counter = 0;
   5170 	int have_end_soa = 0;
   5171 
   5172 	auth_zone_clear_data(z);
   5173 	xfr->have_zone = 0;
   5174 	xfr->serial = 0;
   5175 	xfr->soa_zone_acquired = 0;
   5176 	xfr->num_ixfrs = 0;
   5177 
   5178 	/* insert all RRs in to the zone */
   5179 	/* insert the SOA only once, skip the last one */
   5180 	/* start RR iterator over chunklist of packets */
   5181 	chunk_rrlist_start(xfr, &rr_chunk, &rr_num, &rr_pos);
   5182 	while(!chunk_rrlist_end(rr_chunk, rr_num)) {
   5183 		if(!chunk_rrlist_get_current(rr_chunk, rr_num, rr_pos,
   5184 			&rr_dname, &rr_type, &rr_class, &rr_ttl, &rr_rdlen,
   5185 			&rr_rdata, &rr_nextpos)) {
   5186 			/* failed to parse RR */
   5187 			return 0;
   5188 		}
   5189 		if(verbosity>=7) log_rrlist_position("apply_axfr",
   5190 			rr_chunk, rr_dname, rr_type, rr_counter);
   5191 		if(rr_type == LDNS_RR_TYPE_SOA) {
   5192 			if(rr_counter != 0) {
   5193 				/* end of the axfr */
   5194 				have_end_soa = 1;
   5195 				break;
   5196 			}
   5197 			if(rr_rdlen < 22) return 0; /* bad SOA rdlen */
   5198 			serial = sldns_read_uint32(rr_rdata+rr_rdlen-20);
   5199 		}
   5200 
   5201 		/* add this RR */
   5202 		if(!az_insert_rr_decompress(z, rr_chunk->data, rr_chunk->len,
   5203 			scratch_buffer, rr_dname, rr_type, rr_class, rr_ttl,
   5204 			rr_rdata, rr_rdlen, NULL)) {
   5205 			/* failed, malloc error or so */
   5206 			return 0;
   5207 		}
   5208 
   5209 		rr_counter++;
   5210 		chunk_rrlist_gonext(&rr_chunk, &rr_num, &rr_pos, rr_nextpos);
   5211 	}
   5212 	if(!have_end_soa) {
   5213 		log_err("no end SOA record for AXFR");
   5214 		return 0;
   5215 	}
   5216 
   5217 	xfr->serial = serial;
   5218 	xfr->have_zone = 1;
   5219 	return 1;
   5220 }
   5221 
   5222 /** apply HTTP to zone in memory. z is locked. false on failure(mallocfail) */
   5223 static int
   5224 apply_http(struct auth_xfer* xfr, struct auth_zone* z,
   5225 	struct sldns_buffer* scratch_buffer)
   5226 {
   5227 	/* parse data in chunks */
   5228 	/* parse RR's and read into memory. ignore $INCLUDE from the
   5229 	 * downloaded file*/
   5230 	struct sldns_file_parse_state pstate;
   5231 	struct auth_chunk* chunk;
   5232 	size_t chunk_pos;
   5233 	int ret;
   5234 	memset(&pstate, 0, sizeof(pstate));
   5235 	pstate.default_ttl = 3600;
   5236 	if(xfr->namelen < sizeof(pstate.origin)) {
   5237 		pstate.origin_len = xfr->namelen;
   5238 		memmove(pstate.origin, xfr->name, xfr->namelen);
   5239 	}
   5240 
   5241 	if(verbosity >= VERB_ALGO)
   5242 		verbose(VERB_ALGO, "http download %s of size %d",
   5243 		xfr->task_transfer->master->file,
   5244 		(int)chunklist_sum(xfr->task_transfer->chunks_first));
   5245 	if(xfr->task_transfer->chunks_first && verbosity >= VERB_ALGO) {
   5246 		char preview[1024];
   5247 		if(xfr->task_transfer->chunks_first->len+1 > sizeof(preview)) {
   5248 			memmove(preview, xfr->task_transfer->chunks_first->data,
   5249 				sizeof(preview)-1);
   5250 			preview[sizeof(preview)-1]=0;
   5251 		} else {
   5252 			memmove(preview, xfr->task_transfer->chunks_first->data,
   5253 				xfr->task_transfer->chunks_first->len);
   5254 			preview[xfr->task_transfer->chunks_first->len]=0;
   5255 		}
   5256 		log_info("auth zone http downloaded content preview: %s",
   5257 			preview);
   5258 	}
   5259 
   5260 	/* perhaps a little syntax check before we try to apply the data? */
   5261 	if(!http_zonefile_syntax_check(xfr, scratch_buffer)) {
   5262 		log_err("http download %s/%s does not contain a zonefile, "
   5263 			"but got '%s'", xfr->task_transfer->master->host,
   5264 			xfr->task_transfer->master->file,
   5265 			sldns_buffer_begin(scratch_buffer));
   5266 		return 0;
   5267 	}
   5268 
   5269 	auth_zone_clear_data(z);
   5270 	xfr->have_zone = 0;
   5271 	xfr->serial = 0;
   5272 	xfr->soa_zone_acquired = 0;
   5273 	xfr->num_ixfrs = 0;
   5274 
   5275 	chunk = xfr->task_transfer->chunks_first;
   5276 	chunk_pos = 0;
   5277 	pstate.lineno = 0;
   5278 	while(chunkline_get_line_collated(&chunk, &chunk_pos, scratch_buffer)) {
   5279 		/* process this line */
   5280 		pstate.lineno++;
   5281 		chunkline_newline_removal(scratch_buffer);
   5282 		if(chunkline_is_comment_line_or_empty(scratch_buffer)) {
   5283 			continue;
   5284 		}
   5285 		/* parse line and add RR */
   5286 		if((ret=http_parse_origin(scratch_buffer, &pstate))!=0) {
   5287 			if(ret == 2) {
   5288 				verbose(VERB_ALGO, "error parsing ORIGIN on line [%s:%d] %s",
   5289 					xfr->task_transfer->master->file,
   5290 					pstate.lineno,
   5291 					sldns_buffer_begin(scratch_buffer));
   5292 				return 0;
   5293 			}
   5294 			continue; /* $ORIGIN has been handled */
   5295 		}
   5296 		if((ret=http_parse_ttl(scratch_buffer, &pstate))!=0) {
   5297 			if(ret == 2) {
   5298 				verbose(VERB_ALGO, "error parsing TTL on line [%s:%d] %s",
   5299 					xfr->task_transfer->master->file,
   5300 					pstate.lineno,
   5301 					sldns_buffer_begin(scratch_buffer));
   5302 				return 0;
   5303 			}
   5304 			continue; /* $TTL has been handled */
   5305 		}
   5306 		if(!http_parse_add_rr(xfr, z, scratch_buffer, &pstate)) {
   5307 			verbose(VERB_ALGO, "error parsing line [%s:%d] %s",
   5308 				xfr->task_transfer->master->file,
   5309 				pstate.lineno,
   5310 				sldns_buffer_begin(scratch_buffer));
   5311 			return 0;
   5312 		}
   5313 	}
   5314 	return 1;
   5315 }
   5316 
   5317 /** write http chunks to zonefile to create downloaded file */
   5318 static int
   5319 auth_zone_write_chunks(struct auth_chunk* chunk_list, const char* fname)
   5320 {
   5321 	FILE* out;
   5322 	struct auth_chunk* p;
   5323 	out = fopen(fname, "w");
   5324 	if(!out) {
   5325 		log_err("could not open %s: %s", fname, strerror(errno));
   5326 		return 0;
   5327 	}
   5328 	for(p = chunk_list; p ; p = p->next) {
   5329 		if(!write_out(out, (char*)p->data, p->len)) {
   5330 			log_err("could not write http download to %s", fname);
   5331 			fclose(out);
   5332 			return 0;
   5333 		}
   5334 	}
   5335 	fclose(out);
   5336 	return 1;
   5337 }
   5338 
   5339 /** write to zonefile after zone has been updated, z has rdlock by caller. */
   5340 static void
   5341 zone_write_after_update(struct auth_zone* z, struct module_env* env,
   5342 	struct auth_chunk* chunk_list)
   5343 {
   5344 	struct config_file* cfg = env->cfg;
   5345 	char tmpfile[1024];
   5346 	char* zfilename;
   5347 
   5348 	if(z->zonefile == NULL || z->zonefile[0] == 0) {
   5349 		/* no write needed, no zonefile set */
   5350 		auth_chunk_list_delete(chunk_list);
   5351 		return;
   5352 	}
   5353 	zfilename = z->zonefile;
   5354 	if(cfg->chrootdir && cfg->chrootdir[0] && strncmp(zfilename,
   5355 		cfg->chrootdir, strlen(cfg->chrootdir)) == 0)
   5356 		zfilename += strlen(cfg->chrootdir);
   5357 	if(verbosity >= VERB_ALGO) {
   5358 		char nm[LDNS_MAX_DOMAINLEN];
   5359 		dname_str(z->name, nm);
   5360 		verbose(VERB_ALGO, "write zonefile %s for %s", zfilename, nm);
   5361 	}
   5362 
   5363 	/* write to tempfile first */
   5364 	if((size_t)strlen(zfilename) + 16 > sizeof(tmpfile)) {
   5365 		verbose(VERB_ALGO, "tmpfilename too long, cannot update "
   5366 			" zonefile %s", zfilename);
   5367 		auth_chunk_list_delete(chunk_list);
   5368 		return;
   5369 	}
   5370 	snprintf(tmpfile, sizeof(tmpfile), "%s.tmp%u", zfilename,
   5371 		(unsigned)getpid());
   5372 	if(chunk_list) {
   5373 		/* use the stored chunk list to write them */
   5374 		if(!auth_zone_write_chunks(chunk_list, tmpfile)) {
   5375 			unlink(tmpfile);
   5376 			auth_chunk_list_delete(chunk_list);
   5377 			return;
   5378 		}
   5379 		auth_chunk_list_delete(chunk_list);
   5380 	} else if(!auth_zone_write_file(z, tmpfile)) {
   5381 		unlink(tmpfile);
   5382 		return;
   5383 	}
   5384 #ifdef UB_ON_WINDOWS
   5385 	(void)unlink(zfilename); /* windows does not replace file with rename() */
   5386 #endif
   5387 	if(rename(tmpfile, zfilename) < 0) {
   5388 		log_err("could not rename(%s, %s): %s", tmpfile, zfilename,
   5389 			strerror(errno));
   5390 		unlink(tmpfile);
   5391 		return;
   5392 	}
   5393 }
   5394 
   5395 /** write to zonefile after zone has updated, reacquires z readlock. */
   5396 static void
   5397 zone_write_after_update_reacq(uint8_t* bakname, size_t baknamelen,
   5398 	uint16_t bakdclass, struct module_env* env,
   5399 	struct auth_chunk* chunk_list)
   5400 {
   5401 	struct auth_zone* z;
   5402 	/* get lock again, so it is a readlock and concurrently queries
   5403 	 * can be answered */
   5404 	lock_rw_rdlock(&env->auth_zones->lock);
   5405 	z = auth_zone_find(env->auth_zones, bakname, baknamelen, bakdclass);
   5406 	if(!z) {
   5407 		lock_rw_unlock(&env->auth_zones->lock);
   5408 		/* the zone is gone, ignore xfr results */
   5409 		return;
   5410 	}
   5411 	lock_rw_rdlock(&z->lock);
   5412 	lock_rw_unlock(&env->auth_zones->lock);
   5413 
   5414 	zone_write_after_update(z, env, chunk_list);
   5415 	lock_rw_unlock(&z->lock);
   5416 }
   5417 
   5418 /** write to zonefile after zone has been updated */
   5419 static void
   5420 xfr_write_after_update(struct auth_xfer* xfr, struct module_env* env,
   5421 	struct auth_chunk* chunk_list)
   5422 {
   5423 	struct auth_zone* z;
   5424 	lock_basic_unlock(&xfr->lock);
   5425 
   5426 	/* get lock again, so it is a readlock and concurrently queries
   5427 	 * can be answered */
   5428 	lock_rw_rdlock(&env->auth_zones->lock);
   5429 	z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen,
   5430 		xfr->dclass);
   5431 	if(!z) {
   5432 		lock_rw_unlock(&env->auth_zones->lock);
   5433 		/* the zone is gone, ignore xfr results */
   5434 		lock_basic_lock(&xfr->lock);
   5435 		return;
   5436 	}
   5437 	lock_rw_rdlock(&z->lock);
   5438 	lock_basic_lock(&xfr->lock);
   5439 	lock_rw_unlock(&env->auth_zones->lock);
   5440 
   5441 	zone_write_after_update(z, env, chunk_list);
   5442 	lock_rw_unlock(&z->lock);
   5443 }
   5444 
   5445 /** reacquire locks and structures. Starts with no locks, ends
   5446  * with xfr and z locks, if fail, no z lock */
   5447 static int xfr_process_reacquire_locks(struct auth_xfer* xfr,
   5448 	struct module_env* env, struct auth_zone** z)
   5449 {
   5450 	/* release xfr lock, then, while holding az->lock grab both
   5451 	 * z->lock and xfr->lock */
   5452 	lock_rw_rdlock(&env->auth_zones->lock);
   5453 	*z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen,
   5454 		xfr->dclass);
   5455 	if(!*z) {
   5456 		lock_rw_unlock(&env->auth_zones->lock);
   5457 		lock_basic_lock(&xfr->lock);
   5458 		*z = NULL;
   5459 		return 0;
   5460 	}
   5461 	lock_rw_wrlock(&(*z)->lock);
   5462 	lock_basic_lock(&xfr->lock);
   5463 	lock_rw_unlock(&env->auth_zones->lock);
   5464 	return 1;
   5465 }
   5466 
   5467 /** process chunk list and update zone in memory,
   5468  * return false if it did not work */
   5469 static int
   5470 xfr_process_chunk_list(struct auth_xfer* xfr, struct module_env* env,
   5471 	int* ixfr_fail)
   5472 {
   5473 	struct auth_zone* z;
   5474 	int zonemd_in_progress;
   5475 	struct auth_chunk* current_chunk_list = NULL;
   5476 
   5477 	/* obtain locks and structures */
   5478 	lock_basic_unlock(&xfr->lock);
   5479 	if(!xfr_process_reacquire_locks(xfr, env, &z)) {
   5480 		/* the zone is gone, ignore xfr results */
   5481 		return 0;
   5482 	}
   5483 	/* holding xfr and z locks */
   5484 
   5485 	/* apply data */
   5486 	if(xfr->task_transfer->master->http) {
   5487 		if(!apply_http(xfr, z, env->scratch_buffer)) {
   5488 			auth_zone_clear_data(z);
   5489 			lock_rw_unlock(&z->lock);
   5490 			verbose(VERB_ALGO, "http from %s: could not store data",
   5491 				xfr->task_transfer->master->host);
   5492 			return 0;
   5493 		}
   5494 	} else if(xfr->task_transfer->on_ixfr &&
   5495 		!xfr->task_transfer->on_ixfr_is_axfr) {
   5496 		if(!apply_ixfr(xfr, z, env->scratch_buffer)) {
   5497 			auth_zone_clear_data(z);
   5498 			lock_rw_unlock(&z->lock);
   5499 			verbose(VERB_ALGO, "xfr from %s: could not store IXFR"
   5500 				" data", xfr->task_transfer->master->host);
   5501 			*ixfr_fail = 1;
   5502 			return 0;
   5503 		}
   5504 	} else {
   5505 		if(!apply_axfr(xfr, z, env->scratch_buffer)) {
   5506 			auth_zone_clear_data(z);
   5507 			lock_rw_unlock(&z->lock);
   5508 			verbose(VERB_ALGO, "xfr from %s: could not store AXFR"
   5509 				" data", xfr->task_transfer->master->host);
   5510 			return 0;
   5511 		}
   5512 	}
   5513 	xfr->zone_expired = 0;
   5514 	z->zone_expired = 0;
   5515 	if(!xfr_find_soa(z, xfr)) {
   5516 		lock_rw_unlock(&z->lock);
   5517 		verbose(VERB_ALGO, "xfr from %s: no SOA in zone after update"
   5518 			" (or malformed RR)", xfr->task_transfer->master->host);
   5519 		return 0;
   5520 	}
   5521 	z->soa_zone_acquired = *env->now;
   5522 	xfr->soa_zone_acquired = *env->now;
   5523 	xfr->is_rpz = (z->rpz!=NULL);
   5524 
   5525 	/* release xfr lock while verifying zonemd because it may have
   5526 	 * to spawn lookups in the state machines */
   5527 	lock_basic_unlock(&xfr->lock);
   5528 	/* holding z lock */
   5529 	auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 0);
   5530 	if(z->zone_expired) {
   5531 		char zname[LDNS_MAX_DOMAINLEN];
   5532 		/* ZONEMD must have failed */
   5533 		/* reacquire locks, so we hold xfr lock on exit of routine,
   5534 		 * and both xfr and z again after releasing xfr for potential
   5535 		 * state machine mesh callbacks */
   5536 		lock_rw_unlock(&z->lock);
   5537 		if(!xfr_process_reacquire_locks(xfr, env, &z))
   5538 			return 0;
   5539 		dname_str(xfr->name, zname);
   5540 		verbose(VERB_ALGO, "xfr from %s: ZONEMD failed for %s, transfer is failed", xfr->task_transfer->master->host, zname);
   5541 		xfr->zone_expired = 1;
   5542 		lock_rw_unlock(&z->lock);
   5543 		return 0;
   5544 	}
   5545 	/* reacquire locks, so we hold xfr lock on exit of routine,
   5546 	 * and both xfr and z again after releasing xfr for potential
   5547 	 * state machine mesh callbacks */
   5548 	lock_rw_unlock(&z->lock);
   5549 	if(!xfr_process_reacquire_locks(xfr, env, &z))
   5550 		return 0;
   5551 	/* holding xfr and z locks */
   5552 
   5553 	if(xfr->have_zone)
   5554 		xfr->lease_time = *env->now;
   5555 
   5556 	if(z->rpz)
   5557 		rpz_finish_config(z->rpz);
   5558 
   5559 	if(z->zonemd_check && z->zonemd_callback_env) {
   5560 		zonemd_in_progress = 1;
   5561 		z->zonemd_callback_perform_write = 1;
   5562 		auth_chunk_list_delete(z->perform_write_chunk_list);
   5563 		z->perform_write_chunk_list = NULL;
   5564 		if(xfr->task_transfer->master->http) {
   5565 			z->perform_write_chunk_list = xfr->task_transfer->chunks_first;
   5566 			xfr->task_transfer->chunks_first = NULL;
   5567 			auth_chunks_delete(xfr->task_transfer);
   5568 		}
   5569 	} else {
   5570 		zonemd_in_progress = 0;
   5571 		z->zonemd_callback_perform_write = 0;
   5572 		if(xfr->task_transfer->master->http) {
   5573 			current_chunk_list = xfr->task_transfer->chunks_first;
   5574 			xfr->task_transfer->chunks_first = NULL;
   5575 			auth_chunks_delete(xfr->task_transfer);
   5576 		}
   5577 	}
   5578 	/* unlock */
   5579 	lock_rw_unlock(&z->lock);
   5580 
   5581 	if(verbosity >= VERB_QUERY && xfr->have_zone) {
   5582 		char zname[LDNS_MAX_DOMAINLEN];
   5583 		dname_str(xfr->name, zname);
   5584 		verbose(VERB_QUERY, "auth zone %s updated to serial %u", zname,
   5585 			(unsigned)xfr->serial);
   5586 	}
   5587 	/* see if we need to write to a zonefile */
   5588 	if(!zonemd_in_progress) {
   5589 		xfr_write_after_update(xfr, env, current_chunk_list);
   5590 	}
   5591 	return 1;
   5592 }
   5593 
   5594 /** Stop lookup using callback */
   5595 static void
   5596 xfr_stop_lookup(struct auth_master** lookup_target, void* lookup_unique_info,
   5597 	int lookup_aaaa, uint16_t dclass, struct mesh_area* mesh,
   5598 	mesh_cb_func_type cb, void* cb_arg)
   5599 {
   5600 	struct query_info qinfo;
   5601 	uint8_t dname[LDNS_MAX_DOMAINLEN+1];
   5602 	if(!*lookup_target) return;
   5603 	qinfo.qname_len = sizeof(dname);
   5604 	if(sldns_str2wire_dname_buf((*lookup_target)->host, dname,
   5605 		&qinfo.qname_len) != 0) {
   5606 		*lookup_target = NULL;
   5607 		return;
   5608 	}
   5609 	qinfo.qname = dname;
   5610 	qinfo.qclass = dclass;
   5611 	qinfo.qtype = lookup_aaaa ? LDNS_RR_TYPE_AAAA : LDNS_RR_TYPE_A;
   5612 	qinfo.local_alias = NULL;
   5613 	log_query_info(VERB_ALGO, "removing xfr callback", &qinfo);
   5614 
   5615 	mesh_remove_callback(mesh, &qinfo, BIT_RD, cb, cb_arg,
   5616 		lookup_unique_info);
   5617 	*lookup_target = NULL;
   5618 }
   5619 
   5620 /** disown task_transfer.  caller must hold xfr.lock */
   5621 static void
   5622 xfr_transfer_disown(struct auth_xfer* xfr)
   5623 {
   5624 	/* remove data chunks */
   5625 	auth_chunks_delete(xfr->task_transfer);
   5626 	/* remove timer (from this worker's event base) */
   5627 	comm_timer_delete(xfr->task_transfer->timer);
   5628 	xfr->task_transfer->timer = NULL;
   5629 	/* remove the commpoint */
   5630 	comm_point_delete(xfr->task_transfer->cp);
   5631 	xfr->task_transfer->cp = NULL;
   5632 	if(xfr->task_transfer->env)
   5633 		xfr_stop_lookup(&xfr->task_transfer->lookup_target,
   5634 			xfr->task_transfer->lookup_unique_info,
   5635 			xfr->task_transfer->lookup_aaaa, xfr->dclass,
   5636 			xfr->task_transfer->env->mesh,
   5637 			&auth_xfer_transfer_lookup_callback, xfr);
   5638 	/* we don't own this item anymore */
   5639 	xfr->task_transfer->worker = NULL;
   5640 	xfr->task_transfer->env = NULL;
   5641 }
   5642 
   5643 /** lookup a host name for its addresses, if needed */
   5644 static int
   5645 xfr_transfer_lookup_host(struct auth_xfer* xfr, struct module_env* env)
   5646 {
   5647 	struct sockaddr_storage addr;
   5648 	socklen_t addrlen = 0;
   5649 	struct auth_master* master = xfr->task_transfer->lookup_target;
   5650 	struct query_info qinfo;
   5651 	uint16_t qflags = BIT_RD;
   5652 	uint8_t dname[LDNS_MAX_DOMAINLEN+1];
   5653 	struct edns_data edns;
   5654 	sldns_buffer* buf = env->scratch_buffer;
   5655 	if(!master) return 0;
   5656 	if(extstrtoaddr(master->host, &addr, &addrlen, UNBOUND_DNS_PORT)) {
   5657 		/* not needed, host is in IP addr format */
   5658 		return 0;
   5659 	}
   5660 	if(master->allow_notify)
   5661 		return 0; /* allow-notifies are not transferred from, no
   5662 		lookup is needed */
   5663 
   5664 	/* use mesh_new_callback to probe for non-addr hosts,
   5665 	 * and then wait for them to be looked up (in cache, or query) */
   5666 	qinfo.qname_len = sizeof(dname);
   5667 	if(sldns_str2wire_dname_buf(master->host, dname, &qinfo.qname_len)
   5668 		!= 0) {
   5669 		log_err("cannot parse host name of master %s", master->host);
   5670 		return 0;
   5671 	}
   5672 	qinfo.qname = dname;
   5673 	qinfo.qclass = xfr->dclass;
   5674 	qinfo.qtype = LDNS_RR_TYPE_A;
   5675 	if(xfr->task_transfer->lookup_aaaa)
   5676 		qinfo.qtype = LDNS_RR_TYPE_AAAA;
   5677 	qinfo.local_alias = NULL;
   5678 	if(verbosity >= VERB_ALGO) {
   5679 		char buf1[512];
   5680 		char buf2[LDNS_MAX_DOMAINLEN];
   5681 		dname_str(xfr->name, buf2);
   5682 		snprintf(buf1, sizeof(buf1), "auth zone %s: master lookup"
   5683 			" for task_transfer", buf2);
   5684 		log_query_info(VERB_ALGO, buf1, &qinfo);
   5685 	}
   5686 	edns.edns_present = 1;
   5687 	edns.ext_rcode = 0;
   5688 	edns.edns_version = 0;
   5689 	edns.bits = EDNS_DO;
   5690 	edns.opt_list_in = NULL;
   5691 	edns.opt_list_out = NULL;
   5692 	edns.opt_list_inplace_cb_out = NULL;
   5693 	edns.padding_block_size = 0;
   5694 	edns.cookie_present = 0;
   5695 	edns.cookie_valid = 0;
   5696 	if(sldns_buffer_capacity(buf) < 65535)
   5697 		edns.udp_size = (uint16_t)sldns_buffer_capacity(buf);
   5698 	else	edns.udp_size = 65535;
   5699 
   5700 	/* unlock xfr during mesh_new_callback() because the callback can be
   5701 	 * called straight away */
   5702 	lock_basic_unlock(&xfr->lock);
   5703 	if(!mesh_new_callback(env->mesh, &qinfo, qflags, &edns, buf, 0,
   5704 		&auth_xfer_transfer_lookup_callback, xfr, 0,
   5705 		&xfr->task_transfer->lookup_unique_info)) {
   5706 		lock_basic_lock(&xfr->lock);
   5707 		log_err("out of memory lookup up master %s", master->host);
   5708 		return 0;
   5709 	}
   5710 	lock_basic_lock(&xfr->lock);
   5711 	return 1;
   5712 }
   5713 
   5714 /** initiate TCP to the target and fetch zone.
   5715  * returns true if that was successfully started, and timeout setup. */
   5716 static int
   5717 xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env)
   5718 {
   5719 	struct sockaddr_storage addr;
   5720 	socklen_t addrlen = 0;
   5721 	struct auth_master* master = xfr->task_transfer->master;
   5722 	char *auth_name = NULL;
   5723 	struct timeval t;
   5724 	int timeout;
   5725 	if(!master) return 0;
   5726 	if(master->allow_notify) return 0; /* only for notify */
   5727 
   5728 	/* get master addr */
   5729 	if(xfr->task_transfer->scan_addr) {
   5730 		addrlen = xfr->task_transfer->scan_addr->addrlen;
   5731 		memmove(&addr, &xfr->task_transfer->scan_addr->addr, addrlen);
   5732 	} else {
   5733 		if(!authextstrtoaddr(master->host, &addr, &addrlen, &auth_name)) {
   5734 			/* the ones that are not in addr format are supposed
   5735 			 * to be looked up.  The lookup has failed however,
   5736 			 * so skip them */
   5737 			char zname[LDNS_MAX_DOMAINLEN];
   5738 			dname_str(xfr->name, zname);
   5739 			log_err("%s: failed lookup, cannot transfer from master %s",
   5740 				zname, master->host);
   5741 			return 0;
   5742 		}
   5743 	}
   5744 
   5745 	/* remove previous TCP connection (if any) */
   5746 	if(xfr->task_transfer->cp) {
   5747 		comm_point_delete(xfr->task_transfer->cp);
   5748 		xfr->task_transfer->cp = NULL;
   5749 	}
   5750 	if(!xfr->task_transfer->timer) {
   5751 		xfr->task_transfer->timer = comm_timer_create(env->worker_base,
   5752 			auth_xfer_transfer_timer_callback, xfr);
   5753 		if(!xfr->task_transfer->timer) {
   5754 			log_err("malloc failure");
   5755 			return 0;
   5756 		}
   5757 	}
   5758 	timeout = AUTH_TRANSFER_TIMEOUT;
   5759 #ifndef S_SPLINT_S
   5760         t.tv_sec = timeout/1000;
   5761         t.tv_usec = (timeout%1000)*1000;
   5762 #endif
   5763 	xfr->task_transfer->start_time = *env->now_tv;
   5764 
   5765 	if(master->http) {
   5766 		/* perform http fetch */
   5767 		/* store http port number into sockaddr,
   5768 		 * unless someone used unbound's host@port notation */
   5769 		xfr->task_transfer->on_ixfr = 0;
   5770 		if(strchr(master->host, '@') == NULL)
   5771 			sockaddr_store_port(&addr, addrlen, master->port);
   5772 		xfr->task_transfer->cp = outnet_comm_point_for_http(
   5773 			env->outnet, auth_xfer_transfer_http_callback, xfr,
   5774 			&addr, addrlen, -1, master->ssl, master->host,
   5775 			master->file, env->cfg);
   5776 		if(!xfr->task_transfer->cp) {
   5777 			char zname[LDNS_MAX_DOMAINLEN], as[256];
   5778 			dname_str(xfr->name, zname);
   5779 			addr_port_to_str(&addr, addrlen, as, sizeof(as));
   5780 			verbose(VERB_ALGO, "cannot create http cp "
   5781 				"connection for %s to %s", zname, as);
   5782 			return 0;
   5783 		}
   5784 		comm_timer_set(xfr->task_transfer->timer, &t);
   5785 		if(verbosity >= VERB_ALGO) {
   5786 			char zname[LDNS_MAX_DOMAINLEN], as[256];
   5787 			dname_str(xfr->name, zname);
   5788 			addr_port_to_str(&addr, addrlen, as, sizeof(as));
   5789 			verbose(VERB_ALGO, "auth zone %s transfer next HTTP fetch from %s started", zname, as);
   5790 		}
   5791 		/* Create or refresh the list of allow_notify addrs */
   5792 		probe_copy_masters_for_allow_notify(xfr);
   5793 		return 1;
   5794 	}
   5795 
   5796 	/* perform AXFR/IXFR */
   5797 	/* set the packet to be written */
   5798 	/* create new ID */
   5799 	xfr->task_transfer->id = GET_RANDOM_ID(env->rnd);
   5800 	xfr_create_ixfr_packet(xfr, env->scratch_buffer,
   5801 		xfr->task_transfer->id, master);
   5802 
   5803 	/* connect on fd */
   5804 	xfr->task_transfer->cp = outnet_comm_point_for_tcp(env->outnet,
   5805 		auth_xfer_transfer_tcp_callback, xfr, &addr, addrlen,
   5806 		env->scratch_buffer, -1,
   5807 		auth_name != NULL, auth_name);
   5808 	if(!xfr->task_transfer->cp) {
   5809 		char zname[LDNS_MAX_DOMAINLEN], as[256];
   5810  		dname_str(xfr->name, zname);
   5811 		addr_port_to_str(&addr, addrlen, as, sizeof(as));
   5812 		verbose(VERB_ALGO, "cannot create tcp cp connection for "
   5813 			"xfr %s to %s", zname, as);
   5814 		return 0;
   5815 	}
   5816 	comm_timer_set(xfr->task_transfer->timer, &t);
   5817 	if(verbosity >= VERB_ALGO) {
   5818 		char zname[LDNS_MAX_DOMAINLEN], as[256];
   5819  		dname_str(xfr->name, zname);
   5820 		addr_port_to_str(&addr, addrlen, as, sizeof(as));
   5821 		verbose(VERB_ALGO, "auth zone %s transfer next %s fetch from %s started", zname,
   5822 			(xfr->task_transfer->on_ixfr?"IXFR":"AXFR"), as);
   5823 	}
   5824 	return 1;
   5825 }
   5826 
   5827 /** perform next lookup, next transfer TCP, or end and resume wait time task */
   5828 static void
   5829 xfr_transfer_nexttarget_or_end(struct auth_xfer* xfr, struct module_env* env)
   5830 {
   5831 	log_assert(xfr->task_transfer->worker == env->worker);
   5832 
   5833 	/* are we performing lookups? */
   5834 	while(xfr->task_transfer->lookup_target) {
   5835 		if(xfr_transfer_lookup_host(xfr, env)) {
   5836 			/* wait for lookup to finish,
   5837 			 * note that the hostname may be in unbound's cache
   5838 			 * and we may then get an instant cache response,
   5839 			 * and that calls the callback just like a full
   5840 			 * lookup and lookup failures also call callback */
   5841 			if(verbosity >= VERB_ALGO) {
   5842 				char zname[LDNS_MAX_DOMAINLEN];
   5843 				dname_str(xfr->name, zname);
   5844 				verbose(VERB_ALGO, "auth zone %s transfer next target lookup", zname);
   5845 			}
   5846 			lock_basic_unlock(&xfr->lock);
   5847 			return;
   5848 		}
   5849 		xfr_transfer_move_to_next_lookup(xfr, env);
   5850 	}
   5851 
   5852 	/* initiate TCP and fetch the zone from the master */
   5853 	/* and set timeout on it */
   5854 	while(!xfr_transfer_end_of_list(xfr)) {
   5855 		xfr->task_transfer->master = xfr_transfer_current_master(xfr);
   5856 		if(xfr_transfer_init_fetch(xfr, env)) {
   5857 			/* successfully started, wait for callback */
   5858 			lock_basic_unlock(&xfr->lock);
   5859 			return;
   5860 		}
   5861 		/* failed to fetch, next master */
   5862 		xfr_transfer_nextmaster(xfr);
   5863 	}
   5864 	if(verbosity >= VERB_ALGO) {
   5865 		char zname[LDNS_MAX_DOMAINLEN];
   5866 		dname_str(xfr->name, zname);
   5867 		verbose(VERB_ALGO, "auth zone %s transfer failed, wait", zname);
   5868 	}
   5869 
   5870 	/* we failed to fetch the zone, move to wait task
   5871 	 * use the shorter retry timeout */
   5872 	xfr_transfer_disown(xfr);
   5873 
   5874 	/* pick up the nextprobe task and wait */
   5875 	if(xfr->task_nextprobe->worker == NULL)
   5876 		xfr_set_timeout(xfr, env, 1, 0);
   5877 	lock_basic_unlock(&xfr->lock);
   5878 }
   5879 
   5880 /** add addrs from A or AAAA rrset to the master */
   5881 static void
   5882 xfr_master_add_addrs(struct auth_master* m, struct ub_packed_rrset_key* rrset,
   5883 	uint16_t rrtype)
   5884 {
   5885 	size_t i;
   5886 	struct packed_rrset_data* data;
   5887 	if(!m || !rrset) return;
   5888 	if(rrtype != LDNS_RR_TYPE_A && rrtype != LDNS_RR_TYPE_AAAA)
   5889 		return;
   5890 	data = (struct packed_rrset_data*)rrset->entry.data;
   5891 	for(i=0; i<data->count; i++) {
   5892 		struct auth_addr* a;
   5893 		size_t len = data->rr_len[i] - 2;
   5894 		uint8_t* rdata = data->rr_data[i]+2;
   5895 		if(rrtype == LDNS_RR_TYPE_A && len != INET_SIZE)
   5896 			continue; /* wrong length for A */
   5897 		if(rrtype == LDNS_RR_TYPE_AAAA && len != INET6_SIZE)
   5898 			continue; /* wrong length for AAAA */
   5899 
   5900 		/* add and alloc it */
   5901 		a = (struct auth_addr*)calloc(1, sizeof(*a));
   5902 		if(!a) {
   5903 			log_err("out of memory");
   5904 			return;
   5905 		}
   5906 		if(rrtype == LDNS_RR_TYPE_A) {
   5907 			struct sockaddr_in* sa;
   5908 			a->addrlen = (socklen_t)sizeof(*sa);
   5909 			sa = (struct sockaddr_in*)&a->addr;
   5910 			sa->sin_family = AF_INET;
   5911 			sa->sin_port = (in_port_t)htons(UNBOUND_DNS_PORT);
   5912 			memmove(&sa->sin_addr, rdata, INET_SIZE);
   5913 		} else {
   5914 			struct sockaddr_in6* sa;
   5915 			a->addrlen = (socklen_t)sizeof(*sa);
   5916 			sa = (struct sockaddr_in6*)&a->addr;
   5917 			sa->sin6_family = AF_INET6;
   5918 			sa->sin6_port = (in_port_t)htons(UNBOUND_DNS_PORT);
   5919 			memmove(&sa->sin6_addr, rdata, INET6_SIZE);
   5920 		}
   5921 		if(verbosity >= VERB_ALGO) {
   5922 			char s[64];
   5923 			addr_port_to_str(&a->addr, a->addrlen, s, sizeof(s));
   5924 			verbose(VERB_ALGO, "auth host %s lookup %s",
   5925 				m->host, s);
   5926 		}
   5927 		/* append to list */
   5928 		a->next = m->list;
   5929 		m->list = a;
   5930 	}
   5931 }
   5932 
   5933 /** check if the lookup target name equals the found answer name. */
   5934 static int
   5935 xfer_target_equals_answer_name(struct auth_master* lookup_target,
   5936 	struct ub_packed_rrset_key* answer, struct query_info* rq,
   5937 	struct reply_info* rep)
   5938 {
   5939 	uint8_t qname[LDNS_MAX_DOMAINLEN+1];
   5940 	size_t qname_len;
   5941 	if(!lookup_target) return 0;
   5942 	if(!answer) return 0;
   5943 	qname_len = sizeof(qname);
   5944 	if(sldns_str2wire_dname_buf(lookup_target->host, qname, &qname_len)
   5945 		!= 0) {
   5946 		verbose(VERB_ALGO, "xfer_target_equals_answer_name: could not parse auth host name");
   5947 		return 0;
   5948 	}
   5949 	if(query_dname_compare(answer->rk.dname, qname) == 0)
   5950 		return 1;
   5951 	/* It could be a CNAME. */
   5952 	if(reply_find_rrset_section_an(rep, qname, qname_len,
   5953 		LDNS_RR_TYPE_CNAME, rq->qclass))
   5954 		return 1;
   5955 	return 0;
   5956 }
   5957 
   5958 /** callback for task_transfer lookup of host name, of A or AAAA */
   5959 void auth_xfer_transfer_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
   5960 	enum sec_status sec, char* why_bogus, int ATTR_UNUSED(was_ratelimited))
   5961 {
   5962 	struct auth_xfer* xfr = (struct auth_xfer*)arg;
   5963 	struct module_env* env;
   5964 	log_assert(xfr->task_transfer);
   5965 	lock_basic_lock(&xfr->lock);
   5966 	env = xfr->task_transfer->env;
   5967 	if(!env || env->outnet->want_to_quit) {
   5968 		lock_basic_unlock(&xfr->lock);
   5969 		return; /* stop on quit */
   5970 	}
   5971 
   5972 	/* process result */
   5973 	if(sec == sec_status_bogus || sec == sec_status_secure_sentinel_fail) {
   5974 		if(verbosity >= VERB_OPS) {
   5975 			char zname[LDNS_MAX_DOMAINLEN];
   5976 			dname_str(xfr->name, zname);
   5977 			verbose(VERB_OPS, "auth zone %s: primary %s address lookup is DNSSEC bogus: %s",
   5978 				zname, xfr->task_transfer->lookup_target->host,
   5979 				(why_bogus?why_bogus:""));
   5980 		}
   5981 		/* fall through to next-lookup / next-master */
   5982 	} else if(rcode == LDNS_RCODE_NOERROR) {
   5983 		uint16_t wanted_qtype = LDNS_RR_TYPE_A;
   5984 		struct regional* temp = env->scratch;
   5985 		struct query_info rq;
   5986 		struct reply_info* rep;
   5987 		if(xfr->task_transfer->lookup_aaaa)
   5988 			wanted_qtype = LDNS_RR_TYPE_AAAA;
   5989 		memset(&rq, 0, sizeof(rq));
   5990 		rep = parse_reply_in_temp_region(buf, temp, &rq);
   5991 		if(rep && rq.qtype == wanted_qtype &&
   5992 			FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NOERROR) {
   5993 			/* parsed successfully */
   5994 			struct ub_packed_rrset_key* answer =
   5995 				reply_find_answer_rrset(&rq, rep);
   5996 			if(answer && xfer_target_equals_answer_name(
   5997 				xfr->task_transfer->lookup_target, answer,
   5998 				&rq, rep)) {
   5999 				xfr_master_add_addrs(xfr->task_transfer->
   6000 					lookup_target, answer, wanted_qtype);
   6001 			} else if(answer) {
   6002 				if(verbosity >= VERB_ALGO) {
   6003 					char zname[LDNS_MAX_DOMAINLEN];
   6004 					dname_str(xfr->name, zname);
   6005 					verbose(VERB_ALGO, "auth zone %s host %s type %s transfer lookup has mismatch in answer name", zname, ((xfr->task_transfer->lookup_target && xfr->task_transfer->lookup_target->host) ? xfr->task_transfer->lookup_target->host : "null"), (xfr->task_transfer->lookup_aaaa?"AAAA":"A"));
   6006 				}
   6007 			} else {
   6008 				if(verbosity >= VERB_ALGO) {
   6009 					char zname[LDNS_MAX_DOMAINLEN];
   6010 					dname_str(xfr->name, zname);
   6011 					verbose(VERB_ALGO, "auth zone %s host %s type %s transfer lookup has nodata", zname, ((xfr->task_transfer->lookup_target && xfr->task_transfer->lookup_target->host) ? xfr->task_transfer->lookup_target->host : "null"), (xfr->task_transfer->lookup_aaaa?"AAAA":"A"));
   6012 				}
   6013 			}
   6014 		} else {
   6015 			if(verbosity >= VERB_ALGO) {
   6016 				char zname[LDNS_MAX_DOMAINLEN];
   6017 				dname_str(xfr->name, zname);
   6018 				verbose(VERB_ALGO, "auth zone %s host %s type %s transfer lookup has no answer", zname, ((xfr->task_transfer->lookup_target && xfr->task_transfer->lookup_target->host) ? xfr->task_transfer->lookup_target->host : "null"), (xfr->task_transfer->lookup_aaaa?"AAAA":"A"));
   6019 			}
   6020 		}
   6021 		regional_free_all(temp);
   6022 	} else {
   6023 		if(verbosity >= VERB_ALGO) {
   6024 			char zname[LDNS_MAX_DOMAINLEN];
   6025 			dname_str(xfr->name, zname);
   6026 			verbose(VERB_ALGO, "auth zone %s host %s type %s transfer lookup failed", zname, ((xfr->task_transfer->lookup_target && xfr->task_transfer->lookup_target->host) ? xfr->task_transfer->lookup_target->host : "null"), (xfr->task_transfer->lookup_aaaa?"AAAA":"A"));
   6027 		}
   6028 	}
   6029 	if(xfr->task_transfer->lookup_target &&
   6030 		xfr->task_transfer->lookup_target->list &&
   6031 		xfr->task_transfer->lookup_target == xfr_transfer_current_master(xfr))
   6032 		xfr->task_transfer->scan_addr = xfr->task_transfer->lookup_target->list;
   6033 
   6034 	/* move to lookup AAAA after A lookup, move to next hostname lookup,
   6035 	 * or move to fetch the zone, or, if nothing to do, end task_transfer */
   6036 	xfr_transfer_move_to_next_lookup(xfr, env);
   6037 	xfr_transfer_nexttarget_or_end(xfr, env);
   6038 }
   6039 
   6040 /** check if xfer (AXFR or IXFR) packet is OK.
   6041  * return false if we lost connection (SERVFAIL, or unreadable).
   6042  * return false if we need to move from IXFR to AXFR, with gonextonfail
   6043  * 	set to false, so the same master is tried again, but with AXFR.
   6044  * return true if fine to link into data.
   6045  * return true with transferdone=true when the transfer has ended.
   6046  */
   6047 static int
   6048 check_xfer_packet(sldns_buffer* pkt, struct auth_xfer* xfr,
   6049 	int* gonextonfail, int* transferdone)
   6050 {
   6051 	uint8_t* wire = sldns_buffer_begin(pkt);
   6052 	int i;
   6053 	if(sldns_buffer_limit(pkt) < LDNS_HEADER_SIZE) {
   6054 		verbose(VERB_ALGO, "xfr to %s failed, packet too small",
   6055 			xfr->task_transfer->master->host);
   6056 		return 0;
   6057 	}
   6058 	if(!LDNS_QR_WIRE(wire)) {
   6059 		verbose(VERB_ALGO, "xfr to %s failed, packet has no QR flag",
   6060 			xfr->task_transfer->master->host);
   6061 		return 0;
   6062 	}
   6063 	if(LDNS_TC_WIRE(wire)) {
   6064 		verbose(VERB_ALGO, "xfr to %s failed, packet has TC flag",
   6065 			xfr->task_transfer->master->host);
   6066 		return 0;
   6067 	}
   6068 	/* check ID */
   6069 	if(LDNS_ID_WIRE(wire) != xfr->task_transfer->id) {
   6070 		verbose(VERB_ALGO, "xfr to %s failed, packet wrong ID",
   6071 			xfr->task_transfer->master->host);
   6072 		return 0;
   6073 	}
   6074 	if(LDNS_RCODE_WIRE(wire) != LDNS_RCODE_NOERROR) {
   6075 		char rcode[32];
   6076 		sldns_wire2str_rcode_buf((int)LDNS_RCODE_WIRE(wire), rcode,
   6077 			sizeof(rcode));
   6078 		/* if we are doing IXFR, check for fallback */
   6079 		if(xfr->task_transfer->on_ixfr) {
   6080 			if(LDNS_RCODE_WIRE(wire) == LDNS_RCODE_NOTIMPL ||
   6081 				LDNS_RCODE_WIRE(wire) == LDNS_RCODE_SERVFAIL ||
   6082 				LDNS_RCODE_WIRE(wire) == LDNS_RCODE_REFUSED ||
   6083 				LDNS_RCODE_WIRE(wire) == LDNS_RCODE_FORMERR) {
   6084 				verbose(VERB_ALGO, "xfr to %s, fallback "
   6085 					"from IXFR to AXFR (with rcode %s)",
   6086 					xfr->task_transfer->master->host,
   6087 					rcode);
   6088 				xfr->task_transfer->ixfr_fail = 1;
   6089 				*gonextonfail = 0;
   6090 				return 0;
   6091 			}
   6092 		}
   6093 		verbose(VERB_ALGO, "xfr to %s failed, packet with rcode %s",
   6094 			xfr->task_transfer->master->host, rcode);
   6095 		return 0;
   6096 	}
   6097 	if(LDNS_OPCODE_WIRE(wire) != LDNS_PACKET_QUERY) {
   6098 		verbose(VERB_ALGO, "xfr to %s failed, packet with bad opcode",
   6099 			xfr->task_transfer->master->host);
   6100 		return 0;
   6101 	}
   6102 	if(LDNS_QDCOUNT(wire) > 1) {
   6103 		verbose(VERB_ALGO, "xfr to %s failed, packet has qdcount %d",
   6104 			xfr->task_transfer->master->host,
   6105 			(int)LDNS_QDCOUNT(wire));
   6106 		return 0;
   6107 	}
   6108 
   6109 	/* check qname */
   6110 	sldns_buffer_set_position(pkt, LDNS_HEADER_SIZE);
   6111 	for(i=0; i<(int)LDNS_QDCOUNT(wire); i++) {
   6112 		size_t pos = sldns_buffer_position(pkt);
   6113 		uint16_t qtype, qclass;
   6114 		if(pkt_dname_len(pkt) == 0) {
   6115 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6116 				"malformed dname",
   6117 				xfr->task_transfer->master->host);
   6118 			return 0;
   6119 		}
   6120 		if(dname_pkt_compare(pkt, sldns_buffer_at(pkt, pos),
   6121 			xfr->name) != 0) {
   6122 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6123 				"wrong qname",
   6124 				xfr->task_transfer->master->host);
   6125 			return 0;
   6126 		}
   6127 		if(sldns_buffer_remaining(pkt) < 4) {
   6128 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6129 				"truncated query RR",
   6130 				xfr->task_transfer->master->host);
   6131 			return 0;
   6132 		}
   6133 		qtype = sldns_buffer_read_u16(pkt);
   6134 		qclass = sldns_buffer_read_u16(pkt);
   6135 		if(qclass != xfr->dclass) {
   6136 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6137 				"wrong qclass",
   6138 				xfr->task_transfer->master->host);
   6139 			return 0;
   6140 		}
   6141 		if(xfr->task_transfer->on_ixfr) {
   6142 			if(qtype != LDNS_RR_TYPE_IXFR) {
   6143 				verbose(VERB_ALGO, "xfr to %s failed, packet "
   6144 					"with wrong qtype, expected IXFR",
   6145 				xfr->task_transfer->master->host);
   6146 				return 0;
   6147 			}
   6148 		} else {
   6149 			if(qtype != LDNS_RR_TYPE_AXFR) {
   6150 				verbose(VERB_ALGO, "xfr to %s failed, packet "
   6151 					"with wrong qtype, expected AXFR",
   6152 				xfr->task_transfer->master->host);
   6153 				return 0;
   6154 			}
   6155 		}
   6156 	}
   6157 
   6158 	/* check parse of RRs in packet, store first SOA serial
   6159 	 * to be able to detect last SOA (with that serial) to see if done */
   6160 	/* also check for IXFR 'zone up to date' reply */
   6161 	for(i=0; i<(int)LDNS_ANCOUNT(wire); i++) {
   6162 		size_t pos = sldns_buffer_position(pkt);
   6163 		uint16_t tp, rdlen;
   6164 		if(pkt_dname_len(pkt) == 0) {
   6165 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6166 				"malformed dname in answer section",
   6167 				xfr->task_transfer->master->host);
   6168 			return 0;
   6169 		}
   6170 		if(sldns_buffer_remaining(pkt) < 10) {
   6171 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6172 				"truncated RR",
   6173 				xfr->task_transfer->master->host);
   6174 			return 0;
   6175 		}
   6176 		tp = sldns_buffer_read_u16(pkt);
   6177 		(void)sldns_buffer_read_u16(pkt); /* class */
   6178 		(void)sldns_buffer_read_u32(pkt); /* ttl */
   6179 		rdlen = sldns_buffer_read_u16(pkt);
   6180 		if(sldns_buffer_remaining(pkt) < rdlen) {
   6181 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6182 				"truncated RR rdata",
   6183 				xfr->task_transfer->master->host);
   6184 			return 0;
   6185 		}
   6186 
   6187 		/* RR parses (haven't checked rdata itself), now look at
   6188 		 * SOA records to see serial number */
   6189 		if(xfr->task_transfer->rr_scan_num == 0 &&
   6190 			tp != LDNS_RR_TYPE_SOA) {
   6191 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6192 				"malformed zone transfer, no start SOA",
   6193 				xfr->task_transfer->master->host);
   6194 			return 0;
   6195 		}
   6196 		if(xfr->task_transfer->rr_scan_num == 1 &&
   6197 			tp != LDNS_RR_TYPE_SOA) {
   6198 			/* second RR is not a SOA record, this is not an IXFR
   6199 			 * the master is replying with an AXFR */
   6200 			xfr->task_transfer->on_ixfr_is_axfr = 1;
   6201 		}
   6202 		if(tp == LDNS_RR_TYPE_SOA) {
   6203 			uint32_t serial;
   6204 			if(rdlen < 22) {
   6205 				verbose(VERB_ALGO, "xfr to %s failed, packet "
   6206 					"with SOA with malformed rdata",
   6207 					xfr->task_transfer->master->host);
   6208 				return 0;
   6209 			}
   6210 			if(dname_pkt_compare(pkt, sldns_buffer_at(pkt, pos),
   6211 				xfr->name) != 0) {
   6212 				verbose(VERB_ALGO, "xfr to %s failed, packet "
   6213 					"with SOA with wrong dname",
   6214 					xfr->task_transfer->master->host);
   6215 				return 0;
   6216 			}
   6217 
   6218 			/* read serial number of SOA */
   6219 			serial = sldns_buffer_read_u32_at(pkt,
   6220 				sldns_buffer_position(pkt)+rdlen-20);
   6221 
   6222 			/* check for IXFR 'zone has SOA x' reply */
   6223 			if(xfr->task_transfer->on_ixfr &&
   6224 				xfr->task_transfer->rr_scan_num == 0 &&
   6225 				LDNS_ANCOUNT(wire)==1) {
   6226 				verbose(VERB_ALGO, "xfr to %s ended, "
   6227 					"IXFR reply that zone has serial %u,"
   6228 					" fallback from IXFR to AXFR",
   6229 					xfr->task_transfer->master->host,
   6230 					(unsigned)serial);
   6231 				xfr->task_transfer->ixfr_fail = 1;
   6232 				*gonextonfail = 0;
   6233 				return 0;
   6234 			}
   6235 
   6236 			/* if first SOA, store serial number */
   6237 			if(xfr->task_transfer->got_xfr_serial == 0) {
   6238 				xfr->task_transfer->got_xfr_serial = 1;
   6239 				xfr->task_transfer->incoming_xfr_serial =
   6240 					serial;
   6241 				verbose(VERB_ALGO, "xfr %s: contains "
   6242 					"SOA serial %u",
   6243 					xfr->task_transfer->master->host,
   6244 					(unsigned)serial);
   6245 			/* see if end of AXFR */
   6246 			} else if(!xfr->task_transfer->on_ixfr ||
   6247 				xfr->task_transfer->on_ixfr_is_axfr) {
   6248 				/* second SOA with serial is the end
   6249 				 * for AXFR */
   6250 				*transferdone = 1;
   6251 				verbose(VERB_ALGO, "xfr %s: last AXFR packet",
   6252 					xfr->task_transfer->master->host);
   6253 			/* for IXFR, count SOA records with that serial */
   6254 			} else if(xfr->task_transfer->incoming_xfr_serial ==
   6255 				serial && xfr->task_transfer->got_xfr_serial
   6256 				== 1) {
   6257 				xfr->task_transfer->got_xfr_serial++;
   6258 			/* if not first soa, if serial==firstserial, the
   6259 			 * third time we are at the end, for IXFR */
   6260 			} else if(xfr->task_transfer->incoming_xfr_serial ==
   6261 				serial && xfr->task_transfer->got_xfr_serial
   6262 				== 2) {
   6263 				verbose(VERB_ALGO, "xfr %s: last IXFR packet",
   6264 					xfr->task_transfer->master->host);
   6265 				*transferdone = 1;
   6266 				/* continue parse check, if that succeeds,
   6267 				 * transfer is done */
   6268 			}
   6269 		}
   6270 		xfr->task_transfer->rr_scan_num++;
   6271 
   6272 		/* skip over RR rdata to go to the next RR */
   6273 		sldns_buffer_skip(pkt, (ssize_t)rdlen);
   6274 	}
   6275 
   6276 	/* check authority section */
   6277 	/* we skip over the RRs checking packet format */
   6278 	for(i=0; i<(int)LDNS_NSCOUNT(wire); i++) {
   6279 		uint16_t rdlen;
   6280 		if(pkt_dname_len(pkt) == 0) {
   6281 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6282 				"malformed dname in authority section",
   6283 				xfr->task_transfer->master->host);
   6284 			return 0;
   6285 		}
   6286 		if(sldns_buffer_remaining(pkt) < 10) {
   6287 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6288 				"truncated RR",
   6289 				xfr->task_transfer->master->host);
   6290 			return 0;
   6291 		}
   6292 		(void)sldns_buffer_read_u16(pkt); /* type */
   6293 		(void)sldns_buffer_read_u16(pkt); /* class */
   6294 		(void)sldns_buffer_read_u32(pkt); /* ttl */
   6295 		rdlen = sldns_buffer_read_u16(pkt);
   6296 		if(sldns_buffer_remaining(pkt) < rdlen) {
   6297 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6298 				"truncated RR rdata",
   6299 				xfr->task_transfer->master->host);
   6300 			return 0;
   6301 		}
   6302 		/* skip over RR rdata to go to the next RR */
   6303 		sldns_buffer_skip(pkt, (ssize_t)rdlen);
   6304 	}
   6305 
   6306 	/* check additional section */
   6307 	for(i=0; i<(int)LDNS_ARCOUNT(wire); i++) {
   6308 		uint16_t rdlen;
   6309 		if(pkt_dname_len(pkt) == 0) {
   6310 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6311 				"malformed dname in additional section",
   6312 				xfr->task_transfer->master->host);
   6313 			return 0;
   6314 		}
   6315 		if(sldns_buffer_remaining(pkt) < 10) {
   6316 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6317 				"truncated RR",
   6318 				xfr->task_transfer->master->host);
   6319 			return 0;
   6320 		}
   6321 		(void)sldns_buffer_read_u16(pkt); /* type */
   6322 		(void)sldns_buffer_read_u16(pkt); /* class */
   6323 		(void)sldns_buffer_read_u32(pkt); /* ttl */
   6324 		rdlen = sldns_buffer_read_u16(pkt);
   6325 		if(sldns_buffer_remaining(pkt) < rdlen) {
   6326 			verbose(VERB_ALGO, "xfr to %s failed, packet with "
   6327 				"truncated RR rdata",
   6328 				xfr->task_transfer->master->host);
   6329 			return 0;
   6330 		}
   6331 		/* skip over RR rdata to go to the next RR */
   6332 		sldns_buffer_skip(pkt, (ssize_t)rdlen);
   6333 	}
   6334 
   6335 	return 1;
   6336 }
   6337 
   6338 /** Link the data from this packet into the worklist of transferred data */
   6339 static int
   6340 xfer_link_data(sldns_buffer* pkt, struct auth_xfer* xfr)
   6341 {
   6342 	/* alloc it */
   6343 	struct auth_chunk* e;
   6344 	e = (struct auth_chunk*)calloc(1, sizeof(*e));
   6345 	if(!e) return 0;
   6346 	e->next = NULL;
   6347 	e->len = sldns_buffer_limit(pkt);
   6348 	e->data = memdup(sldns_buffer_begin(pkt), e->len);
   6349 	if(!e->data) {
   6350 		free(e);
   6351 		return 0;
   6352 	}
   6353 
   6354 	/* alloc succeeded, link into list */
   6355 	if(!xfr->task_transfer->chunks_first)
   6356 		xfr->task_transfer->chunks_first = e;
   6357 	if(xfr->task_transfer->chunks_last)
   6358 		xfr->task_transfer->chunks_last->next = e;
   6359 	xfr->task_transfer->chunks_last = e;
   6360 	xfr->task_transfer->chunks_total += e->len;
   6361 	return 1;
   6362 }
   6363 
   6364 /** task transfer.  the list of data is complete. process it and if failed
   6365  * move to next master, if succeeded, end the task transfer */
   6366 static void
   6367 process_list_end_transfer(struct auth_xfer* xfr, struct module_env* env)
   6368 {
   6369 	int ixfr_fail = 0;
   6370 	if(xfr_process_chunk_list(xfr, env, &ixfr_fail)) {
   6371 		/* it worked! */
   6372 		auth_chunks_delete(xfr->task_transfer);
   6373 
   6374 		/* we fetched the zone, move to wait task */
   6375 		xfr_transfer_disown(xfr);
   6376 
   6377 		if(xfr->notify_received && (!xfr->notify_has_serial ||
   6378 			(xfr->notify_has_serial &&
   6379 			xfr_serial_means_update(xfr, xfr->notify_serial)))) {
   6380 			uint32_t sr = xfr->notify_serial;
   6381 			int has_sr = xfr->notify_has_serial;
   6382 			/* we received a notify while probe/transfer was
   6383 			 * in progress.  start a new probe and transfer */
   6384 			xfr->notify_received = 0;
   6385 			xfr->notify_has_serial = 0;
   6386 			xfr->notify_serial = 0;
   6387 			if(!xfr_start_probe(xfr, env, NULL)) {
   6388 				/* if we couldn't start it, already in
   6389 				 * progress; restore notify serial,
   6390 				 * while xfr still locked */
   6391 				xfr->notify_received = 1;
   6392 				xfr->notify_has_serial = has_sr;
   6393 				xfr->notify_serial = sr;
   6394 				lock_basic_unlock(&xfr->lock);
   6395 			}
   6396 			return;
   6397 		} else {
   6398 			/* pick up the nextprobe task and wait (normail wait time) */
   6399 			if(xfr->task_nextprobe->worker == NULL)
   6400 				xfr_set_timeout(xfr, env, 0, 0);
   6401 		}
   6402 		lock_basic_unlock(&xfr->lock);
   6403 		return;
   6404 	}
   6405 	/* processing failed */
   6406 	/* when done, delete data from list */
   6407 	auth_chunks_delete(xfr->task_transfer);
   6408 	if(ixfr_fail) {
   6409 		xfr->task_transfer->ixfr_fail = 1;
   6410 	} else {
   6411 		xfr_transfer_nextmaster(xfr);
   6412 	}
   6413 	xfr_transfer_nexttarget_or_end(xfr, env);
   6414 }
   6415 
   6416 /** callback for the task_transfer timer */
   6417 void
   6418 auth_xfer_transfer_timer_callback(void* arg)
   6419 {
   6420 	struct auth_xfer* xfr = (struct auth_xfer*)arg;
   6421 	struct module_env* env;
   6422 	int gonextonfail = 1;
   6423 	log_assert(xfr->task_transfer);
   6424 	lock_basic_lock(&xfr->lock);
   6425 	env = xfr->task_transfer->env;
   6426 	if(!env || env->outnet->want_to_quit) {
   6427 		lock_basic_unlock(&xfr->lock);
   6428 		return; /* stop on quit */
   6429 	}
   6430 
   6431 	verbose(VERB_ALGO, "xfr stopped, connection timeout to %s",
   6432 		xfr->task_transfer->master->host);
   6433 
   6434 	/* see if IXFR caused the failure, if so, try AXFR */
   6435 	if(xfr->task_transfer->on_ixfr) {
   6436 		xfr->task_transfer->ixfr_possible_timeout_count++;
   6437 		if(xfr->task_transfer->ixfr_possible_timeout_count >=
   6438 			NUM_TIMEOUTS_FALLBACK_IXFR) {
   6439 			verbose(VERB_ALGO, "xfr to %s, fallback "
   6440 				"from IXFR to AXFR (because of timeouts)",
   6441 				xfr->task_transfer->master->host);
   6442 			xfr->task_transfer->ixfr_fail = 1;
   6443 			gonextonfail = 0;
   6444 		}
   6445 	}
   6446 
   6447 	/* delete transferred data from list */
   6448 	auth_chunks_delete(xfr->task_transfer);
   6449 	comm_point_delete(xfr->task_transfer->cp);
   6450 	xfr->task_transfer->cp = NULL;
   6451 	if(gonextonfail)
   6452 		xfr_transfer_nextmaster(xfr);
   6453 	xfr_transfer_nexttarget_or_end(xfr, env);
   6454 }
   6455 
   6456 /** return the time taken by the transfer */
   6457 static int
   6458 auth_xfer_transfer_time_taken(struct auth_xfer* xfr, struct module_env* env)
   6459 {
   6460 	struct timeval delta;
   6461 	timeval_subtract(&delta, env->now_tv, &xfr->task_transfer->start_time);
   6462 	return ((int)delta.tv_sec)*1000 + ((int)delta.tv_usec)/1000;
   6463 }
   6464 
   6465 /** callback for task_transfer tcp connections */
   6466 int
   6467 auth_xfer_transfer_tcp_callback(struct comm_point* c, void* arg, int err,
   6468 	struct comm_reply* ATTR_UNUSED(repinfo))
   6469 {
   6470 	struct auth_xfer* xfr = (struct auth_xfer*)arg;
   6471 	struct module_env* env;
   6472 	int gonextonfail = 1;
   6473 	int transferdone = 0;
   6474 	log_assert(xfr->task_transfer);
   6475 	lock_basic_lock(&xfr->lock);
   6476 	env = xfr->task_transfer->env;
   6477 	if(!env || env->outnet->want_to_quit) {
   6478 		lock_basic_unlock(&xfr->lock);
   6479 		return 0; /* stop on quit */
   6480 	}
   6481 	/* stop the timer */
   6482 	comm_timer_disable(xfr->task_transfer->timer);
   6483 
   6484 	if(err != NETEVENT_NOERROR) {
   6485 		/* connection failed, closed, or timeout */
   6486 		/* stop this transfer, cleanup
   6487 		 * and continue task_transfer*/
   6488 		verbose(VERB_ALGO, "xfr stopped, connection lost to %s",
   6489 			xfr->task_transfer->master->host);
   6490 
   6491 		/* see if IXFR caused the failure, if so, try AXFR */
   6492 		if(xfr->task_transfer->on_ixfr) {
   6493 			xfr->task_transfer->ixfr_possible_timeout_count++;
   6494 			if(xfr->task_transfer->ixfr_possible_timeout_count >=
   6495 				NUM_TIMEOUTS_FALLBACK_IXFR) {
   6496 				verbose(VERB_ALGO, "xfr to %s, fallback "
   6497 					"from IXFR to AXFR (because of timeouts)",
   6498 					xfr->task_transfer->master->host);
   6499 				xfr->task_transfer->ixfr_fail = 1;
   6500 				gonextonfail = 0;
   6501 			}
   6502 		}
   6503 
   6504 	failed:
   6505 		/* delete transferred data from list */
   6506 		auth_chunks_delete(xfr->task_transfer);
   6507 		comm_point_delete(xfr->task_transfer->cp);
   6508 		xfr->task_transfer->cp = NULL;
   6509 		if(gonextonfail)
   6510 			xfr_transfer_nextmaster(xfr);
   6511 		xfr_transfer_nexttarget_or_end(xfr, env);
   6512 		return 0;
   6513 	}
   6514 	/* note that IXFR worked without timeout */
   6515 	if(xfr->task_transfer->on_ixfr)
   6516 		xfr->task_transfer->ixfr_possible_timeout_count = 0;
   6517 
   6518 	/* handle returned packet */
   6519 	/* if it fails, cleanup and end this transfer */
   6520 	/* if it needs to fallback from IXFR to AXFR, do that */
   6521 	if(!check_xfer_packet(c->buffer, xfr, &gonextonfail, &transferdone)) {
   6522 		goto failed;
   6523 	}
   6524 	/* if it is good, link it into the list of data */
   6525 	/* if the link into list of data fails (malloc fail) cleanup and end */
   6526 	if(!xfer_link_data(c->buffer, xfr)) {
   6527 		verbose(VERB_ALGO, "xfr stopped to %s, malloc failed",
   6528 			xfr->task_transfer->master->host);
   6529 		goto failed;
   6530 	}
   6531 	if(xfr->max_transfer_size > 0 &&
   6532 		xfr->task_transfer->chunks_total > xfr->max_transfer_size) {
   6533 		char zname[LDNS_MAX_DOMAINLEN];
   6534 		dname_str(xfr->name, zname);
   6535 		log_err("auth zone %s transfer from %s exceeded %u bytes, aborting",
   6536 			zname, xfr->task_transfer->master->host,
   6537 			(unsigned)xfr->max_transfer_size);
   6538 		goto failed;
   6539 	}
   6540 	/* if the transfer is done now, disconnect and process the list */
   6541 	if(transferdone) {
   6542 		comm_point_delete(xfr->task_transfer->cp);
   6543 		xfr->task_transfer->cp = NULL;
   6544 		process_list_end_transfer(xfr, env);
   6545 		return 0;
   6546 	}
   6547 
   6548 	if(xfr->max_transfer_time > 0 &&
   6549 		auth_xfer_transfer_time_taken(xfr, env) > xfr->max_transfer_time) {
   6550 		char zname[LDNS_MAX_DOMAINLEN];
   6551 		dname_str(xfr->name, zname);
   6552 		log_err("auth zone %s transfer from %s exceeded %u msec total running time, aborting",
   6553 			zname, xfr->task_transfer->master->host,
   6554 			(unsigned)xfr->max_transfer_time);
   6555 		goto failed;
   6556 	}
   6557 
   6558 	/* if we want to read more messages, setup the commpoint to read
   6559 	 * a DNS packet, and the timeout */
   6560 	lock_basic_unlock(&xfr->lock);
   6561 	c->tcp_is_reading = 1;
   6562 	sldns_buffer_clear(c->buffer);
   6563 	comm_point_start_listening(c, -1, AUTH_TRANSFER_TIMEOUT);
   6564 	return 0;
   6565 }
   6566 
   6567 /** callback for task_transfer http connections */
   6568 int
   6569 auth_xfer_transfer_http_callback(struct comm_point* c, void* arg, int err,
   6570 	struct comm_reply* repinfo)
   6571 {
   6572 	struct auth_xfer* xfr = (struct auth_xfer*)arg;
   6573 	struct module_env* env;
   6574 	log_assert(xfr->task_transfer);
   6575 	lock_basic_lock(&xfr->lock);
   6576 	env = xfr->task_transfer->env;
   6577 	if(!env || env->outnet->want_to_quit) {
   6578 		lock_basic_unlock(&xfr->lock);
   6579 		return 0; /* stop on quit */
   6580 	}
   6581 	verbose(VERB_ALGO, "auth zone transfer http callback");
   6582 	/* stop the timer */
   6583 	comm_timer_disable(xfr->task_transfer->timer);
   6584 
   6585 	if(err != NETEVENT_NOERROR && err != NETEVENT_DONE) {
   6586 		/* connection failed, closed, or timeout */
   6587 		/* stop this transfer, cleanup
   6588 		 * and continue task_transfer*/
   6589 		verbose(VERB_ALGO, "http stopped, connection lost to %s",
   6590 			xfr->task_transfer->master->host);
   6591 	failed:
   6592 		/* delete transferred data from list */
   6593 		auth_chunks_delete(xfr->task_transfer);
   6594 		if(repinfo) repinfo->c = NULL; /* signal cp deleted to
   6595 				the routine calling this callback */
   6596 		comm_point_delete(xfr->task_transfer->cp);
   6597 		xfr->task_transfer->cp = NULL;
   6598 		xfr_transfer_nextmaster(xfr);
   6599 		xfr_transfer_nexttarget_or_end(xfr, env);
   6600 		return 0;
   6601 	}
   6602 
   6603 	/* if it is good, link it into the list of data */
   6604 	/* if the link into list of data fails (malloc fail) cleanup and end */
   6605 	if(sldns_buffer_limit(c->buffer) > 0) {
   6606 		verbose(VERB_ALGO, "auth zone http queued up %d bytes",
   6607 			(int)sldns_buffer_limit(c->buffer));
   6608 		if(!xfer_link_data(c->buffer, xfr)) {
   6609 			verbose(VERB_ALGO, "http stopped to %s, malloc failed",
   6610 				xfr->task_transfer->master->host);
   6611 			goto failed;
   6612 		}
   6613 		if(xfr->max_transfer_size > 0 &&
   6614 			xfr->task_transfer->chunks_total > xfr->max_transfer_size) {
   6615 			char zname[LDNS_MAX_DOMAINLEN];
   6616 			dname_str(xfr->name, zname);
   6617 			log_err("auth zone %s http %s/%s exceeded %u bytes, aborting",
   6618 				zname, xfr->task_transfer->master->host,
   6619 				xfr->task_transfer->master->file,
   6620 				(unsigned)xfr->max_transfer_size);
   6621 			goto failed;
   6622 		}
   6623 	}
   6624 	/* if the transfer is done now, disconnect and process the list */
   6625 	if(err == NETEVENT_DONE) {
   6626 		if(repinfo) repinfo->c = NULL; /* signal cp deleted to
   6627 				the routine calling this callback */
   6628 		comm_point_delete(xfr->task_transfer->cp);
   6629 		xfr->task_transfer->cp = NULL;
   6630 		process_list_end_transfer(xfr, env);
   6631 		return 0;
   6632 	}
   6633 
   6634 	if(xfr->max_transfer_time > 0 &&
   6635 		auth_xfer_transfer_time_taken(xfr, env) > xfr->max_transfer_time) {
   6636 		char zname[LDNS_MAX_DOMAINLEN];
   6637 		dname_str(xfr->name, zname);
   6638 		log_err("auth zone %s transfer http %s/%s exceeded %u msec total running time, aborting",
   6639 			zname, xfr->task_transfer->master->host,
   6640 			xfr->task_transfer->master->file,
   6641 			(unsigned)xfr->max_transfer_time);
   6642 		goto failed;
   6643 	}
   6644 
   6645 	/* if we want to read more messages, setup the commpoint to read
   6646 	 * a DNS packet, and the timeout */
   6647 	lock_basic_unlock(&xfr->lock);
   6648 	c->tcp_is_reading = 1;
   6649 	sldns_buffer_clear(c->buffer);
   6650 	comm_point_start_listening(c, -1, AUTH_TRANSFER_TIMEOUT);
   6651 	return 0;
   6652 }
   6653 
   6654 
   6655 /** start transfer task by this worker , xfr is locked. */
   6656 static void
   6657 xfr_start_transfer(struct auth_xfer* xfr, struct module_env* env,
   6658 	struct auth_master* master)
   6659 {
   6660 	log_assert(xfr->task_transfer != NULL);
   6661 	log_assert(xfr->task_transfer->worker == NULL);
   6662 	log_assert(xfr->task_transfer->chunks_first == NULL);
   6663 	log_assert(xfr->task_transfer->chunks_last == NULL);
   6664 	xfr->task_transfer->worker = env->worker;
   6665 	xfr->task_transfer->env = env;
   6666 
   6667 	/* init transfer process */
   6668 	/* find that master in the transfer's list of masters? */
   6669 	xfr_transfer_start_list(xfr, master);
   6670 	/* start lookup for hostnames in transfer master list */
   6671 	xfr_transfer_start_lookups(xfr);
   6672 
   6673 	/* initiate TCP, and set timeout on it */
   6674 	xfr_transfer_nexttarget_or_end(xfr, env);
   6675 }
   6676 
   6677 /** disown task_probe.  caller must hold xfr.lock */
   6678 static void
   6679 xfr_probe_disown(struct auth_xfer* xfr)
   6680 {
   6681 	/* remove timer (from this worker's event base) */
   6682 	comm_timer_delete(xfr->task_probe->timer);
   6683 	xfr->task_probe->timer = NULL;
   6684 	/* remove the commpoint */
   6685 	comm_point_delete(xfr->task_probe->cp);
   6686 	xfr->task_probe->cp = NULL;
   6687 	if(xfr->task_probe->env)
   6688 		xfr_stop_lookup(&xfr->task_probe->lookup_target,
   6689 			xfr->task_probe->lookup_unique_info,
   6690 			xfr->task_probe->lookup_aaaa, xfr->dclass,
   6691 			xfr->task_probe->env->mesh,
   6692 			&auth_xfer_probe_lookup_callback, xfr);
   6693 	/* we don't own this item anymore */
   6694 	xfr->task_probe->worker = NULL;
   6695 	xfr->task_probe->env = NULL;
   6696 }
   6697 
   6698 /** send the UDP probe to the master, this is part of task_probe */
   6699 static int
   6700 xfr_probe_send_probe(struct auth_xfer* xfr, struct module_env* env,
   6701 	int timeout)
   6702 {
   6703 	struct sockaddr_storage addr;
   6704 	socklen_t addrlen = 0;
   6705 	struct timeval t;
   6706 	/* pick master */
   6707 	struct auth_master* master = xfr_probe_current_master(xfr);
   6708 	char *auth_name = NULL;
   6709 	if(!master) return 0;
   6710 	if(master->allow_notify) return 0; /* only for notify */
   6711 	if(master->http) return 0; /* only masters get SOA UDP probe,
   6712 		not urls, if those are in this list */
   6713 
   6714 	/* get master addr */
   6715 	if(xfr->task_probe->scan_addr) {
   6716 		addrlen = xfr->task_probe->scan_addr->addrlen;
   6717 		memmove(&addr, &xfr->task_probe->scan_addr->addr, addrlen);
   6718 	} else {
   6719 		if(!authextstrtoaddr(master->host, &addr, &addrlen, &auth_name)) {
   6720 			/* the ones that are not in addr format are supposed
   6721 			 * to be looked up.  The lookup has failed however,
   6722 			 * so skip them */
   6723 			char zname[LDNS_MAX_DOMAINLEN];
   6724 			dname_str(xfr->name, zname);
   6725 			log_err("%s: failed lookup, cannot probe to master %s",
   6726 				zname, master->host);
   6727 			return 0;
   6728 		}
   6729 		if (auth_name != NULL) {
   6730 			if (addr.ss_family == AF_INET
   6731 			&&  (int)ntohs(((struct sockaddr_in *)&addr)->sin_port)
   6732 		            == env->cfg->ssl_port)
   6733 				((struct sockaddr_in *)&addr)->sin_port
   6734 					= htons((uint16_t)env->cfg->port);
   6735 			else if (addr.ss_family == AF_INET6
   6736 			&&  (int)ntohs(((struct sockaddr_in6 *)&addr)->sin6_port)
   6737 		            == env->cfg->ssl_port)
   6738                         	((struct sockaddr_in6 *)&addr)->sin6_port
   6739 					= htons((uint16_t)env->cfg->port);
   6740 		}
   6741 	}
   6742 
   6743 	/* create packet */
   6744 	/* create new ID for new probes, but not on timeout retries,
   6745 	 * this means we'll accept replies to previous retries to same ip */
   6746 	if(timeout == AUTH_PROBE_TIMEOUT)
   6747 		xfr->task_probe->id = GET_RANDOM_ID(env->rnd);
   6748 	xfr_create_soa_probe_packet(xfr, env->scratch_buffer,
   6749 		xfr->task_probe->id);
   6750 	/* we need to remove the cp if we have a different ip4/ip6 type now */
   6751 	if(xfr->task_probe->cp &&
   6752 		((xfr->task_probe->cp_is_ip6 && !addr_is_ip6(&addr, addrlen)) ||
   6753 		(!xfr->task_probe->cp_is_ip6 && addr_is_ip6(&addr, addrlen)))
   6754 		) {
   6755 		comm_point_delete(xfr->task_probe->cp);
   6756 		xfr->task_probe->cp = NULL;
   6757 	}
   6758 	if(!xfr->task_probe->cp) {
   6759 		if(addr_is_ip6(&addr, addrlen))
   6760 			xfr->task_probe->cp_is_ip6 = 1;
   6761 		else 	xfr->task_probe->cp_is_ip6 = 0;
   6762 		xfr->task_probe->cp = outnet_comm_point_for_udp(env->outnet,
   6763 			auth_xfer_probe_udp_callback, xfr, &addr, addrlen);
   6764 		if(!xfr->task_probe->cp) {
   6765 			char zname[LDNS_MAX_DOMAINLEN], as[256];
   6766 			dname_str(xfr->name, zname);
   6767 			addr_port_to_str(&addr, addrlen, as, sizeof(as));
   6768 			verbose(VERB_ALGO, "cannot create udp cp for "
   6769 				"probe %s to %s", zname, as);
   6770 			return 0;
   6771 		}
   6772 	}
   6773 	if(!xfr->task_probe->timer) {
   6774 		xfr->task_probe->timer = comm_timer_create(env->worker_base,
   6775 			auth_xfer_probe_timer_callback, xfr);
   6776 		if(!xfr->task_probe->timer) {
   6777 			log_err("malloc failure");
   6778 			return 0;
   6779 		}
   6780 	}
   6781 
   6782 	/* send udp packet */
   6783 	if(!comm_point_send_udp_msg(xfr->task_probe->cp, env->scratch_buffer,
   6784 		(struct sockaddr*)&addr, addrlen, 0)) {
   6785 		char zname[LDNS_MAX_DOMAINLEN], as[256];
   6786 		dname_str(xfr->name, zname);
   6787 		addr_port_to_str(&addr, addrlen, as, sizeof(as));
   6788 		verbose(VERB_ALGO, "failed to send soa probe for %s to %s",
   6789 			zname, as);
   6790 		return 0;
   6791 	}
   6792 	if(verbosity >= VERB_ALGO) {
   6793 		char zname[LDNS_MAX_DOMAINLEN], as[256];
   6794 		dname_str(xfr->name, zname);
   6795 		addr_port_to_str(&addr, addrlen, as, sizeof(as));
   6796 		verbose(VERB_ALGO, "auth zone %s soa probe sent to %s", zname,
   6797 			as);
   6798 	}
   6799 	xfr->task_probe->timeout = timeout;
   6800 #ifndef S_SPLINT_S
   6801 	t.tv_sec = timeout/1000;
   6802 	t.tv_usec = (timeout%1000)*1000;
   6803 #endif
   6804 	comm_timer_set(xfr->task_probe->timer, &t);
   6805 
   6806 	return 1;
   6807 }
   6808 
   6809 /** callback for task_probe timer */
   6810 void
   6811 auth_xfer_probe_timer_callback(void* arg)
   6812 {
   6813 	struct auth_xfer* xfr = (struct auth_xfer*)arg;
   6814 	struct module_env* env;
   6815 	log_assert(xfr->task_probe);
   6816 	lock_basic_lock(&xfr->lock);
   6817 	env = xfr->task_probe->env;
   6818 	if(!env || env->outnet->want_to_quit) {
   6819 		lock_basic_unlock(&xfr->lock);
   6820 		return; /* stop on quit */
   6821 	}
   6822 
   6823 	if(verbosity >= VERB_ALGO) {
   6824 		char zname[LDNS_MAX_DOMAINLEN];
   6825 		dname_str(xfr->name, zname);
   6826 		verbose(VERB_ALGO, "auth zone %s soa probe timeout", zname);
   6827 	}
   6828 	if(xfr->task_probe->timeout <= AUTH_PROBE_TIMEOUT_STOP) {
   6829 		/* try again with bigger timeout */
   6830 		if(xfr_probe_send_probe(xfr, env, xfr->task_probe->timeout*2)) {
   6831 			lock_basic_unlock(&xfr->lock);
   6832 			return;
   6833 		}
   6834 	}
   6835 	/* delete commpoint so a new one is created, with a fresh port nr */
   6836 	comm_point_delete(xfr->task_probe->cp);
   6837 	xfr->task_probe->cp = NULL;
   6838 
   6839 	/* too many timeouts (or fail to send), move to next or end */
   6840 	xfr_probe_nextmaster(xfr);
   6841 	xfr_probe_send_or_end(xfr, env);
   6842 }
   6843 
   6844 /** callback for task_probe udp packets */
   6845 int
   6846 auth_xfer_probe_udp_callback(struct comm_point* c, void* arg, int err,
   6847 	struct comm_reply* repinfo)
   6848 {
   6849 	struct auth_xfer* xfr = (struct auth_xfer*)arg;
   6850 	struct module_env* env;
   6851 	log_assert(xfr->task_probe);
   6852 	lock_basic_lock(&xfr->lock);
   6853 	env = xfr->task_probe->env;
   6854 	if(!env || env->outnet->want_to_quit) {
   6855 		lock_basic_unlock(&xfr->lock);
   6856 		return 0; /* stop on quit */
   6857 	}
   6858 
   6859 	/* the comm_point_udp_callback is in a for loop for NUM_UDP_PER_SELECT
   6860 	 * and we set rep.c=NULL to stop if from looking inside the commpoint*/
   6861 	repinfo->c = NULL;
   6862 	/* stop the timer */
   6863 	comm_timer_disable(xfr->task_probe->timer);
   6864 
   6865 	/* see if we got a packet and what that means */
   6866 	if(err == NETEVENT_NOERROR) {
   6867 		uint32_t serial = 0;
   6868 		if(check_packet_ok(c->buffer, LDNS_RR_TYPE_SOA, xfr,
   6869 			&serial)) {
   6870 			/* successful lookup */
   6871 			if(verbosity >= VERB_ALGO) {
   6872 				char buf[LDNS_MAX_DOMAINLEN];
   6873 				dname_str(xfr->name, buf);
   6874 				verbose(VERB_ALGO, "auth zone %s: soa probe "
   6875 					"serial is %u", buf, (unsigned)serial);
   6876 			}
   6877 			/* see if this serial indicates that the zone has
   6878 			 * to be updated */
   6879 			if(xfr_serial_means_update(xfr, serial)) {
   6880 				/* if updated, start the transfer task, if needed */
   6881 				verbose(VERB_ALGO, "auth_zone updated, start transfer");
   6882 				if(xfr->task_transfer->worker == NULL) {
   6883 					struct auth_master* master =
   6884 						xfr_probe_current_master(xfr);
   6885 					/* if we have download URLs use them
   6886 					 * in preference to this master we
   6887 					 * just probed the SOA from */
   6888 					if(xfr->task_transfer->masters &&
   6889 						xfr->task_transfer->masters->http)
   6890 						master = NULL;
   6891 					xfr_probe_disown(xfr);
   6892 					xfr_start_transfer(xfr, env, master);
   6893 					return 0;
   6894 
   6895 				}
   6896 				/* other tasks are running, we don't do this anymore */
   6897 				xfr_probe_disown(xfr);
   6898 				lock_basic_unlock(&xfr->lock);
   6899 				/* return, we don't sent a reply to this udp packet,
   6900 				 * and we setup the tasks to do next */
   6901 				return 0;
   6902 			} else {
   6903 				verbose(VERB_ALGO, "auth_zone master reports unchanged soa serial");
   6904 				/* we if cannot find updates amongst the
   6905 				 * masters, this means we then have a new lease
   6906 				 * on the zone */
   6907 				xfr->task_probe->have_new_lease = 1;
   6908 			}
   6909 		} else {
   6910 			if(verbosity >= VERB_ALGO) {
   6911 				char buf[LDNS_MAX_DOMAINLEN];
   6912 				dname_str(xfr->name, buf);
   6913 				verbose(VERB_ALGO, "auth zone %s: bad reply to soa probe", buf);
   6914 			}
   6915 		}
   6916 	} else {
   6917 		if(verbosity >= VERB_ALGO) {
   6918 			char buf[LDNS_MAX_DOMAINLEN];
   6919 			dname_str(xfr->name, buf);
   6920 			verbose(VERB_ALGO, "auth zone %s: soa probe failed", buf);
   6921 		}
   6922 	}
   6923 
   6924 	/* failed lookup or not an update */
   6925 	/* delete commpoint so a new one is created, with a fresh port nr */
   6926 	comm_point_delete(xfr->task_probe->cp);
   6927 	xfr->task_probe->cp = NULL;
   6928 
   6929 	/* if the result was not a successful probe, we need
   6930 	 * to send the next one */
   6931 	xfr_probe_nextmaster(xfr);
   6932 	xfr_probe_send_or_end(xfr, env);
   6933 	return 0;
   6934 }
   6935 
   6936 /** lookup a host name for its addresses, if needed */
   6937 static int
   6938 xfr_probe_lookup_host(struct auth_xfer* xfr, struct module_env* env)
   6939 {
   6940 	struct sockaddr_storage addr;
   6941 	socklen_t addrlen = 0;
   6942 	struct auth_master* master = xfr->task_probe->lookup_target;
   6943 	struct query_info qinfo;
   6944 	uint16_t qflags = BIT_RD;
   6945 	uint8_t dname[LDNS_MAX_DOMAINLEN+1];
   6946 	struct edns_data edns;
   6947 	sldns_buffer* buf = env->scratch_buffer;
   6948 	if(!master) return 0;
   6949 	if(extstrtoaddr(master->host, &addr, &addrlen, UNBOUND_DNS_PORT)) {
   6950 		/* not needed, host is in IP addr format */
   6951 		return 0;
   6952 	}
   6953 	if(master->allow_notify && !master->http &&
   6954 		strchr(master->host, '/') != NULL &&
   6955 		strchr(master->host, '/') == strrchr(master->host, '/')) {
   6956 		return 0; /* is IP/prefix format, not something to look up */
   6957 	}
   6958 
   6959 	/* use mesh_new_callback to probe for non-addr hosts,
   6960 	 * and then wait for them to be looked up (in cache, or query) */
   6961 	qinfo.qname_len = sizeof(dname);
   6962 	if(sldns_str2wire_dname_buf(master->host, dname, &qinfo.qname_len)
   6963 		!= 0) {
   6964 		log_err("cannot parse host name of master %s", master->host);
   6965 		return 0;
   6966 	}
   6967 	qinfo.qname = dname;
   6968 	qinfo.qclass = xfr->dclass;
   6969 	qinfo.qtype = LDNS_RR_TYPE_A;
   6970 	if(xfr->task_probe->lookup_aaaa)
   6971 		qinfo.qtype = LDNS_RR_TYPE_AAAA;
   6972 	qinfo.local_alias = NULL;
   6973 	if(verbosity >= VERB_ALGO) {
   6974 		char buf1[512];
   6975 		char buf2[LDNS_MAX_DOMAINLEN];
   6976 		dname_str(xfr->name, buf2);
   6977 		snprintf(buf1, sizeof(buf1), "auth zone %s: master lookup"
   6978 			" for task_probe", buf2);
   6979 		log_query_info(VERB_ALGO, buf1, &qinfo);
   6980 	}
   6981 	edns.edns_present = 1;
   6982 	edns.ext_rcode = 0;
   6983 	edns.edns_version = 0;
   6984 	edns.bits = EDNS_DO;
   6985 	edns.opt_list_in = NULL;
   6986 	edns.opt_list_out = NULL;
   6987 	edns.opt_list_inplace_cb_out = NULL;
   6988 	edns.padding_block_size = 0;
   6989 	edns.cookie_present = 0;
   6990 	edns.cookie_valid = 0;
   6991 	if(sldns_buffer_capacity(buf) < 65535)
   6992 		edns.udp_size = (uint16_t)sldns_buffer_capacity(buf);
   6993 	else	edns.udp_size = 65535;
   6994 
   6995 	/* unlock xfr during mesh_new_callback() because the callback can be
   6996 	 * called straight away */
   6997 	lock_basic_unlock(&xfr->lock);
   6998 	if(!mesh_new_callback(env->mesh, &qinfo, qflags, &edns, buf, 0,
   6999 		&auth_xfer_probe_lookup_callback, xfr, 0,
   7000 		&xfr->task_probe->lookup_unique_info)) {
   7001 		lock_basic_lock(&xfr->lock);
   7002 		log_err("out of memory lookup up master %s", master->host);
   7003 		return 0;
   7004 	}
   7005 	lock_basic_lock(&xfr->lock);
   7006 	return 1;
   7007 }
   7008 
   7009 /** return true if there are probe (SOA UDP query) targets in the master list*/
   7010 static int
   7011 have_probe_targets(struct auth_master* list)
   7012 {
   7013 	struct auth_master* p;
   7014 	for(p=list; p; p = p->next) {
   7015 		if(!p->allow_notify && p->host)
   7016 			return 1;
   7017 	}
   7018 	return 0;
   7019 }
   7020 
   7021 /** move to sending the probe packets, next if fails. task_probe */
   7022 static void
   7023 xfr_probe_send_or_end(struct auth_xfer* xfr, struct module_env* env)
   7024 {
   7025 	/* are we doing hostname lookups? */
   7026 	while(xfr->task_probe->lookup_target) {
   7027 		if(xfr_probe_lookup_host(xfr, env)) {
   7028 			/* wait for lookup to finish,
   7029 			 * note that the hostname may be in unbound's cache
   7030 			 * and we may then get an instant cache response,
   7031 			 * and that calls the callback just like a full
   7032 			 * lookup and lookup failures also call callback */
   7033 			if(verbosity >= VERB_ALGO) {
   7034 				char zname[LDNS_MAX_DOMAINLEN];
   7035 				dname_str(xfr->name, zname);
   7036 				verbose(VERB_ALGO, "auth zone %s probe next target lookup", zname);
   7037 			}
   7038 			lock_basic_unlock(&xfr->lock);
   7039 			return;
   7040 		}
   7041 		xfr_probe_move_to_next_lookup(xfr, env);
   7042 	}
   7043 	/* probe of list has ended.  Create or refresh the list of of
   7044 	 * allow_notify addrs */
   7045 	probe_copy_masters_for_allow_notify(xfr);
   7046 	if(verbosity >= VERB_ALGO) {
   7047 		char zname[LDNS_MAX_DOMAINLEN];
   7048 		dname_str(xfr->name, zname);
   7049 		verbose(VERB_ALGO, "auth zone %s probe: notify addrs updated", zname);
   7050 	}
   7051 	if(xfr->task_probe->only_lookup) {
   7052 		/* only wanted lookups for copy, stop probe and start wait */
   7053 		xfr->task_probe->only_lookup = 0;
   7054 		if(verbosity >= VERB_ALGO) {
   7055 			char zname[LDNS_MAX_DOMAINLEN];
   7056 			dname_str(xfr->name, zname);
   7057 			verbose(VERB_ALGO, "auth zone %s probe: finished only_lookup", zname);
   7058 		}
   7059 		xfr_probe_disown(xfr);
   7060 		if(!have_probe_targets(xfr->task_probe->masters)) {
   7061 			/* If there are no masters to probe, go to transfer. */
   7062 			if(xfr->task_transfer->worker == NULL) {
   7063 				xfr_start_transfer(xfr, env, NULL);
   7064 				return;
   7065 			}
   7066 			/* The transfer is already in progress. */
   7067 			lock_basic_unlock(&xfr->lock);
   7068 			return;
   7069 		}
   7070 		if(xfr->task_nextprobe->worker == NULL)
   7071 			xfr_set_timeout(xfr, env, 0, 0);
   7072 		lock_basic_unlock(&xfr->lock);
   7073 		return;
   7074 	}
   7075 
   7076 	/* send probe packets */
   7077 	while(!xfr_probe_end_of_list(xfr)) {
   7078 		if(xfr_probe_send_probe(xfr, env, AUTH_PROBE_TIMEOUT)) {
   7079 			/* successfully sent probe, wait for callback */
   7080 			lock_basic_unlock(&xfr->lock);
   7081 			return;
   7082 		}
   7083 		/* failed to send probe, next master */
   7084 		xfr_probe_nextmaster(xfr);
   7085 	}
   7086 
   7087 	/* done with probe sequence, wait */
   7088 	if(xfr->task_probe->have_new_lease) {
   7089 		/* if zone not updated, start the wait timer again */
   7090 		if(verbosity >= VERB_ALGO) {
   7091 			char zname[LDNS_MAX_DOMAINLEN];
   7092 			dname_str(xfr->name, zname);
   7093 			verbose(VERB_ALGO, "auth_zone %s unchanged, new lease, wait", zname);
   7094 		}
   7095 		xfr_probe_disown(xfr);
   7096 		if(xfr->have_zone)
   7097 			xfr->lease_time = *env->now;
   7098 		if(xfr->task_nextprobe->worker == NULL)
   7099 			xfr_set_timeout(xfr, env, 0, 0);
   7100 	} else {
   7101 		if(verbosity >= VERB_ALGO) {
   7102 			char zname[LDNS_MAX_DOMAINLEN];
   7103 			dname_str(xfr->name, zname);
   7104 			verbose(VERB_ALGO, "auth zone %s soa probe failed, wait to retry", zname);
   7105 		}
   7106 		/* we failed to send this as well, move to the wait task,
   7107 		 * use the shorter retry timeout */
   7108 		xfr_probe_disown(xfr);
   7109 		/* pick up the nextprobe task and wait */
   7110 		if(xfr->task_nextprobe->worker == NULL)
   7111 			xfr_set_timeout(xfr, env, 1, 0);
   7112 	}
   7113 
   7114 	lock_basic_unlock(&xfr->lock);
   7115 }
   7116 
   7117 /** callback for task_probe lookup of host name, of A or AAAA */
   7118 void auth_xfer_probe_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
   7119 	enum sec_status sec, char* why_bogus, int ATTR_UNUSED(was_ratelimited))
   7120 {
   7121 	struct auth_xfer* xfr = (struct auth_xfer*)arg;
   7122 	struct module_env* env;
   7123 	log_assert(xfr->task_probe);
   7124 	lock_basic_lock(&xfr->lock);
   7125 	env = xfr->task_probe->env;
   7126 	if(!env || env->outnet->want_to_quit) {
   7127 		lock_basic_unlock(&xfr->lock);
   7128 		return; /* stop on quit */
   7129 	}
   7130 
   7131 	/* process result */
   7132 	if(sec == sec_status_bogus || sec == sec_status_secure_sentinel_fail) {
   7133 		if(verbosity >= VERB_OPS) {
   7134 			char zname[LDNS_MAX_DOMAINLEN];
   7135 			dname_str(xfr->name, zname);
   7136 			verbose(VERB_OPS, "auth zone %s: primary %s address probe lookup is DNSSEC bogus: %s",
   7137 				zname, xfr->task_probe->lookup_target->host,
   7138 				(why_bogus?why_bogus:""));
   7139 		}
   7140 		/* fall through to next-lookup / next-master */
   7141 	} else if(rcode == LDNS_RCODE_NOERROR) {
   7142 		uint16_t wanted_qtype = LDNS_RR_TYPE_A;
   7143 		struct regional* temp = env->scratch;
   7144 		struct query_info rq;
   7145 		struct reply_info* rep;
   7146 		if(xfr->task_probe->lookup_aaaa)
   7147 			wanted_qtype = LDNS_RR_TYPE_AAAA;
   7148 		memset(&rq, 0, sizeof(rq));
   7149 		rep = parse_reply_in_temp_region(buf, temp, &rq);
   7150 		if(rep && rq.qtype == wanted_qtype &&
   7151 			FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NOERROR) {
   7152 			/* parsed successfully */
   7153 			struct ub_packed_rrset_key* answer =
   7154 				reply_find_answer_rrset(&rq, rep);
   7155 			if(answer && xfer_target_equals_answer_name(
   7156 				xfr->task_probe->lookup_target, answer,
   7157 				&rq, rep)) {
   7158 				xfr_master_add_addrs(xfr->task_probe->
   7159 					lookup_target, answer, wanted_qtype);
   7160 			} else if(answer) {
   7161 				if(verbosity >= VERB_ALGO) {
   7162 					char zname[LDNS_MAX_DOMAINLEN];
   7163 					dname_str(xfr->name, zname);
   7164 					verbose(VERB_ALGO, "auth zone %s host %s type %s probe lookup has mismatch in answer name", zname, ((xfr->task_probe->lookup_target && xfr->task_probe->lookup_target->host) ? xfr->task_probe->lookup_target->host : "null"), (xfr->task_probe->lookup_aaaa?"AAAA":"A"));
   7165 				}
   7166 			} else {
   7167 				if(verbosity >= VERB_ALGO) {
   7168 					char zname[LDNS_MAX_DOMAINLEN];
   7169 					dname_str(xfr->name, zname);
   7170 					verbose(VERB_ALGO, "auth zone %s host %s type %s probe lookup has nodata", zname, ((xfr->task_probe->lookup_target && xfr->task_probe->lookup_target->host) ? xfr->task_probe->lookup_target->host : "null"), (xfr->task_probe->lookup_aaaa?"AAAA":"A"));
   7171 				}
   7172 			}
   7173 		} else {
   7174 			if(verbosity >= VERB_ALGO) {
   7175 				char zname[LDNS_MAX_DOMAINLEN];
   7176 				dname_str(xfr->name, zname);
   7177 				verbose(VERB_ALGO, "auth zone %s host %s type %s probe lookup has no address", zname, ((xfr->task_probe->lookup_target && xfr->task_probe->lookup_target->host) ? xfr->task_probe->lookup_target->host : "null"), (xfr->task_probe->lookup_aaaa?"AAAA":"A"));
   7178 			}
   7179 		}
   7180 		regional_free_all(temp);
   7181 	} else {
   7182 		if(verbosity >= VERB_ALGO) {
   7183 			char zname[LDNS_MAX_DOMAINLEN];
   7184 			dname_str(xfr->name, zname);
   7185 			verbose(VERB_ALGO, "auth zone %s host %s type %s probe lookup failed", zname, ((xfr->task_probe->lookup_target && xfr->task_probe->lookup_target->host) ? xfr->task_probe->lookup_target->host : "null"), (xfr->task_probe->lookup_aaaa?"AAAA":"A"));
   7186 		}
   7187 	}
   7188 	if(xfr->task_probe->lookup_target &&
   7189 		xfr->task_probe->lookup_target->list &&
   7190 		xfr->task_probe->lookup_target == xfr_probe_current_master(xfr))
   7191 		xfr->task_probe->scan_addr = xfr->task_probe->lookup_target->list;
   7192 
   7193 	/* move to lookup AAAA after A lookup, move to next hostname lookup,
   7194 	 * or move to send the probes, or, if nothing to do, end task_probe */
   7195 	xfr_probe_move_to_next_lookup(xfr, env);
   7196 	xfr_probe_send_or_end(xfr, env);
   7197 }
   7198 
   7199 /** disown task_nextprobe.  caller must hold xfr.lock */
   7200 static void
   7201 xfr_nextprobe_disown(struct auth_xfer* xfr)
   7202 {
   7203 	/* delete the timer, because the next worker to pick this up may
   7204 	 * not have the same event base */
   7205 	comm_timer_delete(xfr->task_nextprobe->timer);
   7206 	xfr->task_nextprobe->timer = NULL;
   7207 	xfr->task_nextprobe->next_probe = 0;
   7208 	/* we don't own this item anymore */
   7209 	xfr->task_nextprobe->worker = NULL;
   7210 	xfr->task_nextprobe->env = NULL;
   7211 }
   7212 
   7213 /** xfer nextprobe timeout callback, this is part of task_nextprobe */
   7214 void
   7215 auth_xfer_timer(void* arg)
   7216 {
   7217 	struct auth_xfer* xfr = (struct auth_xfer*)arg;
   7218 	struct module_env* env;
   7219 	log_assert(xfr->task_nextprobe);
   7220 	lock_basic_lock(&xfr->lock);
   7221 	env = xfr->task_nextprobe->env;
   7222 	if(!env || env->outnet->want_to_quit) {
   7223 		lock_basic_unlock(&xfr->lock);
   7224 		return; /* stop on quit */
   7225 	}
   7226 
   7227 	/* see if zone has expired, and if so, also set auth_zone expired */
   7228 	if(xfr->have_zone && !xfr->zone_expired &&
   7229 	   *env->now >= xfr->lease_time + xfr->expiry) {
   7230 		lock_basic_unlock(&xfr->lock);
   7231 		auth_xfer_set_expired(xfr, env, 1);
   7232 		lock_basic_lock(&xfr->lock);
   7233 	}
   7234 
   7235 	xfr_nextprobe_disown(xfr);
   7236 
   7237 	if(!xfr_start_probe(xfr, env, NULL)) {
   7238 		/* not started because already in progress */
   7239 		lock_basic_unlock(&xfr->lock);
   7240 	}
   7241 }
   7242 
   7243 /** start task_probe if possible, if no masters for probe start task_transfer
   7244  * returns true if task has been started, and false if the task is already
   7245  * in progress. */
   7246 static int
   7247 xfr_start_probe(struct auth_xfer* xfr, struct module_env* env,
   7248 	struct auth_master* spec)
   7249 {
   7250 	/* see if we need to start a probe (or maybe it is already in
   7251 	 * progress (due to notify)) */
   7252 	if(xfr->task_probe->worker == NULL) {
   7253 		if(!have_probe_targets(xfr->task_probe->masters) &&
   7254 			xfr->task_probe->masters != NULL)
   7255 			xfr->task_probe->only_lookup = 1;
   7256 		if(!xfr->task_probe->only_lookup &&
   7257 			!have_probe_targets(xfr->task_probe->masters)) {
   7258 			/* useless to pick up task_probe, no masters to
   7259 			 * probe. Instead attempt to pick up task transfer */
   7260 			if(xfr->task_transfer->worker == NULL) {
   7261 				xfr_start_transfer(xfr, env, spec);
   7262 				return 1;
   7263 			}
   7264 			/* task transfer already in progress */
   7265 			return 0;
   7266 		}
   7267 
   7268 		/* pick up the probe task ourselves */
   7269 		xfr->task_probe->worker = env->worker;
   7270 		xfr->task_probe->env = env;
   7271 		xfr->task_probe->cp = NULL;
   7272 
   7273 		/* start the task */
   7274 		/* have not seen a new lease yet, this scan */
   7275 		xfr->task_probe->have_new_lease = 0;
   7276 		/* if this was a timeout, no specific first master to scan */
   7277 		/* otherwise, spec is nonNULL the notified master, scan
   7278 		 * first and also transfer first from it */
   7279 		xfr_probe_start_list(xfr, spec);
   7280 		/* setup to start the lookup of hostnames of masters afresh */
   7281 		xfr_probe_start_lookups(xfr);
   7282 		/* send the probe packet or next send, or end task */
   7283 		xfr_probe_send_or_end(xfr, env);
   7284 		return 1;
   7285 	}
   7286 	return 0;
   7287 }
   7288 
   7289 /** for task_nextprobe.
   7290  * determine next timeout for auth_xfer. Also (re)sets timer.
   7291  * @param xfr: task structure
   7292  * @param env: module environment, with worker and time.
   7293  * @param failure: set true if timer should be set for failure retry.
   7294  * @param lookup_only: only perform lookups when timer done, 0 sec timeout
   7295  */
   7296 static void
   7297 xfr_set_timeout(struct auth_xfer* xfr, struct module_env* env,
   7298 	int failure, int lookup_only)
   7299 {
   7300 	struct timeval tv;
   7301 	log_assert(xfr->task_nextprobe != NULL);
   7302 	log_assert(xfr->task_nextprobe->worker == NULL ||
   7303 		xfr->task_nextprobe->worker == env->worker);
   7304 	/* normally, nextprobe = startoflease + refresh,
   7305 	 * but if expiry is sooner, use that one.
   7306 	 * after a failure, use the retry timer instead. */
   7307 	xfr->task_nextprobe->next_probe = *env->now;
   7308 	if(xfr->lease_time && !failure)
   7309 		xfr->task_nextprobe->next_probe = xfr->lease_time;
   7310 
   7311 	if(!failure) {
   7312 		xfr->task_nextprobe->backoff = 0;
   7313 	} else {
   7314 		if(xfr->task_nextprobe->backoff == 0)
   7315 				xfr->task_nextprobe->backoff = 3;
   7316 		else	xfr->task_nextprobe->backoff *= 2;
   7317 		if(xfr->task_nextprobe->backoff > AUTH_TRANSFER_MAX_BACKOFF)
   7318 			xfr->task_nextprobe->backoff =
   7319 				AUTH_TRANSFER_MAX_BACKOFF;
   7320 	}
   7321 
   7322 	if(xfr->have_zone) {
   7323 		time_t wait = xfr->refresh;
   7324 		if(failure) wait = xfr->retry;
   7325 		if(xfr->expiry < wait)
   7326 			xfr->task_nextprobe->next_probe += xfr->expiry;
   7327 		else	xfr->task_nextprobe->next_probe += wait;
   7328 		if(failure)
   7329 			xfr->task_nextprobe->next_probe +=
   7330 				xfr->task_nextprobe->backoff;
   7331 		/* put the timer exactly on expiry, if possible */
   7332 		if(xfr->lease_time && xfr->lease_time+xfr->expiry <
   7333 			xfr->task_nextprobe->next_probe &&
   7334 			xfr->lease_time+xfr->expiry > *env->now)
   7335 			xfr->task_nextprobe->next_probe =
   7336 				xfr->lease_time+xfr->expiry;
   7337 	} else {
   7338 		xfr->task_nextprobe->next_probe +=
   7339 			xfr->task_nextprobe->backoff;
   7340 	}
   7341 
   7342 	if(!xfr->task_nextprobe->timer) {
   7343 		xfr->task_nextprobe->timer = comm_timer_create(
   7344 			env->worker_base, auth_xfer_timer, xfr);
   7345 		if(!xfr->task_nextprobe->timer) {
   7346 			/* failed to malloc memory. likely zone transfer
   7347 			 * also fails for that. skip the timeout */
   7348 			char zname[LDNS_MAX_DOMAINLEN];
   7349 			dname_str(xfr->name, zname);
   7350 			log_err("cannot allocate timer, no refresh for %s",
   7351 				zname);
   7352 			return;
   7353 		}
   7354 	}
   7355 	xfr->task_nextprobe->worker = env->worker;
   7356 	xfr->task_nextprobe->env = env;
   7357 	if(*(xfr->task_nextprobe->env->now) <= xfr->task_nextprobe->next_probe)
   7358 		tv.tv_sec = xfr->task_nextprobe->next_probe -
   7359 			*(xfr->task_nextprobe->env->now);
   7360 	else	tv.tv_sec = 0;
   7361 	if(tv.tv_sec != 0 && lookup_only && xfr->task_probe->masters) {
   7362 		/* don't lookup_only, if lookup timeout is 0 anyway,
   7363 		 * or if we don't have masters to lookup */
   7364 		tv.tv_sec = 0;
   7365 		if(xfr->task_probe->worker == NULL)
   7366 			xfr->task_probe->only_lookup = 1;
   7367 	}
   7368 	if(verbosity >= VERB_ALGO) {
   7369 		char zname[LDNS_MAX_DOMAINLEN];
   7370 		dname_str(xfr->name, zname);
   7371 		verbose(VERB_ALGO, "auth zone %s timeout in %d seconds",
   7372 			zname, (int)tv.tv_sec);
   7373 	}
   7374 	tv.tv_usec = 0;
   7375 	comm_timer_set(xfr->task_nextprobe->timer, &tv);
   7376 }
   7377 
   7378 void auth_zone_pickup_initial_zone(struct auth_zone* z, struct module_env* env)
   7379 {
   7380 	/* Set the time, because we now have timestamp in env,
   7381 	 * (not earlier during startup and apply_cfg), and this
   7382 	 * notes the start time when the data was acquired. */
   7383 	z->soa_zone_acquired = *env->now;
   7384 }
   7385 
   7386 void auth_xfer_pickup_initial_zone(struct auth_xfer* x, struct module_env* env)
   7387 {
   7388 	/* set lease_time, because we now have timestamp in env,
   7389 	 * (not earlier during startup and apply_cfg), and this
   7390 	 * notes the start time when the data was acquired */
   7391 	if(x->have_zone) {
   7392 		x->lease_time = *env->now;
   7393 		x->soa_zone_acquired = *env->now;
   7394 	}
   7395 	if(x->task_nextprobe && x->task_nextprobe->worker == NULL) {
   7396 		xfr_set_timeout(x, env, 0, 1);
   7397 	}
   7398 }
   7399 
   7400 /** initial pick up of worker timeouts, ties events to worker event loop */
   7401 void
   7402 auth_xfer_pickup_initial(struct auth_zones* az, struct module_env* env)
   7403 {
   7404 	struct auth_xfer* x;
   7405 	struct auth_zone* z;
   7406 	lock_rw_wrlock(&az->lock);
   7407 	RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
   7408 		lock_rw_wrlock(&z->lock);
   7409 		auth_zone_pickup_initial_zone(z, env);
   7410 		lock_rw_unlock(&z->lock);
   7411 	}
   7412 	RBTREE_FOR(x, struct auth_xfer*, &az->xtree) {
   7413 		lock_basic_lock(&x->lock);
   7414 		auth_xfer_pickup_initial_zone(x, env);
   7415 		lock_basic_unlock(&x->lock);
   7416 	}
   7417 	lock_rw_unlock(&az->lock);
   7418 }
   7419 
   7420 void auth_zones_cleanup(struct auth_zones* az)
   7421 {
   7422 	struct auth_xfer* x;
   7423 	lock_rw_wrlock(&az->lock);
   7424 	RBTREE_FOR(x, struct auth_xfer*, &az->xtree) {
   7425 		lock_basic_lock(&x->lock);
   7426 		if(x->task_nextprobe && x->task_nextprobe->worker != NULL) {
   7427 			xfr_nextprobe_disown(x);
   7428 		}
   7429 		if(x->task_probe && x->task_probe->worker != NULL) {
   7430 			xfr_probe_disown(x);
   7431 		}
   7432 		if(x->task_transfer && x->task_transfer->worker != NULL) {
   7433 			auth_chunks_delete(x->task_transfer);
   7434 			xfr_transfer_disown(x);
   7435 		}
   7436 		lock_basic_unlock(&x->lock);
   7437 	}
   7438 	lock_rw_unlock(&az->lock);
   7439 }
   7440 
   7441 /**
   7442  * malloc the xfer and tasks
   7443  * @param z: auth_zone with name of zone.
   7444  */
   7445 static struct auth_xfer*
   7446 auth_xfer_new(struct auth_zone* z)
   7447 {
   7448 	struct auth_xfer* xfr;
   7449 	xfr = (struct auth_xfer*)calloc(1, sizeof(*xfr));
   7450 	if(!xfr) return NULL;
   7451 	xfr->name = memdup(z->name, z->namelen);
   7452 	if(!xfr->name) {
   7453 		free(xfr);
   7454 		return NULL;
   7455 	}
   7456 	xfr->node.key = xfr;
   7457 	xfr->namelen = z->namelen;
   7458 	xfr->namelabs = z->namelabs;
   7459 	xfr->dclass = z->dclass;
   7460 	xfr->max_transfer_size = z->max_transfer_size;
   7461 	xfr->max_transfer_time = z->max_transfer_time;
   7462 
   7463 	xfr->task_nextprobe = (struct auth_nextprobe*)calloc(1,
   7464 		sizeof(struct auth_nextprobe));
   7465 	if(!xfr->task_nextprobe) {
   7466 		free(xfr->name);
   7467 		free(xfr);
   7468 		return NULL;
   7469 	}
   7470 	xfr->task_probe = (struct auth_probe*)calloc(1,
   7471 		sizeof(struct auth_probe));
   7472 	if(!xfr->task_probe) {
   7473 		free(xfr->task_nextprobe);
   7474 		free(xfr->name);
   7475 		free(xfr);
   7476 		return NULL;
   7477 	}
   7478 	xfr->task_transfer = (struct auth_transfer*)calloc(1,
   7479 		sizeof(struct auth_transfer));
   7480 	if(!xfr->task_transfer) {
   7481 		free(xfr->task_probe);
   7482 		free(xfr->task_nextprobe);
   7483 		free(xfr->name);
   7484 		free(xfr);
   7485 		return NULL;
   7486 	}
   7487 
   7488 	lock_basic_init(&xfr->lock);
   7489 	lock_protect(&xfr->lock, &xfr->name, sizeof(xfr->name));
   7490 	lock_protect(&xfr->lock, &xfr->namelen, sizeof(xfr->namelen));
   7491 	lock_protect(&xfr->lock, xfr->name, xfr->namelen);
   7492 	lock_protect(&xfr->lock, &xfr->namelabs, sizeof(xfr->namelabs));
   7493 	lock_protect(&xfr->lock, &xfr->dclass, sizeof(xfr->dclass));
   7494 	lock_protect(&xfr->lock, &xfr->notify_received, sizeof(xfr->notify_received));
   7495 	lock_protect(&xfr->lock, &xfr->notify_serial, sizeof(xfr->notify_serial));
   7496 	lock_protect(&xfr->lock, &xfr->zone_expired, sizeof(xfr->zone_expired));
   7497 	lock_protect(&xfr->lock, &xfr->have_zone, sizeof(xfr->have_zone));
   7498 	lock_protect(&xfr->lock, &xfr->soa_zone_acquired, sizeof(xfr->soa_zone_acquired));
   7499 	lock_protect(&xfr->lock, &xfr->serial, sizeof(xfr->serial));
   7500 	lock_protect(&xfr->lock, &xfr->retry, sizeof(xfr->retry));
   7501 	lock_protect(&xfr->lock, &xfr->refresh, sizeof(xfr->refresh));
   7502 	lock_protect(&xfr->lock, &xfr->expiry, sizeof(xfr->expiry));
   7503 	lock_protect(&xfr->lock, &xfr->lease_time, sizeof(xfr->lease_time));
   7504 	lock_protect(&xfr->lock, &xfr->task_nextprobe->worker,
   7505 		sizeof(xfr->task_nextprobe->worker));
   7506 	lock_protect(&xfr->lock, &xfr->task_probe->worker,
   7507 		sizeof(xfr->task_probe->worker));
   7508 	lock_protect(&xfr->lock, &xfr->task_transfer->worker,
   7509 		sizeof(xfr->task_transfer->worker));
   7510 	lock_basic_lock(&xfr->lock);
   7511 	return xfr;
   7512 }
   7513 
   7514 /** Create auth_xfer structure.
   7515  * This populates the have_zone, soa values, and so on times.
   7516  * and sets the timeout, if a zone transfer is needed a short timeout is set.
   7517  * For that the auth_zone itself must exist (and read in zonefile)
   7518  * returns false on alloc failure. */
   7519 struct auth_xfer*
   7520 auth_xfer_create(struct auth_zones* az, struct auth_zone* z)
   7521 {
   7522 	struct auth_xfer* xfr;
   7523 
   7524 	/* malloc it */
   7525 	xfr = auth_xfer_new(z);
   7526 	if(!xfr) {
   7527 		log_err("malloc failure");
   7528 		return NULL;
   7529 	}
   7530 	/* insert in tree */
   7531 	(void)rbtree_insert(&az->xtree, &xfr->node);
   7532 	return xfr;
   7533 }
   7534 
   7535 /** create new auth_master structure */
   7536 static struct auth_master*
   7537 auth_master_new(struct auth_master*** list)
   7538 {
   7539 	struct auth_master *m;
   7540 	m = (struct auth_master*)calloc(1, sizeof(*m));
   7541 	if(!m) {
   7542 		log_err("malloc failure");
   7543 		return NULL;
   7544 	}
   7545 	/* set first pointer to m, or next pointer of previous element to m */
   7546 	(**list) = m;
   7547 	/* store m's next pointer as future point to store at */
   7548 	(*list) = &(m->next);
   7549 	return m;
   7550 }
   7551 
   7552 /** dup_prefix : create string from initial part of other string, malloced */
   7553 static char*
   7554 dup_prefix(char* str, size_t num)
   7555 {
   7556 	char* result;
   7557 	size_t len = strlen(str);
   7558 	if(len < num) num = len; /* not more than strlen */
   7559 	result = (char*)malloc(num+1);
   7560 	if(!result) {
   7561 		log_err("malloc failure");
   7562 		return result;
   7563 	}
   7564 	memmove(result, str, num);
   7565 	result[num] = 0;
   7566 	return result;
   7567 }
   7568 
   7569 /** dup string and print error on error */
   7570 static char*
   7571 dup_all(char* str)
   7572 {
   7573 	char* result = strdup(str);
   7574 	if(!result) {
   7575 		log_err("malloc failure");
   7576 		return NULL;
   7577 	}
   7578 	return result;
   7579 }
   7580 
   7581 /** find first of two characters */
   7582 static char*
   7583 str_find_first_of_chars(char* s, char a, char b)
   7584 {
   7585 	char* ra = strchr(s, a);
   7586 	char* rb = strchr(s, b);
   7587 	if(!ra) return rb;
   7588 	if(!rb) return ra;
   7589 	if(ra < rb) return ra;
   7590 	return rb;
   7591 }
   7592 
   7593 /** parse URL into host and file parts, false on malloc or parse error */
   7594 static int
   7595 parse_url(char* url, char** host, char** file, int* port, int* ssl)
   7596 {
   7597 	char* p = url;
   7598 	/* parse http://www.example.com/file.htm
   7599 	 * or http://127.0.0.1   (index.html)
   7600 	 * or https://[::1@1234]/a/b/c/d */
   7601 	*ssl = 1;
   7602 	*port = AUTH_HTTPS_PORT;
   7603 
   7604 	/* parse http:// or https:// */
   7605 	if(strncmp(p, "http://", 7) == 0) {
   7606 		p += 7;
   7607 		*ssl = 0;
   7608 		*port = AUTH_HTTP_PORT;
   7609 	} else if(strncmp(p, "https://", 8) == 0) {
   7610 		p += 8;
   7611 	} else if(strstr(p, "://") && strchr(p, '/') > strstr(p, "://") &&
   7612 		strchr(p, ':') >= strstr(p, "://")) {
   7613 		char* uri = dup_prefix(p, (size_t)(strstr(p, "://")-p));
   7614 		log_err("protocol %s:// not supported (for url %s)",
   7615 			uri?uri:"", p);
   7616 		free(uri);
   7617 		return 0;
   7618 	}
   7619 
   7620 	/* parse hostname part */
   7621 	if(p[0] == '[') {
   7622 		char* end = strchr(p, ']');
   7623 		p++; /* skip over [ */
   7624 		if(end) {
   7625 			*host = dup_prefix(p, (size_t)(end-p));
   7626 			if(!*host) return 0;
   7627 			p = end+1; /* skip over ] */
   7628 		} else {
   7629 			*host = dup_all(p);
   7630 			if(!*host) return 0;
   7631 			p = end;
   7632 		}
   7633 	} else {
   7634 		char* end = str_find_first_of_chars(p, ':', '/');
   7635 		if(end) {
   7636 			*host = dup_prefix(p, (size_t)(end-p));
   7637 			if(!*host) return 0;
   7638 		} else {
   7639 			*host = dup_all(p);
   7640 			if(!*host) return 0;
   7641 		}
   7642 		p = end; /* at next : or / or NULL */
   7643 	}
   7644 
   7645 	/* parse port number */
   7646 	if(p && p[0] == ':') {
   7647 		char* end = NULL;
   7648 		*port = strtol(p+1, &end, 10);
   7649 		p = end;
   7650 	}
   7651 
   7652 	/* parse filename part */
   7653 	while(p && *p == '/')
   7654 		p++;
   7655 	if(!p || p[0] == 0)
   7656 		*file = strdup("/");
   7657 	else	*file = strdup(p);
   7658 	if(!*file) {
   7659 		log_err("malloc failure");
   7660 		return 0;
   7661 	}
   7662 	return 1;
   7663 }
   7664 
   7665 int
   7666 xfer_set_masters(struct auth_master** list, struct config_auth* c,
   7667 	int with_http)
   7668 {
   7669 	struct auth_master* m;
   7670 	struct config_strlist* p;
   7671 	struct auth_master** tail;
   7672 	/* list points to the first, or next pointer for the new element */
   7673 	while(*list) {
   7674 		list = &( (*list)->next );
   7675 	}
   7676 	if(with_http)
   7677 	  for(p = c->urls; p; p = p->next) {
   7678 		tail = list;
   7679 		m = auth_master_new(&list);
   7680 		if(!m) return 0;
   7681 		m->http = 1;
   7682 		if(!parse_url(p->str, &m->host, &m->file, &m->port, &m->ssl)) {
   7683 			free(m->host);
   7684 			free(m->file);
   7685 			free(m);
   7686 			*tail = NULL;
   7687 			return 0;
   7688 		}
   7689 	}
   7690 	for(p = c->masters; p; p = p->next) {
   7691 		tail = list;
   7692 		m = auth_master_new(&list);
   7693 		if(!m) return 0;
   7694 		m->ixfr = 1; /* this flag is not configurable */
   7695 		m->host = strdup(p->str);
   7696 		if(!m->host) {
   7697 			log_err("malloc failure");
   7698 			free(m);
   7699 			*tail = NULL;
   7700 			return 0;
   7701 		}
   7702 	}
   7703 	for(p = c->allow_notify; p; p = p->next) {
   7704 		tail = list;
   7705 		m = auth_master_new(&list);
   7706 		if(!m) return 0;
   7707 		m->allow_notify = 1;
   7708 		m->host = strdup(p->str);
   7709 		if(!m->host) {
   7710 			log_err("malloc failure");
   7711 			free(m);
   7712 			*tail = NULL;
   7713 			return 0;
   7714 		}
   7715 	}
   7716 	return 1;
   7717 }
   7718 
   7719 #define SERIAL_BITS	32
   7720 int
   7721 compare_serial(uint32_t a, uint32_t b)
   7722 {
   7723 	const uint32_t cutoff = ((uint32_t) 1 << (SERIAL_BITS - 1));
   7724 
   7725 	if (a == b) {
   7726 		return 0;
   7727 	} else if ((a < b && b - a < cutoff) || (a > b && a - b > cutoff)) {
   7728 		return -1;
   7729 	} else {
   7730 		return 1;
   7731 	}
   7732 }
   7733 
   7734 int zonemd_hashalgo_supported(int hashalgo)
   7735 {
   7736 	if(hashalgo == ZONEMD_ALGO_SHA384) return 1;
   7737 	if(hashalgo == ZONEMD_ALGO_SHA512) return 1;
   7738 	return 0;
   7739 }
   7740 
   7741 int zonemd_scheme_supported(int scheme)
   7742 {
   7743 	if(scheme == ZONEMD_SCHEME_SIMPLE) return 1;
   7744 	return 0;
   7745 }
   7746 
   7747 /** initialize hash for hashing with zonemd hash algo */
   7748 static struct secalgo_hash* zonemd_digest_init(int hashalgo, char** reason)
   7749 {
   7750 	struct secalgo_hash *h;
   7751 	if(hashalgo == ZONEMD_ALGO_SHA384) {
   7752 		/* sha384 */
   7753 		h = secalgo_hash_create_sha384();
   7754 		if(!h)
   7755 			*reason = "digest sha384 could not be created";
   7756 		return h;
   7757 	} else if(hashalgo == ZONEMD_ALGO_SHA512) {
   7758 		/* sha512 */
   7759 		h = secalgo_hash_create_sha512();
   7760 		if(!h)
   7761 			*reason = "digest sha512 could not be created";
   7762 		return h;
   7763 	}
   7764 	/* unknown hash algo */
   7765 	*reason = "unsupported algorithm";
   7766 	return NULL;
   7767 }
   7768 
   7769 /** update the hash for zonemd */
   7770 static int zonemd_digest_update(int hashalgo, struct secalgo_hash* h,
   7771 	uint8_t* data, size_t len, char** reason)
   7772 {
   7773 	if(hashalgo == ZONEMD_ALGO_SHA384) {
   7774 		if(!secalgo_hash_update(h, data, len)) {
   7775 			*reason = "digest sha384 failed";
   7776 			return 0;
   7777 		}
   7778 		return 1;
   7779 	} else if(hashalgo == ZONEMD_ALGO_SHA512) {
   7780 		if(!secalgo_hash_update(h, data, len)) {
   7781 			*reason = "digest sha512 failed";
   7782 			return 0;
   7783 		}
   7784 		return 1;
   7785 	}
   7786 	/* unknown hash algo */
   7787 	*reason = "unsupported algorithm";
   7788 	return 0;
   7789 }
   7790 
   7791 /** finish the hash for zonemd */
   7792 static int zonemd_digest_finish(int hashalgo, struct secalgo_hash* h,
   7793 	uint8_t* result, size_t hashlen, size_t* resultlen, char** reason)
   7794 {
   7795 	if(hashalgo == ZONEMD_ALGO_SHA384) {
   7796 		if(hashlen < 384/8) {
   7797 			*reason = "digest buffer too small for sha384";
   7798 			return 0;
   7799 		}
   7800 		if(!secalgo_hash_final(h, result, hashlen, resultlen)) {
   7801 			*reason = "digest sha384 finish failed";
   7802 			return 0;
   7803 		}
   7804 		return 1;
   7805 	} else if(hashalgo == ZONEMD_ALGO_SHA512) {
   7806 		if(hashlen < 512/8) {
   7807 			*reason = "digest buffer too small for sha512";
   7808 			return 0;
   7809 		}
   7810 		if(!secalgo_hash_final(h, result, hashlen, resultlen)) {
   7811 			*reason = "digest sha512 finish failed";
   7812 			return 0;
   7813 		}
   7814 		return 1;
   7815 	}
   7816 	/* unknown algo */
   7817 	*reason = "unsupported algorithm";
   7818 	return 0;
   7819 }
   7820 
   7821 /** add rrsets from node to the list */
   7822 static size_t authdata_rrsets_to_list(struct auth_rrset** array,
   7823 	size_t arraysize, struct auth_rrset* first)
   7824 {
   7825 	struct auth_rrset* rrset = first;
   7826 	size_t num = 0;
   7827 	while(rrset) {
   7828 		if(num >= arraysize)
   7829 			return num;
   7830 		array[num] = rrset;
   7831 		num++;
   7832 		rrset = rrset->next;
   7833 	}
   7834 	return num;
   7835 }
   7836 
   7837 /** compare rr list entries */
   7838 static int rrlist_compare(const void* arg1, const void* arg2)
   7839 {
   7840 	struct auth_rrset* r1 = *(struct auth_rrset**)arg1;
   7841 	struct auth_rrset* r2 = *(struct auth_rrset**)arg2;
   7842 	uint16_t t1, t2;
   7843 	if(r1 == NULL) t1 = LDNS_RR_TYPE_RRSIG;
   7844 	else t1 = r1->type;
   7845 	if(r2 == NULL) t2 = LDNS_RR_TYPE_RRSIG;
   7846 	else t2 = r2->type;
   7847 	if(t1 < t2)
   7848 		return -1;
   7849 	if(t1 > t2)
   7850 		return 1;
   7851 	return 0;
   7852 }
   7853 
   7854 /** add type RRSIG to rr list if not one there already,
   7855  * this is to perform RRSIG collate processing at that point. */
   7856 static void addrrsigtype_if_needed(struct auth_rrset** array,
   7857 	size_t arraysize, size_t* rrnum, struct auth_data* node)
   7858 {
   7859 	if(az_domain_rrset(node, LDNS_RR_TYPE_RRSIG))
   7860 		return; /* already one there */
   7861 	if((*rrnum) >= arraysize)
   7862 		return; /* array too small? */
   7863 	array[*rrnum] = NULL; /* nothing there, but need entry in list */
   7864 	(*rrnum)++;
   7865 }
   7866 
   7867 /** collate the RRs in an RRset using the simple scheme */
   7868 static int zonemd_simple_rrset(struct auth_zone* z, int hashalgo,
   7869 	struct secalgo_hash* h, struct auth_data* node,
   7870 	struct auth_rrset* rrset, struct regional* region,
   7871 	struct sldns_buffer* buf, char** reason)
   7872 {
   7873 	/* canonicalize */
   7874 	struct ub_packed_rrset_key key;
   7875 	memset(&key, 0, sizeof(key));
   7876 	key.entry.key = &key;
   7877 	key.entry.data = rrset->data;
   7878 	key.rk.dname = node->name;
   7879 	key.rk.dname_len = node->namelen;
   7880 	key.rk.type = htons(rrset->type);
   7881 	key.rk.rrset_class = htons(z->dclass);
   7882 	if(!rrset_canonicalize_to_buffer(region, buf, &key)) {
   7883 		*reason = "out of memory";
   7884 		return 0;
   7885 	}
   7886 	regional_free_all(region);
   7887 
   7888 	/* hash */
   7889 	if(!zonemd_digest_update(hashalgo, h, sldns_buffer_begin(buf),
   7890 		sldns_buffer_limit(buf), reason)) {
   7891 		return 0;
   7892 	}
   7893 	return 1;
   7894 }
   7895 
   7896 /** count number of RRSIGs in a domain name rrset list */
   7897 static size_t zonemd_simple_count_rrsig(struct auth_rrset* rrset,
   7898 	struct auth_rrset** rrlist, size_t rrnum,
   7899 	struct auth_zone* z, struct auth_data* node)
   7900 {
   7901 	size_t i, count = 0;
   7902 	if(rrset) {
   7903 		size_t j;
   7904 		for(j = 0; j<rrset->data->count; j++) {
   7905 			if(rrsig_rdata_get_type_covered(rrset->data->
   7906 				rr_data[j], rrset->data->rr_len[j]) ==
   7907 				LDNS_RR_TYPE_ZONEMD &&
   7908 				query_dname_compare(z->name, node->name)==0) {
   7909 				/* omit RRSIGs over type ZONEMD at apex */
   7910 				continue;
   7911 			}
   7912 			count++;
   7913 		}
   7914 	}
   7915 	for(i=0; i<rrnum; i++) {
   7916 		if(rrlist[i] && rrlist[i]->type == LDNS_RR_TYPE_ZONEMD &&
   7917 			query_dname_compare(z->name, node->name)==0) {
   7918 			/* omit RRSIGs over type ZONEMD at apex */
   7919 			continue;
   7920 		}
   7921 		count += (rrlist[i]?rrlist[i]->data->rrsig_count:0);
   7922 	}
   7923 	return count;
   7924 }
   7925 
   7926 /** allocate sparse rrset data for the number of entries in tepm region */
   7927 static int zonemd_simple_rrsig_allocs(struct regional* region,
   7928 	struct packed_rrset_data* data, size_t count)
   7929 {
   7930 	data->rr_len = regional_alloc(region, sizeof(*data->rr_len) * count);
   7931 	if(!data->rr_len) {
   7932 		return 0;
   7933 	}
   7934 	data->rr_ttl = regional_alloc(region, sizeof(*data->rr_ttl) * count);
   7935 	if(!data->rr_ttl) {
   7936 		return 0;
   7937 	}
   7938 	data->rr_data = regional_alloc(region, sizeof(*data->rr_data) * count);
   7939 	if(!data->rr_data) {
   7940 		return 0;
   7941 	}
   7942 	return 1;
   7943 }
   7944 
   7945 /** add the RRSIGs from the rrs in the domain into the data */
   7946 static void add_rrlist_rrsigs_into_data(struct packed_rrset_data* data,
   7947 	size_t* done, struct auth_rrset** rrlist, size_t rrnum,
   7948 	struct auth_zone* z, struct auth_data* node)
   7949 {
   7950 	size_t i;
   7951 	for(i=0; i<rrnum; i++) {
   7952 		size_t j;
   7953 		if(!rrlist[i])
   7954 			continue;
   7955 		if(rrlist[i]->type == LDNS_RR_TYPE_ZONEMD &&
   7956 			query_dname_compare(z->name, node->name)==0) {
   7957 			/* omit RRSIGs over type ZONEMD at apex */
   7958 			continue;
   7959 		}
   7960 		for(j = 0; j<rrlist[i]->data->rrsig_count; j++) {
   7961 			data->rr_len[*done] = rrlist[i]->data->rr_len[rrlist[i]->data->count + j];
   7962 			data->rr_ttl[*done] = rrlist[i]->data->rr_ttl[rrlist[i]->data->count + j];
   7963 			/* reference the rdata in the rrset, no need to
   7964 			 * copy it, it is no longer needed at the end of
   7965 			 * the routine */
   7966 			data->rr_data[*done] = rrlist[i]->data->rr_data[rrlist[i]->data->count + j];
   7967 			(*done)++;
   7968 		}
   7969 	}
   7970 }
   7971 
   7972 static void add_rrset_into_data(struct packed_rrset_data* data,
   7973 	size_t* done, struct auth_rrset* rrset,
   7974 	struct auth_zone* z, struct auth_data* node)
   7975 {
   7976 	if(rrset) {
   7977 		size_t j;
   7978 		for(j = 0; j<rrset->data->count; j++) {
   7979 			if(rrsig_rdata_get_type_covered(rrset->data->
   7980 				rr_data[j], rrset->data->rr_len[j]) ==
   7981 				LDNS_RR_TYPE_ZONEMD &&
   7982 				query_dname_compare(z->name, node->name)==0) {
   7983 				/* omit RRSIGs over type ZONEMD at apex */
   7984 				continue;
   7985 			}
   7986 			data->rr_len[*done] = rrset->data->rr_len[j];
   7987 			data->rr_ttl[*done] = rrset->data->rr_ttl[j];
   7988 			/* reference the rdata in the rrset, no need to
   7989 			 * copy it, it is no longer need at the end of
   7990 			 * the routine */
   7991 			data->rr_data[*done] = rrset->data->rr_data[j];
   7992 			(*done)++;
   7993 		}
   7994 	}
   7995 }
   7996 
   7997 /** collate the RRSIGs using the simple scheme */
   7998 static int zonemd_simple_rrsig(struct auth_zone* z, int hashalgo,
   7999 	struct secalgo_hash* h, struct auth_data* node,
   8000 	struct auth_rrset* rrset, struct auth_rrset** rrlist, size_t rrnum,
   8001 	struct regional* region, struct sldns_buffer* buf, char** reason)
   8002 {
   8003 	/* the rrset pointer can be NULL, this means it is type RRSIG and
   8004 	 * there is no ordinary type RRSIG there.  The RRSIGs are stored
   8005 	 * with the RRsets in their data.
   8006 	 *
   8007 	 * The RRset pointer can be nonNULL. This happens if there is
   8008 	 * no RR that is covered by the RRSIG for the domain.  Then this
   8009 	 * RRSIG RR is stored in an rrset of type RRSIG. The other RRSIGs
   8010 	 * are stored in the rrset entries for the RRs in the rr list for
   8011 	 * the domain node.  We need to collate the rrset's data, if any, and
   8012 	 * the rrlist's rrsigs */
   8013 	/* if this is the apex, omit RRSIGs that cover type ZONEMD */
   8014 	/* build rrsig rrset */
   8015 	size_t done = 0;
   8016 	struct ub_packed_rrset_key key;
   8017 	struct packed_rrset_data data;
   8018 	memset(&key, 0, sizeof(key));
   8019 	memset(&data, 0, sizeof(data));
   8020 	key.entry.key = &key;
   8021 	key.entry.data = &data;
   8022 	key.rk.dname = node->name;
   8023 	key.rk.dname_len = node->namelen;
   8024 	key.rk.type = htons(LDNS_RR_TYPE_RRSIG);
   8025 	key.rk.rrset_class = htons(z->dclass);
   8026 	data.count = zonemd_simple_count_rrsig(rrset, rrlist, rrnum, z, node);
   8027 	if(!zonemd_simple_rrsig_allocs(region, &data, data.count)) {
   8028 		*reason = "out of memory";
   8029 		regional_free_all(region);
   8030 		return 0;
   8031 	}
   8032 	/* all the RRSIGs stored in the other rrsets for this domain node */
   8033 	add_rrlist_rrsigs_into_data(&data, &done, rrlist, rrnum, z, node);
   8034 	/* plus the RRSIGs stored in an rrset of type RRSIG for this node */
   8035 	add_rrset_into_data(&data, &done, rrset, z, node);
   8036 
   8037 	/* canonicalize */
   8038 	if(!rrset_canonicalize_to_buffer(region, buf, &key)) {
   8039 		*reason = "out of memory";
   8040 		regional_free_all(region);
   8041 		return 0;
   8042 	}
   8043 	regional_free_all(region);
   8044 
   8045 	/* hash */
   8046 	if(!zonemd_digest_update(hashalgo, h, sldns_buffer_begin(buf),
   8047 		sldns_buffer_limit(buf), reason)) {
   8048 		return 0;
   8049 	}
   8050 	return 1;
   8051 }
   8052 
   8053 /** collate a domain's rrsets using the simple scheme */
   8054 static int zonemd_simple_domain(struct auth_zone* z, int hashalgo,
   8055 	struct secalgo_hash* h, struct auth_data* node,
   8056 	struct regional* region, struct sldns_buffer* buf, char** reason)
   8057 {
   8058 #define	rrlistsize 65536
   8059 	struct auth_rrset* rrlist[rrlistsize];
   8060 	size_t i, rrnum = 0;
   8061 	/* see if the domain is out of scope, the zone origin,
   8062 	 * that would be omitted */
   8063 	if(!dname_subdomain_c(node->name, z->name))
   8064 		return 1; /* continue */
   8065 	/* loop over the rrsets in ascending order. */
   8066 	rrnum = authdata_rrsets_to_list(rrlist, rrlistsize, node->rrsets);
   8067 	addrrsigtype_if_needed(rrlist, rrlistsize, &rrnum, node);
   8068 	qsort(rrlist, rrnum, sizeof(*rrlist), rrlist_compare);
   8069 	for(i=0; i<rrnum; i++) {
   8070 		if(rrlist[i] && rrlist[i]->type == LDNS_RR_TYPE_ZONEMD &&
   8071 			query_dname_compare(z->name, node->name) == 0) {
   8072 			/* omit type ZONEMD at apex */
   8073 			continue;
   8074 		}
   8075 		if(rrlist[i] == NULL || rrlist[i]->type ==
   8076 			LDNS_RR_TYPE_RRSIG) {
   8077 			if(!zonemd_simple_rrsig(z, hashalgo, h, node,
   8078 				rrlist[i], rrlist, rrnum, region, buf, reason))
   8079 				return 0;
   8080 		} else if(!zonemd_simple_rrset(z, hashalgo, h, node,
   8081 			rrlist[i], region, buf, reason)) {
   8082 			return 0;
   8083 		}
   8084 	}
   8085 	return 1;
   8086 }
   8087 
   8088 /** collate the zone using the simple scheme */
   8089 static int zonemd_simple_collate(struct auth_zone* z, int hashalgo,
   8090 	struct secalgo_hash* h, struct regional* region,
   8091 	struct sldns_buffer* buf, char** reason)
   8092 {
   8093 	/* our tree is sorted in canonical order, so we can just loop over
   8094 	 * the tree */
   8095 	struct auth_data* n;
   8096 	RBTREE_FOR(n, struct auth_data*, &z->data) {
   8097 		if(!zonemd_simple_domain(z, hashalgo, h, n, region, buf,
   8098 			reason))
   8099 			return 0;
   8100 	}
   8101 	return 1;
   8102 }
   8103 
   8104 int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme,
   8105 	int hashalgo, uint8_t* hash, size_t hashlen, size_t* resultlen,
   8106 	struct regional* region, struct sldns_buffer* buf, char** reason)
   8107 {
   8108 	struct secalgo_hash* h = zonemd_digest_init(hashalgo, reason);
   8109 	if(!h) {
   8110 		if(!*reason)
   8111 			*reason = "digest init fail";
   8112 		return 0;
   8113 	}
   8114 	if(scheme == ZONEMD_SCHEME_SIMPLE) {
   8115 		if(!zonemd_simple_collate(z, hashalgo, h, region, buf, reason)) {
   8116 			if(!*reason) *reason = "scheme simple collate fail";
   8117 			secalgo_hash_delete(h);
   8118 			return 0;
   8119 		}
   8120 	}
   8121 	if(!zonemd_digest_finish(hashalgo, h, hash, hashlen, resultlen,
   8122 		reason)) {
   8123 		secalgo_hash_delete(h);
   8124 		*reason = "digest finish fail";
   8125 		return 0;
   8126 	}
   8127 	secalgo_hash_delete(h);
   8128 	return 1;
   8129 }
   8130 
   8131 int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme,
   8132 	int hashalgo, uint8_t* hash, size_t hashlen, struct regional* region,
   8133 	struct sldns_buffer* buf, char** reason)
   8134 {
   8135 	uint8_t gen[512];
   8136 	size_t genlen = 0;
   8137 	*reason = NULL;
   8138 	if(!zonemd_hashalgo_supported(hashalgo)) {
   8139 		/* allow it */
   8140 		*reason = "unsupported algorithm";
   8141 		return 1;
   8142 	}
   8143 	if(!zonemd_scheme_supported(scheme)) {
   8144 		/* allow it */
   8145 		*reason = "unsupported scheme";
   8146 		return 1;
   8147 	}
   8148 	if(hashlen < 12) {
   8149 		/* the ZONEMD draft requires digests to fail if too small */
   8150 		*reason = "digest length too small, less than 12";
   8151 		return 0;
   8152 	}
   8153 	/* generate digest */
   8154 	if(!auth_zone_generate_zonemd_hash(z, scheme, hashalgo, gen,
   8155 		sizeof(gen), &genlen, region, buf, reason)) {
   8156 		/* reason filled in by zonemd hash routine */
   8157 		return 0;
   8158 	}
   8159 	/* check digest length */
   8160 	if(hashlen != genlen) {
   8161 		*reason = "incorrect digest length";
   8162 		if(verbosity >= VERB_ALGO) {
   8163 			verbose(VERB_ALGO, "zonemd scheme=%d hashalgo=%d",
   8164 				scheme, hashalgo);
   8165 			log_hex("ZONEMD should be  ", gen, genlen);
   8166 			log_hex("ZONEMD to check is", hash, hashlen);
   8167 		}
   8168 		return 0;
   8169 	}
   8170 	/* check digest */
   8171 	if(memcmp(hash, gen, genlen) != 0) {
   8172 		*reason = "incorrect digest";
   8173 		if(verbosity >= VERB_ALGO) {
   8174 			verbose(VERB_ALGO, "zonemd scheme=%d hashalgo=%d",
   8175 				scheme, hashalgo);
   8176 			log_hex("ZONEMD should be  ", gen, genlen);
   8177 			log_hex("ZONEMD to check is", hash, hashlen);
   8178 		}
   8179 		return 0;
   8180 	}
   8181 	return 1;
   8182 }
   8183 
   8184 /** log auth zone message with zone name in front. */
   8185 static void auth_zone_log(uint8_t* name, enum verbosity_value level,
   8186 	const char* format, ...) ATTR_FORMAT(printf, 3, 4);
   8187 static void auth_zone_log(uint8_t* name, enum verbosity_value level,
   8188 	const char* format, ...)
   8189 {
   8190 	va_list args;
   8191 	va_start(args, format);
   8192 	if(verbosity >= level) {
   8193 		char str[LDNS_MAX_DOMAINLEN];
   8194 		char msg[MAXSYSLOGMSGLEN];
   8195 		dname_str(name, str);
   8196 		vsnprintf(msg, sizeof(msg), format, args);
   8197 		verbose(level, "auth zone %s %s", str, msg);
   8198 	}
   8199 	va_end(args);
   8200 }
   8201 
   8202 /** ZONEMD, dnssec verify the rrset with the dnskey */
   8203 static int zonemd_dnssec_verify_rrset(struct auth_zone* z,
   8204 	struct module_env* env, struct module_stack* mods,
   8205 	struct ub_packed_rrset_key* dnskey, struct auth_data* node,
   8206 	struct auth_rrset* rrset, char** why_bogus, uint8_t* sigalg,
   8207 	char* reasonbuf, size_t reasonlen)
   8208 {
   8209 	struct ub_packed_rrset_key pk;
   8210 	enum sec_status sec;
   8211 	struct val_env* ve;
   8212 	int m;
   8213 	int verified = 0;
   8214 	m = modstack_find(mods, "validator");
   8215 	if(m == -1) {
   8216 		auth_zone_log(z->name, VERB_ALGO, "zonemd dnssec verify: have "
   8217 			"DNSKEY chain of trust, but no validator module");
   8218 		return 0;
   8219 	}
   8220 	ve = (struct val_env*)env->modinfo[m];
   8221 
   8222 	memset(&pk, 0, sizeof(pk));
   8223 	pk.entry.key = &pk;
   8224 	pk.entry.data = rrset->data;
   8225 	pk.rk.dname = node->name;
   8226 	pk.rk.dname_len = node->namelen;
   8227 	pk.rk.type = htons(rrset->type);
   8228 	pk.rk.rrset_class = htons(z->dclass);
   8229 	if(verbosity >= VERB_ALGO) {
   8230 		char typestr[32];
   8231 		typestr[0]=0;
   8232 		sldns_wire2str_type_buf(rrset->type, typestr, sizeof(typestr));
   8233 		auth_zone_log(z->name, VERB_ALGO,
   8234 			"zonemd: verify %s RRset with DNSKEY", typestr);
   8235 	}
   8236 	sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, sigalg, why_bogus, NULL,
   8237 		LDNS_SECTION_ANSWER, NULL, NULL, &verified, reasonbuf,
   8238 		reasonlen);
   8239 	if(sec == sec_status_secure) {
   8240 		return 1;
   8241 	}
   8242 	if(why_bogus)
   8243 		auth_zone_log(z->name, VERB_ALGO, "DNSSEC verify was bogus: %s", *why_bogus);
   8244 	return 0;
   8245 }
   8246 
   8247 /** check for nsec3, the RR with params equal, if bitmap has the type */
   8248 static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo,
   8249 	size_t iter, uint8_t* salt, size_t saltlen, uint16_t rrtype)
   8250 {
   8251 	int i, count = (int)nsec3->data->count;
   8252 	struct ub_packed_rrset_key pk;
   8253 	memset(&pk, 0, sizeof(pk));
   8254 	pk.entry.data = nsec3->data;
   8255 	for(i=0; i<count; i++) {
   8256 		int rralgo;
   8257 		size_t rriter, rrsaltlen;
   8258 		uint8_t* rrsalt;
   8259 		if(!nsec3_get_params(&pk, i, &rralgo, &rriter, &rrsalt,
   8260 			&rrsaltlen))
   8261 			continue; /* no parameters, malformed */
   8262 		if(rralgo != algo || rriter != iter || rrsaltlen != saltlen)
   8263 			continue; /* different parameters */
   8264 		if(saltlen != 0) {
   8265 			if(rrsalt == NULL || salt == NULL)
   8266 				continue;
   8267 			if(memcmp(rrsalt, salt, saltlen) != 0)
   8268 				continue; /* different salt parameters */
   8269 		}
   8270 		if(nsec3_has_type(&pk, i, rrtype))
   8271 			return 1;
   8272 	}
   8273 	return 0;
   8274 }
   8275 
   8276 /** Verify the absence of ZONEMD with DNSSEC by checking NSEC, NSEC3 type flag.
   8277  * return false on failure, reason contains description of failure. */
   8278 static int zonemd_check_dnssec_absence(struct auth_zone* z,
   8279 	struct module_env* env, struct module_stack* mods,
   8280 	struct ub_packed_rrset_key* dnskey, struct auth_data* apex,
   8281 	char** reason, char** why_bogus, uint8_t* sigalg, char* reasonbuf,
   8282 	size_t reasonlen)
   8283 {
   8284 	struct auth_rrset* nsec = NULL;
   8285 	if(!apex) {
   8286 		*reason = "zone has no apex domain but ZONEMD missing";
   8287 		return 0;
   8288 	}
   8289 	nsec = az_domain_rrset(apex, LDNS_RR_TYPE_NSEC);
   8290 	if(nsec) {
   8291 		struct ub_packed_rrset_key pk;
   8292 		/* dnssec verify the NSEC */
   8293 		if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex,
   8294 			nsec, why_bogus, sigalg, reasonbuf, reasonlen)) {
   8295 			*reason = "DNSSEC verify failed for NSEC RRset";
   8296 			return 0;
   8297 		}
   8298 		/* check type bitmap */
   8299 		memset(&pk, 0, sizeof(pk));
   8300 		pk.entry.data = nsec->data;
   8301 		if(nsec_has_type(&pk, LDNS_RR_TYPE_ZONEMD)) {
   8302 			*reason = "DNSSEC NSEC bitmap says type ZONEMD exists";
   8303 			return 0;
   8304 		}
   8305 		auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC NSEC verification of absence of ZONEMD secure");
   8306 	} else {
   8307 		/* NSEC3 perhaps ? */
   8308 		int algo;
   8309 		size_t iter, saltlen;
   8310 		uint8_t* salt;
   8311 		struct auth_rrset* nsec3param = az_domain_rrset(apex,
   8312 			LDNS_RR_TYPE_NSEC3PARAM);
   8313 		struct auth_data* match;
   8314 		struct auth_rrset* nsec3;
   8315 		if(!nsec3param) {
   8316 			*reason = "zone has no NSEC information but ZONEMD missing";
   8317 			return 0;
   8318 		}
   8319 		if(!az_nsec3_param(z, &algo, &iter, &salt, &saltlen)) {
   8320 			*reason = "zone has no NSEC information but ZONEMD missing";
   8321 			return 0;
   8322 		}
   8323 		/* find the NSEC3 record */
   8324 		match = az_nsec3_find_exact(z, z->name, z->namelen, algo,
   8325 			iter, salt, saltlen);
   8326 		if(!match) {
   8327 			*reason = "zone has no NSEC3 domain for the apex but ZONEMD missing";
   8328 			return 0;
   8329 		}
   8330 		nsec3 = az_domain_rrset(match, LDNS_RR_TYPE_NSEC3);
   8331 		if(!nsec3) {
   8332 			*reason = "zone has no NSEC3 RRset for the apex but ZONEMD missing";
   8333 			return 0;
   8334 		}
   8335 		/* dnssec verify the NSEC3 */
   8336 		if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, match,
   8337 			nsec3, why_bogus, sigalg, reasonbuf, reasonlen)) {
   8338 			*reason = "DNSSEC verify failed for NSEC3 RRset";
   8339 			return 0;
   8340 		}
   8341 		/* check type bitmap */
   8342 		if(nsec3_of_param_has_type(nsec3, algo, iter, salt, saltlen,
   8343 			LDNS_RR_TYPE_ZONEMD)) {
   8344 			*reason = "DNSSEC NSEC3 bitmap says type ZONEMD exists";
   8345 			return 0;
   8346 		}
   8347 		auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC NSEC3 verification of absence of ZONEMD secure");
   8348 	}
   8349 
   8350 	return 1;
   8351 }
   8352 
   8353 /** Verify the SOA and ZONEMD DNSSEC signatures.
   8354  * return false on failure, reason contains description of failure. */
   8355 static int zonemd_check_dnssec_soazonemd(struct auth_zone* z,
   8356 	struct module_env* env, struct module_stack* mods,
   8357 	struct ub_packed_rrset_key* dnskey, struct auth_data* apex,
   8358 	struct auth_rrset* zonemd_rrset, char** reason, char** why_bogus,
   8359 	uint8_t* sigalg, char* reasonbuf, size_t reasonlen)
   8360 {
   8361 	struct auth_rrset* soa;
   8362 	if(!apex) {
   8363 		*reason = "zone has no apex domain";
   8364 		return 0;
   8365 	}
   8366 	soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA);
   8367 	if(!soa) {
   8368 		*reason = "zone has no SOA RRset";
   8369 		return 0;
   8370 	}
   8371 	if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, soa,
   8372 		why_bogus, sigalg, reasonbuf, reasonlen)) {
   8373 		*reason = "DNSSEC verify failed for SOA RRset";
   8374 		return 0;
   8375 	}
   8376 	if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex,
   8377 		zonemd_rrset, why_bogus, sigalg, reasonbuf, reasonlen)) {
   8378 		*reason = "DNSSEC verify failed for ZONEMD RRset";
   8379 		return 0;
   8380 	}
   8381 	auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC verification of SOA and ZONEMD RRsets secure");
   8382 	return 1;
   8383 }
   8384 
   8385 /**
   8386  * Fail the ZONEMD verification.
   8387  * @param z: auth zone that fails.
   8388  * @param env: environment with config, to ignore failure or not.
   8389  * @param reason: failure string description.
   8390  * @param why_bogus: failure string for DNSSEC verification failure.
   8391  * @param result: strdup result in here if not NULL.
   8392  */
   8393 static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env,
   8394 	char* reason, char* why_bogus, char** result)
   8395 {
   8396 	char zstr[LDNS_MAX_DOMAINLEN];
   8397 	/* if fail: log reason, and depending on config also take action
   8398 	 * and drop the zone, eg. it is gone from memory, set zone_expired */
   8399 	dname_str(z->name, zstr);
   8400 	if(!reason) reason = "verification failed";
   8401 	if(result) {
   8402 		if(why_bogus) {
   8403 			char res[1024];
   8404 			snprintf(res, sizeof(res), "%s: %s", reason,
   8405 				why_bogus);
   8406 			*result = strdup(res);
   8407 		} else {
   8408 			*result = strdup(reason);
   8409 		}
   8410 		if(!*result) log_err("out of memory");
   8411 	} else {
   8412 		log_warn("auth zone %s: ZONEMD verification failed: %s", zstr, reason);
   8413 	}
   8414 
   8415 	if(env->cfg->zonemd_permissive_mode) {
   8416 		verbose(VERB_ALGO, "zonemd-permissive-mode enabled, "
   8417 			"not blocking zone %s", zstr);
   8418 		return;
   8419 	}
   8420 
   8421 	/* expired means the zone gives servfail and is not used by
   8422 	 * lookup if fallback_enabled*/
   8423 	z->zone_expired = 1;
   8424 }
   8425 
   8426 /**
   8427  * Verify the zonemd with DNSSEC and hash check, with given key.
   8428  * @param z: auth zone.
   8429  * @param env: environment with config and temp buffers.
   8430  * @param mods: module stack with validator env for verification.
   8431  * @param dnskey: dnskey that we can use, or NULL.  If nonnull, the key
   8432  * 	has been verified and is the start of the chain of trust.
   8433  * @param is_insecure: if true, the dnskey is not used, the zone is insecure.
   8434  * 	And dnssec is not used.  It is DNSSEC secure insecure or not under
   8435  * 	a trust anchor.
   8436  * @param sigalg: if nonNULL provide algorithm downgrade protection.
   8437  * 	Otherwise one algorithm is enough. Must have space of ALGO_NEEDS_MAX+1.
   8438  * @param result: if not NULL result reason copied here.
   8439  */
   8440 static void
   8441 auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env,
   8442 	struct module_stack* mods, struct ub_packed_rrset_key* dnskey,
   8443 	int is_insecure, char** result, uint8_t* sigalg)
   8444 {
   8445 	char reasonbuf[256];
   8446 	char* reason = NULL, *why_bogus = NULL;
   8447 	struct auth_data* apex = NULL;
   8448 	struct auth_rrset* zonemd_rrset = NULL;
   8449 	int zonemd_absent = 0, zonemd_absence_dnssecok = 0;
   8450 
   8451 	/* see if ZONEMD is present or absent. */
   8452 	apex = az_find_name(z, z->name, z->namelen);
   8453 	if(!apex) {
   8454 		zonemd_absent = 1;
   8455 	} else {
   8456 		zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD);
   8457 		if(!zonemd_rrset || zonemd_rrset->data->count==0) {
   8458 			zonemd_absent = 1;
   8459 			zonemd_rrset = NULL;
   8460 		}
   8461 	}
   8462 
   8463 	/* if no DNSSEC, done. */
   8464 	/* if no ZONEMD, and DNSSEC, use DNSKEY to verify NSEC or NSEC3 for
   8465 	 * zone apex.  Check ZONEMD bit is turned off or else fail */
   8466 	/* if ZONEMD, and DNSSEC, check DNSSEC signature on SOA and ZONEMD,
   8467 	 * or else fail */
   8468 	if(!dnskey && !is_insecure) {
   8469 		auth_zone_zonemd_fail(z, env, "DNSKEY missing", NULL, result);
   8470 		return;
   8471 	} else if(!zonemd_rrset && dnskey && !is_insecure) {
   8472 		/* fetch, DNSSEC verify, and check NSEC/NSEC3 */
   8473 		if(!zonemd_check_dnssec_absence(z, env, mods, dnskey, apex,
   8474 			&reason, &why_bogus, sigalg, reasonbuf,
   8475 			sizeof(reasonbuf))) {
   8476 			auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
   8477 			return;
   8478 		}
   8479 		zonemd_absence_dnssecok = 1;
   8480 	} else if(zonemd_rrset && dnskey && !is_insecure) {
   8481 		/* check DNSSEC verify of SOA and ZONEMD */
   8482 		if(!zonemd_check_dnssec_soazonemd(z, env, mods, dnskey, apex,
   8483 			zonemd_rrset, &reason, &why_bogus, sigalg, reasonbuf,
   8484 			sizeof(reasonbuf))) {
   8485 			auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
   8486 			return;
   8487 		}
   8488 	}
   8489 
   8490 	if(zonemd_absent && z->zonemd_reject_absence) {
   8491 		auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", NULL, result);
   8492 		return;
   8493 	}
   8494 	if(zonemd_absent && zonemd_absence_dnssecok) {
   8495 		auth_zone_log(z->name, VERB_ALGO, "DNSSEC verified nonexistence of ZONEMD");
   8496 		if(result) {
   8497 			*result = strdup("DNSSEC verified nonexistence of ZONEMD");
   8498 			if(!*result) log_err("out of memory");
   8499 		}
   8500 		return;
   8501 	}
   8502 	if(zonemd_absent) {
   8503 		auth_zone_log(z->name, VERB_ALGO, "no ZONEMD present");
   8504 		if(result) {
   8505 			*result = strdup("no ZONEMD present");
   8506 			if(!*result) log_err("out of memory");
   8507 		}
   8508 		return;
   8509 	}
   8510 
   8511 	/* check ZONEMD checksum and report or else fail. */
   8512 	if(!auth_zone_zonemd_check_hash(z, env, &reason)) {
   8513 		auth_zone_zonemd_fail(z, env, reason, NULL, result);
   8514 		return;
   8515 	}
   8516 
   8517 	/* success! log the success */
   8518 	if(reason)
   8519 		auth_zone_log(z->name, VERB_ALGO, "ZONEMD %s", reason);
   8520 	else	auth_zone_log(z->name, VERB_ALGO, "ZONEMD verification successful");
   8521 	if(result) {
   8522 		if(reason)
   8523 			*result = strdup(reason);
   8524 		else	*result = strdup("ZONEMD verification successful");
   8525 		if(!*result) log_err("out of memory");
   8526 	}
   8527 }
   8528 
   8529 /**
   8530  * verify the zone DNSKEY rrset from the trust anchor
   8531  * This is possible because the anchor is for the zone itself, and can
   8532  * thus apply straight to the zone DNSKEY set.
   8533  * @param z: the auth zone.
   8534  * @param env: environment with time and temp buffers.
   8535  * @param mods: module stack for validator environment for dnssec validation.
   8536  * @param anchor: trust anchor to use
   8537  * @param is_insecure: returned, true if the zone is securely insecure.
   8538  * @param why_bogus: if the routine fails, returns the failure reason.
   8539  * @param keystorage: where to store the ub_packed_rrset_key that is created
   8540  * 	on success. A pointer to it is returned on success.
   8541  * @param reasonbuf: buffer to use for fail reason string print.
   8542  * @param reasonlen: length of reasonbuf.
   8543  * @return the dnskey RRset, reference to zone data and keystorage, or
   8544  * 	NULL on failure.
   8545  */
   8546 static struct ub_packed_rrset_key*
   8547 zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env,
   8548 	struct module_stack* mods, struct trust_anchor* anchor,
   8549 	int* is_insecure, char** why_bogus,
   8550 	struct ub_packed_rrset_key* keystorage, char* reasonbuf,
   8551 	size_t reasonlen)
   8552 {
   8553 	struct auth_data* apex;
   8554 	struct auth_rrset* dnskey_rrset;
   8555 	enum sec_status sec;
   8556 	struct val_env* ve;
   8557 	int m;
   8558 
   8559 	apex = az_find_name(z, z->name, z->namelen);
   8560 	if(!apex) {
   8561 		*why_bogus = "have trust anchor, but zone has no apex domain for DNSKEY";
   8562 		return 0;
   8563 	}
   8564 	dnskey_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_DNSKEY);
   8565 	if(!dnskey_rrset || dnskey_rrset->data->count==0) {
   8566 		*why_bogus = "have trust anchor, but zone has no DNSKEY";
   8567 		return 0;
   8568 	}
   8569 
   8570 	m = modstack_find(mods, "validator");
   8571 	if(m == -1) {
   8572 		*why_bogus = "have trust anchor, but no validator module";
   8573 		return 0;
   8574 	}
   8575 	ve = (struct val_env*)env->modinfo[m];
   8576 
   8577 	memset(keystorage, 0, sizeof(*keystorage));
   8578 	keystorage->entry.key = keystorage;
   8579 	keystorage->entry.data = dnskey_rrset->data;
   8580 	keystorage->rk.dname = apex->name;
   8581 	keystorage->rk.dname_len = apex->namelen;
   8582 	keystorage->rk.type = htons(LDNS_RR_TYPE_DNSKEY);
   8583 	keystorage->rk.rrset_class = htons(z->dclass);
   8584 	auth_zone_log(z->name, VERB_QUERY,
   8585 		"zonemd: verify DNSKEY RRset with trust anchor");
   8586 	sec = val_verify_DNSKEY_with_TA(env, ve, keystorage, anchor->ds_rrset,
   8587 		anchor->dnskey_rrset, NULL, why_bogus, NULL, NULL, NULL,
   8588 		reasonbuf, reasonlen);
   8589 	regional_free_all(env->scratch);
   8590 	if(sec == sec_status_secure) {
   8591 		/* success */
   8592 		*is_insecure = 0;
   8593 		return keystorage;
   8594 	} else if(sec == sec_status_insecure) {
   8595 		/* insecure */
   8596 		*is_insecure = 1;
   8597 	} else {
   8598 		/* bogus */
   8599 		*is_insecure = 0;
   8600 		auth_zone_log(z->name, VERB_ALGO,
   8601 			"zonemd: verify DNSKEY RRset with trust anchor failed: %s", *why_bogus);
   8602 	}
   8603 	return NULL;
   8604 }
   8605 
   8606 /** verify the DNSKEY from the zone with looked up DS record */
   8607 static struct ub_packed_rrset_key*
   8608 auth_zone_verify_zonemd_key_with_ds(struct auth_zone* z,
   8609 	struct module_env* env, struct module_stack* mods,
   8610 	struct ub_packed_rrset_key* ds, int* is_insecure, char** why_bogus,
   8611 	struct ub_packed_rrset_key* keystorage, uint8_t* sigalg,
   8612 	char* reasonbuf, size_t reasonlen)
   8613 {
   8614 	struct auth_data* apex;
   8615 	struct auth_rrset* dnskey_rrset;
   8616 	enum sec_status sec;
   8617 	struct val_env* ve;
   8618 	int m;
   8619 
   8620 	/* fetch DNSKEY from zone data */
   8621 	apex = az_find_name(z, z->name, z->namelen);
   8622 	if(!apex) {
   8623 		*why_bogus = "in verifywithDS, zone has no apex";
   8624 		return NULL;
   8625 	}
   8626 	dnskey_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_DNSKEY);
   8627 	if(!dnskey_rrset || dnskey_rrset->data->count==0) {
   8628 		*why_bogus = "in verifywithDS, zone has no DNSKEY";
   8629 		return NULL;
   8630 	}
   8631 
   8632 	m = modstack_find(mods, "validator");
   8633 	if(m == -1) {
   8634 		*why_bogus = "in verifywithDS, have no validator module";
   8635 		return NULL;
   8636 	}
   8637 	ve = (struct val_env*)env->modinfo[m];
   8638 
   8639 	memset(keystorage, 0, sizeof(*keystorage));
   8640 	keystorage->entry.key = keystorage;
   8641 	keystorage->entry.data = dnskey_rrset->data;
   8642 	keystorage->rk.dname = apex->name;
   8643 	keystorage->rk.dname_len = apex->namelen;
   8644 	keystorage->rk.type = htons(LDNS_RR_TYPE_DNSKEY);
   8645 	keystorage->rk.rrset_class = htons(z->dclass);
   8646 	auth_zone_log(z->name, VERB_QUERY, "zonemd: verify zone DNSKEY with DS");
   8647 	sec = val_verify_DNSKEY_with_DS(env, ve, keystorage, ds, sigalg,
   8648 		why_bogus, NULL, NULL, NULL, reasonbuf, reasonlen);
   8649 	regional_free_all(env->scratch);
   8650 	if(sec == sec_status_secure) {
   8651 		/* success */
   8652 		return keystorage;
   8653 	} else if(sec == sec_status_insecure) {
   8654 		/* insecure */
   8655 		*is_insecure = 1;
   8656 	} else {
   8657 		/* bogus */
   8658 		*is_insecure = 0;
   8659 		if(*why_bogus == NULL)
   8660 			*why_bogus = "verify failed";
   8661 		auth_zone_log(z->name, VERB_ALGO,
   8662 			"zonemd: verify DNSKEY RRset with DS failed: %s",
   8663 			*why_bogus);
   8664 	}
   8665 	return NULL;
   8666 }
   8667 
   8668 /** callback for ZONEMD lookup of DNSKEY */
   8669 void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
   8670 	enum sec_status sec, char* why_bogus, int ATTR_UNUSED(was_ratelimited))
   8671 {
   8672 	struct auth_zone* z = (struct auth_zone*)arg;
   8673 	struct module_env* env;
   8674 	char reasonbuf[256];
   8675 	char* reason = NULL, *ds_bogus = NULL, *typestr="DNSKEY";
   8676 	struct ub_packed_rrset_key* dnskey = NULL, *ds = NULL;
   8677 	int is_insecure = 0, downprot, perform_write = 0;
   8678 	struct ub_packed_rrset_key keystorage;
   8679 	uint8_t sigalg[ALGO_NEEDS_MAX+1];
   8680 	uint8_t bakname[LDNS_MAX_DOMAINLEN];
   8681 	size_t baknamelen;
   8682 	uint16_t bakdclass;
   8683 	struct auth_chunk* chunk_list = NULL;
   8684 
   8685 	lock_rw_wrlock(&z->lock);
   8686 	env = z->zonemd_callback_env;
   8687 	/* release the env variable so another worker can pick up the
   8688 	 * ZONEMD verification task if it wants to */
   8689 	z->zonemd_callback_env = NULL;
   8690 	if(!env || env->outnet->want_to_quit || z->zone_deleted) {
   8691 		lock_rw_unlock(&z->lock);
   8692 		return; /* stop on quit */
   8693 	}
   8694 	if(z->zonemd_callback_qtype == LDNS_RR_TYPE_DS)
   8695 		typestr = "DS";
   8696 	downprot = env->cfg->harden_algo_downgrade;
   8697 
   8698 	/* process result */
   8699 	if(sec == sec_status_bogus) {
   8700 		reason = why_bogus;
   8701 		if(!reason) {
   8702 			if(z->zonemd_callback_qtype == LDNS_RR_TYPE_DNSKEY)
   8703 				reason = "lookup of DNSKEY was bogus";
   8704 			else	reason = "lookup of DS was bogus";
   8705 		}
   8706 		auth_zone_log(z->name, VERB_ALGO,
   8707 			"zonemd lookup of %s was bogus: %s", typestr, reason);
   8708 	} else if(rcode == LDNS_RCODE_NOERROR) {
   8709 		uint16_t wanted_qtype = z->zonemd_callback_qtype;
   8710 		struct regional* temp = env->scratch;
   8711 		struct query_info rq;
   8712 		struct reply_info* rep;
   8713 		memset(&rq, 0, sizeof(rq));
   8714 		rep = parse_reply_in_temp_region(buf, temp, &rq);
   8715 		if(rep && rq.qtype == wanted_qtype &&
   8716 			query_dname_compare(z->name, rq.qname) == 0 &&
   8717 			FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NOERROR) {
   8718 			/* parsed successfully */
   8719 			struct ub_packed_rrset_key* answer =
   8720 				reply_find_answer_rrset(&rq, rep);
   8721 			if(answer && sec == sec_status_secure) {
   8722 				if(z->zonemd_callback_qtype == LDNS_RR_TYPE_DNSKEY)
   8723 					dnskey = answer;
   8724 				else	ds = answer;
   8725 				auth_zone_log(z->name, VERB_ALGO,
   8726 					"zonemd lookup of %s was secure", typestr);
   8727 			} else if(sec == sec_status_secure && !answer) {
   8728 				is_insecure = 1;
   8729 				auth_zone_log(z->name, VERB_ALGO,
   8730 					"zonemd lookup of %s has no content, but is secure, treat as insecure", typestr);
   8731 			} else if(sec == sec_status_insecure) {
   8732 				is_insecure = 1;
   8733 				auth_zone_log(z->name, VERB_ALGO,
   8734 					"zonemd lookup of %s was insecure", typestr);
   8735 			} else if(sec == sec_status_indeterminate) {
   8736 				is_insecure = 1;
   8737 				auth_zone_log(z->name, VERB_ALGO,
   8738 					"zonemd lookup of %s was indeterminate, treat as insecure", typestr);
   8739 			} else {
   8740 				auth_zone_log(z->name, VERB_ALGO,
   8741 					"zonemd lookup of %s has nodata", typestr);
   8742 				if(z->zonemd_callback_qtype == LDNS_RR_TYPE_DNSKEY)
   8743 					reason = "lookup of DNSKEY has nodata";
   8744 				else	reason = "lookup of DS has nodata";
   8745 			}
   8746 		} else if(rep && rq.qtype == wanted_qtype &&
   8747 			query_dname_compare(z->name, rq.qname) == 0 &&
   8748 			FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN &&
   8749 			sec == sec_status_secure) {
   8750 			/* secure nxdomain, so the zone is like some RPZ zone
   8751 			 * that does not exist in the wider internet, with
   8752 			 * a secure nxdomain answer outside of it. So we
   8753 			 * treat the zonemd zone without a dnssec chain of
   8754 			 * trust, as insecure. */
   8755 			is_insecure = 1;
   8756 			auth_zone_log(z->name, VERB_ALGO,
   8757 				"zonemd lookup of %s was secure NXDOMAIN, treat as insecure", typestr);
   8758 		} else if(rep && rq.qtype == wanted_qtype &&
   8759 			query_dname_compare(z->name, rq.qname) == 0 &&
   8760 			FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN &&
   8761 			sec == sec_status_insecure) {
   8762 			is_insecure = 1;
   8763 			auth_zone_log(z->name, VERB_ALGO,
   8764 				"zonemd lookup of %s was insecure NXDOMAIN, treat as insecure", typestr);
   8765 		} else if(rep && rq.qtype == wanted_qtype &&
   8766 			query_dname_compare(z->name, rq.qname) == 0 &&
   8767 			FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN &&
   8768 			sec == sec_status_indeterminate) {
   8769 			is_insecure = 1;
   8770 			auth_zone_log(z->name, VERB_ALGO,
   8771 				"zonemd lookup of %s was indeterminate NXDOMAIN, treat as insecure", typestr);
   8772 		} else {
   8773 			auth_zone_log(z->name, VERB_ALGO,
   8774 				"zonemd lookup of %s has no answer", typestr);
   8775 			if(z->zonemd_callback_qtype == LDNS_RR_TYPE_DNSKEY)
   8776 				reason = "lookup of DNSKEY has no answer";
   8777 			else	reason = "lookup of DS has no answer";
   8778 		}
   8779 	} else {
   8780 		auth_zone_log(z->name, VERB_ALGO,
   8781 			"zonemd lookup of %s failed", typestr);
   8782 		if(z->zonemd_callback_qtype == LDNS_RR_TYPE_DNSKEY)
   8783 			reason = "lookup of DNSKEY failed";
   8784 		else	reason = "lookup of DS failed";
   8785 	}
   8786 
   8787 	if(!reason && !is_insecure && !dnskey && ds) {
   8788 		dnskey = auth_zone_verify_zonemd_key_with_ds(z, env,
   8789 			&env->mesh->mods, ds, &is_insecure, &ds_bogus,
   8790 			&keystorage, downprot?sigalg:NULL, reasonbuf,
   8791 			sizeof(reasonbuf));
   8792 		if(!dnskey && !is_insecure && !reason)
   8793 			reason = "DNSKEY verify with DS failed";
   8794 	}
   8795 
   8796 	if(reason) {
   8797 		auth_zone_zonemd_fail(z, env, reason, ds_bogus, NULL);
   8798 		lock_rw_unlock(&z->lock);
   8799 		regional_free_all(env->scratch);
   8800 		return;
   8801 	}
   8802 
   8803 	auth_zone_verify_zonemd_with_key(z, env, &env->mesh->mods, dnskey,
   8804 		is_insecure, NULL, downprot?sigalg:NULL);
   8805 	regional_free_all(env->scratch);
   8806 
   8807 	if(z->zonemd_callback_perform_write) {
   8808 		if(!z->zone_expired) {
   8809 			/* Write to zonefile if the ZONEMD is okay. */
   8810 			perform_write = 1;
   8811 			/* copy the key to lookup the z structure.
   8812 			 * The new lookup is readonly so concurrent
   8813 			 * queries can continue. */
   8814 			if(z->namelen > sizeof(bakname)) {
   8815 				perform_write = 0;
   8816 				auth_chunk_list_delete(z->perform_write_chunk_list);
   8817 				z->perform_write_chunk_list = NULL;
   8818 			} else {
   8819 				memcpy(bakname, z->name, z->namelen);
   8820 				baknamelen = z->namelen;
   8821 				bakdclass = z->dclass;
   8822 				chunk_list = z->perform_write_chunk_list;
   8823 				z->perform_write_chunk_list = NULL;
   8824 			}
   8825 		} else {
   8826 			auth_chunk_list_delete(z->perform_write_chunk_list);
   8827 			z->perform_write_chunk_list = NULL;
   8828 		}
   8829 		z->zonemd_callback_perform_write = 0;
   8830 	}
   8831 	lock_rw_unlock(&z->lock);
   8832 
   8833 	if(perform_write) {
   8834 		zone_write_after_update_reacq(bakname, baknamelen, bakdclass,
   8835 			env, chunk_list);
   8836 	}
   8837 }
   8838 
   8839 /** lookup DNSKEY for ZONEMD verification */
   8840 static int
   8841 zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env)
   8842 {
   8843 	struct query_info qinfo;
   8844 	uint16_t qflags = BIT_RD;
   8845 	struct edns_data edns;
   8846 	sldns_buffer* buf = env->scratch_buffer;
   8847 	int fetch_ds = 0;
   8848 
   8849 	if(!z->fallback_enabled) {
   8850 		/* we cannot actually get the DNSKEY, because it is in the
   8851 		 * zone we have ourselves, and it is not served yet
   8852 		 * (possibly), so fetch type DS */
   8853 		fetch_ds = 1;
   8854 	}
   8855 	if(z->zonemd_callback_env) {
   8856 		/* another worker is already working on the callback
   8857 		 * for the DNSKEY lookup for ZONEMD verification.
   8858 		 * We do not also have to do ZONEMD verification, let that
   8859 		 * worker do it */
   8860 		auth_zone_log(z->name, VERB_ALGO,
   8861 			"zonemd needs lookup of %s and that already is worked on by another worker", (fetch_ds?"DS":"DNSKEY"));
   8862 		return 1;
   8863 	}
   8864 
   8865 	/* use mesh_new_callback to lookup the DNSKEY,
   8866 	 * and then wait for them to be looked up (in cache, or query) */
   8867 	qinfo.qname_len = z->namelen;
   8868 	qinfo.qname = z->name;
   8869 	qinfo.qclass = z->dclass;
   8870 	if(fetch_ds)
   8871 		qinfo.qtype = LDNS_RR_TYPE_DS;
   8872 	else	qinfo.qtype = LDNS_RR_TYPE_DNSKEY;
   8873 	qinfo.local_alias = NULL;
   8874 	if(verbosity >= VERB_ALGO) {
   8875 		char buf1[512];
   8876 		char buf2[LDNS_MAX_DOMAINLEN];
   8877 		dname_str(z->name, buf2);
   8878 		snprintf(buf1, sizeof(buf1), "auth zone %s: lookup %s "
   8879 			"for zonemd verification", buf2,
   8880 			(fetch_ds?"DS":"DNSKEY"));
   8881 		log_query_info(VERB_ALGO, buf1, &qinfo);
   8882 	}
   8883 	edns.edns_present = 1;
   8884 	edns.ext_rcode = 0;
   8885 	edns.edns_version = 0;
   8886 	edns.bits = EDNS_DO;
   8887 	edns.opt_list_in = NULL;
   8888 	edns.opt_list_out = NULL;
   8889 	edns.opt_list_inplace_cb_out = NULL;
   8890 	if(sldns_buffer_capacity(buf) < 65535)
   8891 		edns.udp_size = (uint16_t)sldns_buffer_capacity(buf);
   8892 	else	edns.udp_size = 65535;
   8893 
   8894 	/* store the worker-specific module env for the callback.
   8895 	 * We can then reference this when the callback executes */
   8896 	z->zonemd_callback_env = env;
   8897 	z->zonemd_callback_qtype = qinfo.qtype;
   8898 	/* the callback can be called straight away */
   8899 	lock_rw_unlock(&z->lock);
   8900 	if(!mesh_new_callback(env->mesh, &qinfo, qflags, &edns, buf, 0,
   8901 		&auth_zonemd_dnskey_lookup_callback, z, 0,
   8902 		&z->zonemd_callback_unique_info)) {
   8903 		lock_rw_wrlock(&z->lock);
   8904 		/* no callback will run; do not leave the pending
   8905 		 * marker set */
   8906 		z->zonemd_callback_env = NULL;
   8907 		log_err("out of memory lookup of %s for zonemd",
   8908 			(fetch_ds?"DS":"DNSKEY"));
   8909 		return 0;
   8910 	}
   8911 	lock_rw_wrlock(&z->lock);
   8912 	return 1;
   8913 }
   8914 
   8915 void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env,
   8916 	struct module_stack* mods, char** result, int offline, int only_online)
   8917 {
   8918 	char reasonbuf[256];
   8919 	char* reason = NULL, *why_bogus = NULL;
   8920 	struct trust_anchor* anchor = NULL;
   8921 	struct ub_packed_rrset_key* dnskey = NULL;
   8922 	struct ub_packed_rrset_key keystorage;
   8923 	int is_insecure = 0;
   8924 	/* verify the ZONEMD if present.
   8925 	 * If not present check if absence is allowed by DNSSEC */
   8926 	if(!z->zonemd_check)
   8927 		return;
   8928 	if(z->data.count == 0)
   8929 		return; /* no data */
   8930 
   8931 	/* if zone is under a trustanchor */
   8932 	/* is it equal to trustanchor - get dnskey's verified */
   8933 	/* else, find chain of trust by fetching DNSKEYs lookup for zone */
   8934 	/* result if that, if insecure, means no DNSSEC for the ZONEMD,
   8935 	 * otherwise we have the zone DNSKEY for the DNSSEC verification. */
   8936 	if(env->anchors)
   8937 		anchor = anchors_lookup(env->anchors, z->name, z->namelen,
   8938 			z->dclass);
   8939 	if(anchor && anchor->numDS == 0 && anchor->numDNSKEY == 0) {
   8940 		/* domain-insecure trust anchor for unsigned zones */
   8941 		lock_basic_unlock(&anchor->lock);
   8942 		if(only_online)
   8943 			return;
   8944 		dnskey = NULL;
   8945 		is_insecure = 1;
   8946 	} else if(anchor && query_dname_compare(z->name, anchor->name) == 0) {
   8947 		if(only_online) {
   8948 			lock_basic_unlock(&anchor->lock);
   8949 			return;
   8950 		}
   8951 		/* equal to trustanchor, no need for online lookups */
   8952 		dnskey = zonemd_get_dnskey_from_anchor(z, env, mods, anchor,
   8953 			&is_insecure, &why_bogus, &keystorage, reasonbuf,
   8954 			sizeof(reasonbuf));
   8955 		lock_basic_unlock(&anchor->lock);
   8956 		if(!dnskey && !reason && !is_insecure) {
   8957 			reason = "verify DNSKEY RRset with trust anchor failed";
   8958 		}
   8959 	} else if(anchor) {
   8960 		lock_basic_unlock(&anchor->lock);
   8961 		/* perform online lookups */
   8962 		if(offline)
   8963 			return;
   8964 		/* setup online lookups, and wait for them */
   8965 		if(zonemd_lookup_dnskey(z, env)) {
   8966 			/* wait for the lookup */
   8967 			return;
   8968 		}
   8969 		reason = "could not lookup DNSKEY for chain of trust";
   8970 	} else {
   8971 		/* the zone is not under a trust anchor */
   8972 		if(only_online)
   8973 			return;
   8974 		dnskey = NULL;
   8975 		is_insecure = 1;
   8976 	}
   8977 
   8978 	if(reason) {
   8979 		auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
   8980 		regional_free_all(env->scratch);
   8981 		return;
   8982 	}
   8983 
   8984 	auth_zone_verify_zonemd_with_key(z, env, mods, dnskey, is_insecure,
   8985 		result, NULL);
   8986 	regional_free_all(env->scratch);
   8987 }
   8988 
   8989 void auth_zones_pickup_zonemd_verify(struct auth_zones* az,
   8990 	struct module_env* env)
   8991 {
   8992 	struct auth_zone key;
   8993 	uint8_t savezname[255+1];
   8994 	size_t savezname_len;
   8995 	struct auth_zone* z;
   8996 	key.node.key = &key;
   8997 	lock_rw_rdlock(&az->lock);
   8998 	RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
   8999 		lock_rw_wrlock(&z->lock);
   9000 		if(!z->zonemd_check) {
   9001 			lock_rw_unlock(&z->lock);
   9002 			continue;
   9003 		}
   9004 		key.dclass = z->dclass;
   9005 		key.namelabs = z->namelabs;
   9006 		if(z->namelen > sizeof(savezname)) {
   9007 			lock_rw_unlock(&z->lock);
   9008 			log_err("auth_zones_pickup_zonemd_verify: zone name too long");
   9009 			continue;
   9010 		}
   9011 		savezname_len = z->namelen;
   9012 		memmove(savezname, z->name, z->namelen);
   9013 		lock_rw_unlock(&az->lock);
   9014 		auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 1);
   9015 		lock_rw_unlock(&z->lock);
   9016 		lock_rw_rdlock(&az->lock);
   9017 		/* find the zone we had before, it is not deleted,
   9018 		 * because we have a flag for that that is processed at
   9019 		 * apply_cfg time */
   9020 		key.namelen = savezname_len;
   9021 		key.name = savezname;
   9022 		z = (struct auth_zone*)rbtree_search(&az->ztree, &key);
   9023 		if(!z)
   9024 			break;
   9025 	}
   9026 	lock_rw_unlock(&az->lock);
   9027 }
   9028 
   9029 /** Get memory usage of auth rrset */
   9030 static size_t
   9031 auth_rrset_get_mem(struct auth_rrset* rrset)
   9032 {
   9033 	size_t m = sizeof(*rrset) + packed_rrset_sizeof(rrset->data);
   9034 	return m;
   9035 }
   9036 
   9037 /** Get memory usage of auth data */
   9038 static size_t
   9039 auth_data_get_mem(struct auth_data* node)
   9040 {
   9041 	size_t m = sizeof(*node) + node->namelen;
   9042 	struct auth_rrset* rrset;
   9043 	for(rrset = node->rrsets; rrset; rrset = rrset->next) {
   9044 		m += auth_rrset_get_mem(rrset);
   9045 	}
   9046 	return m;
   9047 }
   9048 
   9049 /** Get memory usage of auth zone */
   9050 static size_t
   9051 auth_zone_get_mem(struct auth_zone* z)
   9052 {
   9053 	size_t m = sizeof(*z) + z->namelen;
   9054 	struct auth_data* node;
   9055 	if(z->zonefile)
   9056 		m += strlen(z->zonefile)+1;
   9057 	RBTREE_FOR(node, struct auth_data*, &z->data) {
   9058 		m += auth_data_get_mem(node);
   9059 	}
   9060 	if(z->rpz)
   9061 		m += rpz_get_mem(z->rpz);
   9062 	return m;
   9063 }
   9064 
   9065 /** Get memory usage of list of auth addr */
   9066 static size_t
   9067 auth_addrs_get_mem(struct auth_addr* list)
   9068 {
   9069 	size_t m = 0;
   9070 	struct auth_addr* a;
   9071 	for(a = list; a; a = a->next) {
   9072 		m += sizeof(*a);
   9073 	}
   9074 	return m;
   9075 }
   9076 
   9077 /** Get memory usage of list of primaries for auth xfer */
   9078 static size_t
   9079 auth_primaries_get_mem(struct auth_master* list)
   9080 {
   9081 	size_t m = 0;
   9082 	struct auth_master* n;
   9083 	for(n = list; n; n = n->next) {
   9084 		m += sizeof(*n);
   9085 		m += auth_addrs_get_mem(n->list);
   9086 		if(n->host)
   9087 			m += strlen(n->host)+1;
   9088 		if(n->file)
   9089 			m += strlen(n->file)+1;
   9090 	}
   9091 	return m;
   9092 }
   9093 
   9094 /** Get memory usage or list of auth chunks */
   9095 static size_t
   9096 auth_chunks_get_mem(struct auth_chunk* list)
   9097 {
   9098 	size_t m = 0;
   9099 	struct auth_chunk* chunk;
   9100 	for(chunk = list; chunk; chunk = chunk->next) {
   9101 		m += sizeof(*chunk) + chunk->len;
   9102 	}
   9103 	return m;
   9104 }
   9105 
   9106 /** Get memory usage of auth xfer */
   9107 static size_t
   9108 auth_xfer_get_mem(struct auth_xfer* xfr)
   9109 {
   9110 	size_t m = sizeof(*xfr) + xfr->namelen;
   9111 
   9112 	/* auth_nextprobe */
   9113 	m += comm_timer_get_mem(xfr->task_nextprobe->timer);
   9114 
   9115 	/* auth_probe */
   9116 	m += auth_primaries_get_mem(xfr->task_probe->masters);
   9117 	m += comm_point_get_mem(xfr->task_probe->cp);
   9118 	m += comm_timer_get_mem(xfr->task_probe->timer);
   9119 
   9120 	/* auth_transfer */
   9121 	m += auth_chunks_get_mem(xfr->task_transfer->chunks_first);
   9122 	m += auth_primaries_get_mem(xfr->task_transfer->masters);
   9123 	m += comm_point_get_mem(xfr->task_transfer->cp);
   9124 	m += comm_timer_get_mem(xfr->task_transfer->timer);
   9125 
   9126 	/* allow_notify_list */
   9127 	m += auth_primaries_get_mem(xfr->allow_notify_list);
   9128 
   9129 	return m;
   9130 }
   9131 
   9132 /** Get memory usage of auth zones ztree */
   9133 static size_t
   9134 az_ztree_get_mem(struct auth_zones* az)
   9135 {
   9136 	size_t m = 0;
   9137 	struct auth_zone* z;
   9138 	RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
   9139 		lock_rw_rdlock(&z->lock);
   9140 		m += auth_zone_get_mem(z);
   9141 		lock_rw_unlock(&z->lock);
   9142 	}
   9143 	return m;
   9144 }
   9145 
   9146 /** Get memory usage of auth zones xtree */
   9147 static size_t
   9148 az_xtree_get_mem(struct auth_zones* az)
   9149 {
   9150 	size_t m = 0;
   9151 	struct auth_xfer* xfr;
   9152 	RBTREE_FOR(xfr, struct auth_xfer*, &az->xtree) {
   9153 		lock_basic_lock(&xfr->lock);
   9154 		m += auth_xfer_get_mem(xfr);
   9155 		lock_basic_unlock(&xfr->lock);
   9156 	}
   9157 	return m;
   9158 }
   9159 
   9160 size_t auth_zones_get_mem(struct auth_zones* zones)
   9161 {
   9162 	size_t m;
   9163 	if(!zones) return 0;
   9164 	m = sizeof(*zones);
   9165 	lock_rw_rdlock(&zones->rpz_lock);
   9166 	lock_rw_rdlock(&zones->lock);
   9167 	m += az_ztree_get_mem(zones);
   9168 	m += az_xtree_get_mem(zones);
   9169 	lock_rw_unlock(&zones->lock);
   9170 	lock_rw_unlock(&zones->rpz_lock);
   9171 	return m;
   9172 }
   9173 
   9174 void xfr_disown_tasks(struct auth_xfer* xfr, struct worker* worker)
   9175 {
   9176 	if(xfr->task_nextprobe->worker == worker) {
   9177 		xfr_nextprobe_disown(xfr);
   9178 	}
   9179 	if(xfr->task_probe->worker == worker) {
   9180 		xfr_probe_disown(xfr);
   9181 	}
   9182 	if(xfr->task_transfer->worker == worker) {
   9183 		xfr_transfer_disown(xfr);
   9184 	}
   9185 }
   9186