]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/unbound/services/authzone.c
Upgrade Unbound to 1.6.4. More to follow.
[FreeBSD/FreeBSD.git] / contrib / unbound / services / authzone.c
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/msgreply.h"
48 #include "util/data/packed_rrset.h"
49 #include "util/regional.h"
50 #include "util/net_help.h"
51 #include "util/config_file.h"
52 #include "util/log.h"
53 #include "services/cache/dns.h"
54 #include "sldns/rrdef.h"
55 #include "sldns/pkthdr.h"
56 #include "sldns/sbuffer.h"
57 #include "sldns/str2wire.h"
58 #include "sldns/wire2str.h"
59 #include "sldns/parseutil.h"
60 #include "validator/val_nsec3.h"
61 #include "validator/val_secalgo.h"
62
63 /** bytes to use for NSEC3 hash buffer. 20 for sha1 */
64 #define N3HASHBUFLEN 32
65 /** max number of CNAMEs we are willing to follow (in one answer) */
66 #define MAX_CNAME_CHAIN 8
67
68 /** create new dns_msg */
69 static struct dns_msg*
70 msg_create(struct regional* region, struct query_info* qinfo)
71 {
72         struct dns_msg* msg = (struct dns_msg*)regional_alloc(region,
73                 sizeof(struct dns_msg));
74         if(!msg)
75                 return NULL;
76         msg->qinfo.qname = regional_alloc_init(region, qinfo->qname,
77                 qinfo->qname_len);
78         if(!msg->qinfo.qname)
79                 return NULL;
80         msg->qinfo.qname_len = qinfo->qname_len;
81         msg->qinfo.qtype = qinfo->qtype;
82         msg->qinfo.qclass = qinfo->qclass;
83         msg->qinfo.local_alias = NULL;
84         /* non-packed reply_info, because it needs to grow the array */
85         msg->rep = (struct reply_info*)regional_alloc_zero(region,
86                 sizeof(struct reply_info)-sizeof(struct rrset_ref));
87         if(!msg->rep)
88                 return NULL;
89         msg->rep->flags = (uint16_t)(BIT_QR | BIT_AA);
90         msg->rep->authoritative = 1;
91         msg->rep->qdcount = 1;
92         /* rrsets is NULL, no rrsets yet */
93         return msg;
94 }
95
96 /** grow rrset array by one in msg */
97 static int
98 msg_grow_array(struct regional* region, struct dns_msg* msg)
99 {
100         if(msg->rep->rrsets == NULL) {
101                 msg->rep->rrsets = regional_alloc_zero(region,
102                         sizeof(struct ub_packed_rrset_key*)*(msg->rep->rrset_count+1));
103                 if(!msg->rep->rrsets)
104                         return 0;
105         } else {
106                 struct ub_packed_rrset_key** rrsets_old = msg->rep->rrsets;
107                 msg->rep->rrsets = regional_alloc_zero(region,
108                         sizeof(struct ub_packed_rrset_key*)*(msg->rep->rrset_count+1));
109                 if(!msg->rep->rrsets)
110                         return 0;
111                 memmove(msg->rep->rrsets, rrsets_old,
112                         sizeof(struct ub_packed_rrset_key*)*msg->rep->rrset_count);
113         }
114         return 1;
115 }
116
117 /** get ttl of rrset */
118 static time_t
119 get_rrset_ttl(struct ub_packed_rrset_key* k)
120 {
121         struct packed_rrset_data* d = (struct packed_rrset_data*)
122                 k->entry.data;
123         return d->ttl;
124 }
125
126 /** Copy rrset into region from domain-datanode and packet rrset */
127 static struct ub_packed_rrset_key*
128 auth_packed_rrset_copy_region(struct auth_zone* z, struct auth_data* node,
129         struct auth_rrset* rrset, struct regional* region, time_t adjust)
130 {
131         struct ub_packed_rrset_key key;
132         memset(&key, 0, sizeof(key));
133         key.entry.key = &key;
134         key.entry.data = rrset->data;
135         key.rk.dname = node->name;
136         key.rk.dname_len = node->namelen;
137         key.rk.type = htons(rrset->type);
138         key.rk.rrset_class = htons(z->dclass);
139         key.entry.hash = rrset_key_hash(&key.rk);
140         return packed_rrset_copy_region(&key, region, adjust);
141 }
142
143 /** fix up msg->rep TTL and prefetch ttl */
144 static void
145 msg_ttl(struct dns_msg* msg)
146 {
147         if(msg->rep->rrset_count == 0) return;
148         if(msg->rep->rrset_count == 1) {
149                 msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[0]);
150                 msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
151         } else if(get_rrset_ttl(msg->rep->rrsets[msg->rep->rrset_count-1]) <
152                 msg->rep->ttl) {
153                 msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[
154                         msg->rep->rrset_count-1]);
155                 msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
156         }
157 }
158
159 /** see if rrset is a duplicate in the answer message */
160 static int
161 msg_rrset_duplicate(struct dns_msg* msg, uint8_t* nm, size_t nmlen,
162         uint16_t type, uint16_t dclass)
163 {
164         size_t i;
165         for(i=0; i<msg->rep->rrset_count; i++) {
166                 struct ub_packed_rrset_key* k = msg->rep->rrsets[i];
167                 if(ntohs(k->rk.type) == type && k->rk.dname_len == nmlen &&
168                         ntohs(k->rk.rrset_class) == dclass &&
169                         query_dname_compare(k->rk.dname, nm) == 0)
170                         return 1;
171         }
172         return 0;
173 }
174
175 /** add rrset to answer section (no auth, add rrsets yet) */
176 static int
177 msg_add_rrset_an(struct auth_zone* z, struct regional* region,
178         struct dns_msg* msg, struct auth_data* node, struct auth_rrset* rrset)
179 {
180         log_assert(msg->rep->ns_numrrsets == 0);
181         log_assert(msg->rep->ar_numrrsets == 0);
182         if(!rrset)
183                 return 1;
184         if(msg_rrset_duplicate(msg, node->name, node->namelen, rrset->type,
185                 z->dclass))
186                 return 1;
187         /* grow array */
188         if(!msg_grow_array(region, msg))
189                 return 0;
190         /* copy it */
191         if(!(msg->rep->rrsets[msg->rep->rrset_count] =
192                 auth_packed_rrset_copy_region(z, node, rrset, region, 0)))
193                 return 0;
194         msg->rep->rrset_count++;
195         msg->rep->an_numrrsets++;
196         msg_ttl(msg);
197         return 1;
198 }
199
200 /** add rrset to authority section (no additonal section rrsets yet) */
201 static int
202 msg_add_rrset_ns(struct auth_zone* z, struct regional* region,
203         struct dns_msg* msg, struct auth_data* node, struct auth_rrset* rrset)
204 {
205         log_assert(msg->rep->ar_numrrsets == 0);
206         if(!rrset)
207                 return 1;
208         if(msg_rrset_duplicate(msg, node->name, node->namelen, rrset->type,
209                 z->dclass))
210                 return 1;
211         /* grow array */
212         if(!msg_grow_array(region, msg))
213                 return 0;
214         /* copy it */
215         if(!(msg->rep->rrsets[msg->rep->rrset_count] =
216                 auth_packed_rrset_copy_region(z, node, rrset, region, 0)))
217                 return 0;
218         msg->rep->rrset_count++;
219         msg->rep->ns_numrrsets++;
220         msg_ttl(msg);
221         return 1;
222 }
223
224 /** add rrset to additional section */
225 static int
226 msg_add_rrset_ar(struct auth_zone* z, struct regional* region,
227         struct dns_msg* msg, struct auth_data* node, struct auth_rrset* rrset)
228 {
229         if(!rrset)
230                 return 1;
231         if(msg_rrset_duplicate(msg, node->name, node->namelen, rrset->type,
232                 z->dclass))
233                 return 1;
234         /* grow array */
235         if(!msg_grow_array(region, msg))
236                 return 0;
237         /* copy it */
238         if(!(msg->rep->rrsets[msg->rep->rrset_count] =
239                 auth_packed_rrset_copy_region(z, node, rrset, region, 0)))
240                 return 0;
241         msg->rep->rrset_count++;
242         msg->rep->ar_numrrsets++;
243         msg_ttl(msg);
244         return 1;
245 }
246
247 struct auth_zones* auth_zones_create(void)
248 {
249         struct auth_zones* az = (struct auth_zones*)calloc(1, sizeof(*az));
250         if(!az) {
251                 log_err("out of memory");
252                 return NULL;
253         }
254         rbtree_init(&az->ztree, &auth_zone_cmp);
255         lock_rw_init(&az->lock);
256         lock_protect(&az->lock, &az->ztree, sizeof(az->ztree));
257         /* also lock protects the rbnode's in struct auth_zone */
258         return az;
259 }
260
261 int auth_zone_cmp(const void* z1, const void* z2)
262 {
263         /* first sort on class, so that hierarchy can be maintained within
264          * a class */
265         struct auth_zone* a = (struct auth_zone*)z1;
266         struct auth_zone* b = (struct auth_zone*)z2;
267         int m;
268         if(a->dclass != b->dclass) {
269                 if(a->dclass < b->dclass)
270                         return -1;
271                 return 1;
272         }
273         /* sorted such that higher zones sort before lower zones (their
274          * contents) */
275         return dname_lab_cmp(a->name, a->namelabs, b->name, b->namelabs, &m);
276 }
277
278 int auth_data_cmp(const void* z1, const void* z2)
279 {
280         struct auth_data* a = (struct auth_data*)z1;
281         struct auth_data* b = (struct auth_data*)z2;
282         int m;
283         /* canonical sort, because DNSSEC needs that */
284         return dname_canon_lab_cmp(a->name, a->namelabs, b->name,
285                 b->namelabs, &m);
286 }
287
288 /** delete auth rrset node */
289 static void
290 auth_rrset_delete(struct auth_rrset* rrset)
291 {
292         if(!rrset) return;
293         free(rrset->data);
294         free(rrset);
295 }
296
297 /** delete auth data domain node */
298 static void
299 auth_data_delete(struct auth_data* n)
300 {
301         struct auth_rrset* p, *np;
302         if(!n) return;
303         p = n->rrsets;
304         while(p) {
305                 np = p->next;
306                 auth_rrset_delete(p);
307                 p = np;
308         }
309         free(n->name);
310         free(n);
311 }
312
313 /** helper traverse to delete zones */
314 static void
315 auth_data_del(rbnode_type* n, void* ATTR_UNUSED(arg))
316 {
317         struct auth_data* z = (struct auth_data*)n->key;
318         auth_data_delete(z);
319 }
320
321 /** delete an auth zone structure (tree remove must be done elsewhere) */
322 static void
323 auth_zone_delete(struct auth_zone* z)
324 {
325         if(!z) return;
326         lock_rw_destroy(&z->lock);
327         traverse_postorder(&z->data, auth_data_del, NULL);
328         free(z->name);
329         free(z->zonefile);
330         free(z);
331 }
332
333 struct auth_zone*
334 auth_zone_create(struct auth_zones* az, uint8_t* nm, size_t nmlen,
335         uint16_t dclass)
336 {
337         struct auth_zone* z = (struct auth_zone*)calloc(1, sizeof(*z));
338         if(!z) {
339                 return NULL;
340         }
341         z->node.key = z;
342         z->dclass = dclass;
343         z->namelen = nmlen;
344         z->namelabs = dname_count_labels(nm);
345         z->name = memdup(nm, nmlen);
346         if(!z->name) {
347                 free(z);
348                 return NULL;
349         }
350         rbtree_init(&z->data, &auth_data_cmp);
351         lock_rw_init(&z->lock);
352         lock_protect(&z->lock, &z->name, sizeof(*z)-sizeof(rbnode_type));
353         lock_rw_wrlock(&z->lock);
354         /* z lock protects all, except rbtree itself, which is az->lock */
355         if(!rbtree_insert(&az->ztree, &z->node)) {
356                 lock_rw_unlock(&z->lock);
357                 auth_zone_delete(z);
358                 log_warn("duplicate auth zone");
359                 return NULL;
360         }
361         return z;
362 }
363
364 struct auth_zone*
365 auth_zone_find(struct auth_zones* az, uint8_t* nm, size_t nmlen,
366         uint16_t dclass)
367 {
368         struct auth_zone key;
369         key.node.key = &key;
370         key.dclass = dclass;
371         key.name = nm;
372         key.namelen = nmlen;
373         key.namelabs = dname_count_labels(nm);
374         return (struct auth_zone*)rbtree_search(&az->ztree, &key);
375 }
376
377 /** find an auth zone or sorted less-or-equal, return true if exact */
378 static int
379 auth_zone_find_less_equal(struct auth_zones* az, uint8_t* nm, size_t nmlen,
380         uint16_t dclass, struct auth_zone** z)
381 {
382         struct auth_zone key;
383         key.node.key = &key;
384         key.dclass = dclass;
385         key.name = nm;
386         key.namelen = nmlen;
387         key.namelabs = dname_count_labels(nm);
388         return rbtree_find_less_equal(&az->ztree, &key, (rbnode_type**)z);
389 }
390
391 /** find the auth zone that is above the given qname */
392 struct auth_zone*
393 auth_zones_find_zone(struct auth_zones* az, struct query_info* qinfo)
394 {
395         uint8_t* nm = qinfo->qname;
396         size_t nmlen = qinfo->qname_len;
397         struct auth_zone* z;
398         if(auth_zone_find_less_equal(az, nm, nmlen, qinfo->qclass, &z)) {
399                 /* exact match */
400                 return z;
401         } else {
402                 /* less-or-nothing */
403                 if(!z) return NULL; /* nothing smaller, nothing above it */
404                 /* we found smaller name; smaller may be above the qname,
405                  * but not below it. */
406                 nm = dname_get_shared_topdomain(z->name, qinfo->qname);
407                 dname_count_size_labels(nm, &nmlen);
408         }
409         /* search up */
410         while(!z && !dname_is_root(nm)) {
411                 dname_remove_label(&nm, &nmlen);
412                 z = auth_zone_find(az, nm, nmlen, qinfo->qclass);
413         }
414         return z;
415 }
416
417 /** find or create zone with name str. caller must have lock on az. 
418  * returns a wrlocked zone */
419 static struct auth_zone*
420 auth_zones_find_or_add_zone(struct auth_zones* az, char* name)
421 {
422         uint8_t nm[LDNS_MAX_DOMAINLEN+1];
423         size_t nmlen = sizeof(nm);
424         struct auth_zone* z;
425
426         if(sldns_str2wire_dname_buf(name, nm, &nmlen) != 0) {
427                 log_err("cannot parse auth zone name: %s", name);
428                 return 0;
429         }
430         z = auth_zone_find(az, nm, nmlen, LDNS_RR_CLASS_IN);
431         if(!z) {
432                 /* not found, create the zone */
433                 z = auth_zone_create(az, nm, nmlen, LDNS_RR_CLASS_IN);
434         } else {
435                 lock_rw_wrlock(&z->lock);
436         }
437         return z;
438 }
439
440 int
441 auth_zone_set_zonefile(struct auth_zone* z, char* zonefile)
442 {
443         if(z->zonefile) free(z->zonefile);
444         if(zonefile == NULL) {
445                 z->zonefile = NULL;
446         } else {
447                 z->zonefile = strdup(zonefile);
448                 if(!z->zonefile) {
449                         log_err("malloc failure");
450                         return 0;
451                 }
452         }
453         return 1;
454 }
455
456 /** set auth zone fallback. caller must have lock on zone */
457 int
458 auth_zone_set_fallback(struct auth_zone* z, char* fallbackstr)
459 {
460         if(strcmp(fallbackstr, "yes") != 0 && strcmp(fallbackstr, "no") != 0){
461                 log_err("auth zone fallback, expected yes or no, got %s",
462                         fallbackstr);
463                 return 0;
464         }
465         z->fallback_enabled = (strcmp(fallbackstr, "yes")==0);
466         return 1;
467 }
468
469 /** create domain with the given name */
470 static struct auth_data*
471 az_domain_create(struct auth_zone* z, uint8_t* nm, size_t nmlen)
472 {
473         struct auth_data* n = (struct auth_data*)malloc(sizeof(*n));
474         if(!n) return NULL;
475         memset(n, 0, sizeof(*n));
476         n->node.key = n;
477         n->name = memdup(nm, nmlen);
478         if(!n->name) {
479                 free(n);
480                 return NULL;
481         }
482         n->namelen = nmlen;
483         n->namelabs = dname_count_labels(nm);
484         if(!rbtree_insert(&z->data, &n->node)) {
485                 log_warn("duplicate auth domain name");
486                 free(n->name);
487                 free(n);
488                 return NULL;
489         }
490         return n;
491 }
492
493 /** find domain with exactly the given name */
494 static struct auth_data*
495 az_find_name(struct auth_zone* z, uint8_t* nm, size_t nmlen)
496 {
497         struct auth_zone key;
498         key.node.key = &key;
499         key.name = nm;
500         key.namelen = nmlen;
501         key.namelabs = dname_count_labels(nm);
502         return (struct auth_data*)rbtree_search(&z->data, &key);
503 }
504
505 /** Find domain name (or closest match) */
506 static void
507 az_find_domain(struct auth_zone* z, struct query_info* qinfo, int* node_exact,
508         struct auth_data** node)
509 {
510         struct auth_zone key;
511         key.node.key = &key;
512         key.name = qinfo->qname;
513         key.namelen = qinfo->qname_len;
514         key.namelabs = dname_count_labels(key.name);
515         *node_exact = rbtree_find_less_equal(&z->data, &key,
516                 (rbnode_type**)node);
517 }
518
519 /** find or create domain with name in zone */
520 static struct auth_data*
521 az_domain_find_or_create(struct auth_zone* z, uint8_t* dname,
522         size_t dname_len)
523 {
524         struct auth_data* n = az_find_name(z, dname, dname_len);
525         if(!n) {
526                 n = az_domain_create(z, dname, dname_len);
527         }
528         return n;
529 }
530
531 /** find rrset of given type in the domain */
532 static struct auth_rrset*
533 az_domain_rrset(struct auth_data* n, uint16_t t)
534 {
535         struct auth_rrset* rrset;
536         if(!n) return NULL;
537         rrset = n->rrsets;
538         while(rrset) {
539                 if(rrset->type == t)
540                         return rrset;
541                 rrset = rrset->next;
542         }
543         return NULL;
544 }
545
546 /** remove rrset of this type from domain */
547 static void
548 domain_remove_rrset(struct auth_data* node, uint16_t rr_type)
549 {
550         struct auth_rrset* rrset, *prev;
551         if(!node) return;
552         prev = NULL;
553         rrset = node->rrsets;
554         while(rrset) {
555                 if(rrset->type == rr_type) {
556                         /* found it, now delete it */
557                         if(prev) prev->next = rrset->next;
558                         else    node->rrsets = rrset->next;
559                         auth_rrset_delete(rrset);
560                         return;
561                 }
562                 prev = rrset;
563                 rrset = rrset->next;
564         }
565 }
566
567 /** see if rdata is duplicate */
568 static int
569 rdata_duplicate(struct packed_rrset_data* d, uint8_t* rdata, size_t len)
570 {
571         size_t i;
572         for(i=0; i<d->count + d->rrsig_count; i++) {
573                 if(d->rr_len[i] != len)
574                         continue;
575                 if(memcmp(d->rr_data[i], rdata, len) == 0)
576                         return 1;
577         }
578         return 0;
579 }
580
581 /** get rrsig type covered from rdata.
582  * @param rdata: rdata in wireformat, starting with 16bit rdlength.
583  * @param rdatalen: length of rdata buffer.
584  * @return type covered (or 0).
585  */
586 static uint16_t
587 rrsig_rdata_get_type_covered(uint8_t* rdata, size_t rdatalen)
588 {
589         if(rdatalen < 4)
590                 return 0;
591         return sldns_read_uint16(rdata+2);
592 }
593
594 /** add RR to existing RRset. If insert_sig is true, add to rrsigs. 
595  * This reallocates the packed rrset for a new one */
596 static int
597 rrset_add_rr(struct auth_rrset* rrset, uint32_t rr_ttl, uint8_t* rdata,
598         size_t rdatalen, int insert_sig)
599 {
600         struct packed_rrset_data* d, *old = rrset->data;
601         size_t total, old_total;
602
603         d = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(old)
604                 + sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t)
605                 + rdatalen);
606         if(!d) {
607                 log_err("out of memory");
608                 return 0;
609         }
610         /* copy base values */
611         memcpy(d, old, sizeof(struct packed_rrset_data));
612         if(!insert_sig) {
613                 d->count++;
614         } else {
615                 d->rrsig_count++;
616         }
617         old_total = old->count + old->rrsig_count;
618         total = d->count + d->rrsig_count;
619         /* set rr_len, needed for ptr_fixup */
620         d->rr_len = (size_t*)((uint8_t*)d +
621                 sizeof(struct packed_rrset_data));
622         if(old->count != 0)
623                 memmove(d->rr_len, old->rr_len, old->count*sizeof(size_t));
624         if(old->rrsig_count != 0)
625                 memmove(d->rr_len+d->count, old->rr_len+old->count,
626                         old->rrsig_count*sizeof(size_t));
627         if(!insert_sig)
628                 d->rr_len[d->count-1] = rdatalen;
629         else    d->rr_len[total-1] = rdatalen;
630         packed_rrset_ptr_fixup(d);
631         if(rr_ttl < d->ttl)
632                 d->ttl = rr_ttl;
633
634         /* copy old values into new array */
635         if(old->count != 0) {
636                 memmove(d->rr_ttl, old->rr_ttl, old->count*sizeof(time_t));
637                 /* all the old rr pieces are allocated sequential, so we
638                  * can copy them in one go */
639                 memmove(d->rr_data[0], old->rr_data[0],
640                         (old->rr_data[old->count-1] - old->rr_data[0]) +
641                         old->rr_len[old->count-1]);
642         }
643         if(old->rrsig_count != 0) {
644                 memmove(d->rr_ttl+d->count, old->rr_ttl+old->count,
645                         old->rrsig_count*sizeof(time_t));
646                 memmove(d->rr_data[d->count], old->rr_data[old->count],
647                         (old->rr_data[old_total-1] - old->rr_data[old->count]) +
648                         old->rr_len[old_total-1]);
649         }
650
651         /* insert new value */
652         if(!insert_sig) {
653                 d->rr_ttl[d->count-1] = rr_ttl;
654                 memmove(d->rr_data[d->count-1], rdata, rdatalen);
655         } else {
656                 d->rr_ttl[total-1] = rr_ttl;
657                 memmove(d->rr_data[total-1], rdata, rdatalen);
658         }
659
660         rrset->data = d;
661         free(old);
662         return 1;
663 }
664
665 /** Create new rrset for node with packed rrset with one RR element */
666 static struct auth_rrset*
667 rrset_create(struct auth_data* node, uint16_t rr_type, uint32_t rr_ttl,
668         uint8_t* rdata, size_t rdatalen)
669 {
670         struct auth_rrset* rrset = (struct auth_rrset*)calloc(1,
671                 sizeof(*rrset));
672         struct auth_rrset* p, *prev;
673         struct packed_rrset_data* d;
674         if(!rrset) {
675                 log_err("out of memory");
676                 return NULL;
677         }
678         rrset->type = rr_type;
679
680         /* the rrset data structure, with one RR */
681         d = (struct packed_rrset_data*)calloc(1,
682                 sizeof(struct packed_rrset_data) + sizeof(size_t) +
683                 sizeof(uint8_t*) + sizeof(time_t) + rdatalen);
684         if(!d) {
685                 free(rrset);
686                 log_err("out of memory");
687                 return NULL;
688         }
689         rrset->data = d;
690         d->ttl = rr_ttl;
691         d->trust = rrset_trust_prim_noglue;
692         d->rr_len = (size_t*)((uint8_t*)d + sizeof(struct packed_rrset_data));
693         d->rr_data = (uint8_t**)&(d->rr_len[1]);
694         d->rr_ttl = (time_t*)&(d->rr_data[1]);
695         d->rr_data[0] = (uint8_t*)&(d->rr_ttl[1]);
696
697         /* insert the RR */
698         d->rr_len[0] = rdatalen;
699         d->rr_ttl[0] = rr_ttl;
700         memmove(d->rr_data[0], rdata, rdatalen);
701         d->count++;
702
703         /* insert rrset into linked list for domain */
704         /* find sorted place to link the rrset into the list */
705         prev = NULL;
706         p = node->rrsets;
707         while(p && p->type<=rr_type) {
708                 prev = p;
709                 p = p->next;
710         }
711         /* so, prev is smaller, and p is larger than rr_type */
712         rrset->next = p;
713         if(prev) prev->next = rrset;
714         else node->rrsets = rrset;
715         return rrset;
716 }
717
718 /** count number (and size) of rrsigs that cover a type */
719 static size_t
720 rrsig_num_that_cover(struct auth_rrset* rrsig, uint16_t rr_type, size_t* sigsz)
721 {
722         struct packed_rrset_data* d = rrsig->data;
723         size_t i, num = 0;
724         *sigsz = 0;
725         log_assert(d && rrsig->type == LDNS_RR_TYPE_RRSIG);
726         for(i=0; i<d->count+d->rrsig_count; i++) {
727                 if(rrsig_rdata_get_type_covered(d->rr_data[i],
728                         d->rr_len[i]) == rr_type) {
729                         num++;
730                         (*sigsz) += d->rr_len[i];
731                 }
732         }
733         return num;
734 }
735
736 /** See if rrsig set has covered sigs for rrset and move them over */
737 static int
738 rrset_moveover_rrsigs(struct auth_data* node, uint16_t rr_type,
739         struct auth_rrset* rrset, struct auth_rrset* rrsig)
740 {
741         size_t sigs, sigsz, i, j, total;
742         struct packed_rrset_data* sigold = rrsig->data;
743         struct packed_rrset_data* old = rrset->data;
744         struct packed_rrset_data* d, *sigd;
745
746         log_assert(rrset->type == rr_type);
747         log_assert(rrsig->type == LDNS_RR_TYPE_RRSIG);
748         sigs = rrsig_num_that_cover(rrsig, rr_type, &sigsz);
749         if(sigs == 0) {
750                 /* 0 rrsigs to move over, done */
751                 return 1;
752         }
753         log_info("moveover %d sigs size %d", (int)sigs, (int)sigsz);
754
755         /* allocate rrset sigsz larger for extra sigs elements, and
756          * allocate rrsig sigsz smaller for less sigs elements. */
757         d = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(old)
758                 + sigs*(sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t))
759                 + sigsz);
760         if(!d) {
761                 log_err("out of memory");
762                 return 0;
763         }
764         /* copy base values */
765         total = old->count + old->rrsig_count;
766         memcpy(d, old, sizeof(struct packed_rrset_data));
767         d->rrsig_count += sigs;
768         /* setup rr_len */
769         d->rr_len = (size_t*)((uint8_t*)d +
770                 sizeof(struct packed_rrset_data));
771         if(total != 0)
772                 memmove(d->rr_len, old->rr_len, total*sizeof(size_t));
773         j = d->count+d->rrsig_count-sigs;
774         for(i=0; i<sigold->count+sigold->rrsig_count; i++) {
775                 if(rrsig_rdata_get_type_covered(sigold->rr_data[i],
776                         sigold->rr_len[i]) == rr_type) {
777                         d->rr_len[j] = sigold->rr_len[i];
778                         j++;
779                 }
780         }
781         packed_rrset_ptr_fixup(d);
782
783         /* copy old values into new array */
784         if(total != 0) {
785                 memmove(d->rr_ttl, old->rr_ttl, total*sizeof(time_t));
786                 /* all the old rr pieces are allocated sequential, so we
787                  * can copy them in one go */
788                 memmove(d->rr_data[0], old->rr_data[0],
789                         (old->rr_data[total-1] - old->rr_data[0]) +
790                         old->rr_len[total-1]);
791         }
792
793         /* move over the rrsigs to the larger rrset*/
794         j = d->count+d->rrsig_count-sigs;
795         for(i=0; i<sigold->count+sigold->rrsig_count; i++) {
796                 if(rrsig_rdata_get_type_covered(sigold->rr_data[i],
797                         sigold->rr_len[i]) == rr_type) {
798                         /* move this one over to location j */
799                         d->rr_ttl[j] = sigold->rr_ttl[i];
800                         memmove(d->rr_data[j], sigold->rr_data[i],
801                                 sigold->rr_len[i]);
802                         if(d->rr_ttl[j] < d->ttl)
803                                 d->ttl = d->rr_ttl[j];
804                         j++;
805                 }
806         }
807
808         /* put it in and deallocate the old rrset */
809         rrset->data = d;
810         free(old);
811
812         /* now make rrsig set smaller */
813         if(sigold->count+sigold->rrsig_count == sigs) {
814                 /* remove all sigs from rrsig, remove it entirely */
815                 domain_remove_rrset(node, LDNS_RR_TYPE_RRSIG);
816                 return 1;
817         }
818         log_assert(packed_rrset_sizeof(sigold) > sigs*(sizeof(size_t) +
819                 sizeof(uint8_t*) + sizeof(time_t)) + sigsz);
820         sigd = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(sigold)
821                 - sigs*(sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t))
822                 - sigsz);
823         if(!sigd) {
824                 /* no need to free up d, it has already been placed in the
825                  * node->rrset structure */
826                 log_err("out of memory");
827                 return 0;
828         }
829         /* copy base values */
830         memcpy(sigd, sigold, sizeof(struct packed_rrset_data));
831         sigd->rrsig_count -= sigs;
832         /* setup rr_len */
833         sigd->rr_len = (size_t*)((uint8_t*)sigd +
834                 sizeof(struct packed_rrset_data));
835         j = 0;
836         for(i=0; i<sigold->count+sigold->rrsig_count; i++) {
837                 if(rrsig_rdata_get_type_covered(sigold->rr_data[i],
838                         sigold->rr_len[i]) != rr_type) {
839                         sigd->rr_len[j] = sigold->rr_len[i];
840                         j++;
841                 }
842         }
843         packed_rrset_ptr_fixup(sigd);
844
845         /* copy old values into new rrsig array */
846         j = 0;
847         for(i=0; i<sigold->count+sigold->rrsig_count; i++) {
848                 if(rrsig_rdata_get_type_covered(sigold->rr_data[i],
849                         sigold->rr_len[i]) != rr_type) {
850                         /* move this one over to location j */
851                         sigd->rr_ttl[j] = sigold->rr_ttl[i];
852                         memmove(sigd->rr_data[j], sigold->rr_data[i],
853                                 sigold->rr_len[i]);
854                         if(j==0) sigd->ttl = sigd->rr_ttl[j];
855                         else {
856                                 if(sigd->rr_ttl[j] < sigd->ttl)
857                                         sigd->ttl = sigd->rr_ttl[j];
858                         }
859                         j++;
860                 }
861         }
862
863         /* put it in and deallocate the old rrset */
864         rrsig->data = sigd;
865         free(sigold);
866
867         return 1;
868 }
869
870 /** Add rr to node, ignores duplicate RRs,
871  * rdata points to buffer with rdatalen octets, starts with 2bytelength. */
872 static int
873 az_domain_add_rr(struct auth_data* node, uint16_t rr_type, uint32_t rr_ttl,
874         uint8_t* rdata, size_t rdatalen)
875 {
876         struct auth_rrset* rrset;
877         /* packed rrsets have their rrsigs along with them, sort them out */
878         if(rr_type == LDNS_RR_TYPE_RRSIG) {
879                 uint16_t ctype = rrsig_rdata_get_type_covered(rdata, rdatalen);
880                 if((rrset=az_domain_rrset(node, ctype))!= NULL) {
881                         /* a node of the correct type exists, add the RRSIG
882                          * to the rrset of the covered data type */
883                         if(rdata_duplicate(rrset->data, rdata, rdatalen))
884                                 return 1;
885                         if(!rrset_add_rr(rrset, rr_ttl, rdata, rdatalen, 1))
886                                 return 0;
887                 } else if((rrset=az_domain_rrset(node, rr_type))!= NULL) {
888                         /* add RRSIG to rrset of type RRSIG */
889                         if(rdata_duplicate(rrset->data, rdata, rdatalen))
890                                 return 1;
891                         if(!rrset_add_rr(rrset, rr_ttl, rdata, rdatalen, 0))
892                                 return 0;
893                 } else {
894                         /* create rrset of type RRSIG */
895                         if(!rrset_create(node, rr_type, rr_ttl, rdata,
896                                 rdatalen))
897                                 return 0;
898                 }
899         } else {
900                 /* normal RR type */
901                 if((rrset=az_domain_rrset(node, rr_type))!= NULL) {
902                         /* add data to existing node with data type */
903                         if(rdata_duplicate(rrset->data, rdata, rdatalen))
904                                 return 1;
905                         if(!rrset_add_rr(rrset, rr_ttl, rdata, rdatalen, 0))
906                                 return 0;
907                 } else {
908                         struct auth_rrset* rrsig;
909                         /* create new node with data type */
910                         if(!(rrset=rrset_create(node, rr_type, rr_ttl, rdata,
911                                 rdatalen)))
912                                 return 0;
913
914                         /* see if node of type RRSIG has signatures that
915                          * cover the data type, and move them over */
916                         /* and then make the RRSIG type smaller */
917                         if((rrsig=az_domain_rrset(node, LDNS_RR_TYPE_RRSIG))
918                                 != NULL) {
919                                 if(!rrset_moveover_rrsigs(node, rr_type,
920                                         rrset, rrsig))
921                                         return 0;
922                         }
923                 }
924         }
925         return 1;
926 }
927
928 /** insert RR into zone, ignore duplicates */
929 static int
930 az_insert_rr(struct auth_zone* z, uint8_t* rr, size_t rr_len,
931         size_t dname_len)
932 {
933         struct auth_data* node;
934         uint8_t* dname = rr;
935         uint16_t rr_type = sldns_wirerr_get_type(rr, rr_len, dname_len);
936         uint16_t rr_class = sldns_wirerr_get_class(rr, rr_len, dname_len);
937         uint32_t rr_ttl = sldns_wirerr_get_ttl(rr, rr_len, dname_len);
938         size_t rdatalen = ((size_t)sldns_wirerr_get_rdatalen(rr, rr_len,
939                 dname_len))+2;
940         /* rdata points to rdata prefixed with uint16 rdatalength */
941         uint8_t* rdata = sldns_wirerr_get_rdatawl(rr, rr_len, dname_len);
942
943         if(rr_class != z->dclass) {
944                 log_err("wrong class for RR");
945                 return 0;
946         }
947         if(!(node=az_domain_find_or_create(z, dname, dname_len))) {
948                 log_err("cannot create domain");
949                 return 0;
950         }
951         if(!az_domain_add_rr(node, rr_type, rr_ttl, rdata, rdatalen)) {
952                 log_err("cannot add RR to domain");
953                 return 0;
954         }
955         return 1;
956 }
957
958 /** 
959  * Parse zonefile
960  * @param z: zone to read in.
961  * @param in: file to read from (just opened).
962  * @param rr: buffer to use for RRs, 64k.
963  *      passed so that recursive includes can use the same buffer and do
964  *      not grow the stack too much.
965  * @param rrbuflen: sizeof rr buffer.
966  * @param state: parse state with $ORIGIN, $TTL and 'prev-dname' and so on,
967  *      that is kept between includes.
968  *      The lineno is set at 1 and then increased by the function.
969  * returns false on failure, has printed an error message
970  */
971 static int
972 az_parse_file(struct auth_zone* z, FILE* in, uint8_t* rr, size_t rrbuflen,
973         struct sldns_file_parse_state* state)
974 {
975         size_t rr_len, dname_len;
976         int status;
977         state->lineno = 1;
978
979         while(!feof(in)) {
980                 rr_len = rrbuflen;
981                 dname_len = 0;
982                 status = sldns_fp2wire_rr_buf(in, rr, &rr_len, &dname_len,
983                         state);
984                 if(status == LDNS_WIREPARSE_ERR_INCLUDE && rr_len == 0) {
985                         /* we have $INCLUDE or $something */
986                         if(strncmp((char*)rr, "$INCLUDE ", 9) == 0 ||
987                            strncmp((char*)rr, "$INCLUDE\t", 9) == 0) {
988                                 FILE* inc;
989                                 int lineno_orig = state->lineno;
990                                 char* incfile = (char*)rr + 8;
991                                 /* skip spaces */
992                                 while(*incfile == ' ' || *incfile == '\t')
993                                         incfile++;
994                                 verbose(VERB_ALGO, "opening $INCLUDE %s",
995                                         incfile);
996                                 inc = fopen(incfile, "r");
997                                 if(!inc) {
998                                         log_err("%s:%d cannot open include "
999                                                 "file %s: %s", z->zonefile,
1000                                                 lineno_orig, incfile,
1001                                                 strerror(errno));
1002                                         return 0;
1003                                 }
1004                                 /* recurse read that file now */
1005                                 if(!az_parse_file(z, inc, rr, rrbuflen,
1006                                         state)) {
1007                                         log_err("%s:%d cannot parse include "
1008                                                 "file %s", z->zonefile,
1009                                                 lineno_orig, incfile);
1010                                         fclose(inc);
1011                                         return 0;
1012                                 }
1013                                 fclose(inc);
1014                                 verbose(VERB_ALGO, "done with $INCLUDE %s",
1015                                         incfile);
1016                                 state->lineno = lineno_orig;
1017                         }
1018                         continue;
1019                 }
1020                 if(status != 0) {
1021                         log_err("parse error %s %d:%d: %s", z->zonefile,
1022                                 state->lineno, LDNS_WIREPARSE_OFFSET(status),
1023                                 sldns_get_errorstr_parse(status));
1024                         return 0;
1025                 }
1026                 if(rr_len == 0) {
1027                         /* EMPTY line, TTL or ORIGIN */
1028                         continue;
1029                 }
1030                 /* insert wirerr in rrbuf */
1031                 if(!az_insert_rr(z, rr, rr_len, dname_len)) {
1032                         char buf[17];
1033                         sldns_wire2str_type_buf(sldns_wirerr_get_type(rr,
1034                                 rr_len, dname_len), buf, sizeof(buf));
1035                         log_err("%s:%d cannot insert RR of type %s",
1036                                 z->zonefile, state->lineno, buf);
1037                         return 0;
1038                 }
1039         }
1040         return 1;
1041 }
1042
1043 int
1044 auth_zone_read_zonefile(struct auth_zone* z)
1045 {
1046         uint8_t rr[LDNS_RR_BUF_SIZE];
1047         struct sldns_file_parse_state state;
1048         FILE* in;
1049         if(!z || !z->zonefile || z->zonefile[0]==0)
1050                 return 1; /* no file, or "", nothing to read */
1051         verbose(VERB_ALGO, "read zonefile %s", z->zonefile);
1052         in = fopen(z->zonefile, "r");
1053         if(!in) {
1054                 char* n = sldns_wire2str_dname(z->name, z->namelen);
1055                 log_err("cannot open zonefile %s for %s: %s",
1056                         z->zonefile, n?n:"error", strerror(errno));
1057                 free(n);
1058                 return 0;
1059         }
1060         memset(&state, 0, sizeof(state));
1061         /* default TTL to 3600 */
1062         state.default_ttl = 3600;
1063         /* set $ORIGIN to the zone name */
1064         if(z->namelen <= sizeof(state.origin)) {
1065                 memcpy(state.origin, z->name, z->namelen);
1066                 state.origin_len = z->namelen;
1067         }
1068         /* parse the (toplevel) file */
1069         if(!az_parse_file(z, in, rr, sizeof(rr), &state)) {
1070                 char* n = sldns_wire2str_dname(z->name, z->namelen);
1071                 log_err("error parsing zonefile %s for %s",
1072                         z->zonefile, n?n:"error");
1073                 free(n);
1074                 fclose(in);
1075                 return 0;
1076         }
1077         fclose(in);
1078         return 1;
1079 }
1080
1081 /** write buffer to file and check return codes */
1082 static int
1083 write_out(FILE* out, const char* str)
1084 {
1085         size_t r, len = strlen(str);
1086         if(len == 0)
1087                 return 1;
1088         r = fwrite(str, 1, len, out);
1089         if(r == 0) {
1090                 log_err("write failed: %s", strerror(errno));
1091                 return 0;
1092         } else if(r < len) {
1093                 log_err("write failed: too short (disk full?)");
1094                 return 0;
1095         }
1096         return 1;
1097 }
1098
1099 /** write rrset to file */
1100 static int
1101 auth_zone_write_rrset(struct auth_zone* z, struct auth_data* node,
1102         struct auth_rrset* r, FILE* out)
1103 {
1104         size_t i, count = r->data->count + r->data->rrsig_count;
1105         char buf[LDNS_RR_BUF_SIZE];
1106         for(i=0; i<count; i++) {
1107                 struct ub_packed_rrset_key key;
1108                 memset(&key, 0, sizeof(key));
1109                 key.entry.key = &key;
1110                 key.entry.data = r->data;
1111                 key.rk.dname = node->name;
1112                 key.rk.dname_len = node->namelen;
1113                 key.rk.type = htons(r->type);
1114                 key.rk.rrset_class = htons(z->dclass);
1115                 if(!packed_rr_to_string(&key, i, 0, buf, sizeof(buf))) {
1116                         verbose(VERB_ALGO, "failed to rr2str rr %d", (int)i);
1117                         continue;
1118                 }
1119                 if(!write_out(out, buf))
1120                         return 0;
1121         }
1122         return 1;
1123 }
1124
1125 /** write domain to file */
1126 static int
1127 auth_zone_write_domain(struct auth_zone* z, struct auth_data* n, FILE* out)
1128 {
1129         struct auth_rrset* r;
1130         /* if this is zone apex, write SOA first */
1131         if(z->namelen == n->namelen) {
1132                 struct auth_rrset* soa = az_domain_rrset(n, LDNS_RR_TYPE_SOA);
1133                 if(soa) {
1134                         if(!auth_zone_write_rrset(z, n, soa, out))
1135                                 return 0;
1136                 }
1137         }
1138         /* write all the RRsets for this domain */
1139         for(r = n->rrsets; r; r = r->next) {
1140                 if(z->namelen == n->namelen &&
1141                         r->type == LDNS_RR_TYPE_SOA)
1142                         continue; /* skip SOA here */
1143                 if(!auth_zone_write_rrset(z, n, r, out))
1144                         return 0;
1145         }
1146         return 1;
1147 }
1148
1149 int auth_zone_write_file(struct auth_zone* z, const char* fname)
1150 {
1151         FILE* out;
1152         struct auth_data* n;
1153         out = fopen(fname, "w");
1154         if(!out) {
1155                 log_err("could not open %s: %s", fname, strerror(errno));
1156                 return 0;
1157         }
1158         RBTREE_FOR(n, struct auth_data*, &z->data) {
1159                 if(!auth_zone_write_domain(z, n, out)) {
1160                         log_err("could not write domain to %s", fname);
1161                         fclose(out);
1162                         return 0;
1163                 }
1164         }
1165         fclose(out);
1166         return 1;
1167 }
1168
1169 /** read all auth zones from file (if they have) */
1170 static int
1171 auth_zones_read_zones(struct auth_zones* az)
1172 {
1173         struct auth_zone* z;
1174         lock_rw_wrlock(&az->lock);
1175         RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
1176                 lock_rw_wrlock(&z->lock);
1177                 if(!auth_zone_read_zonefile(z)) {
1178                         lock_rw_unlock(&z->lock);
1179                         lock_rw_unlock(&az->lock);
1180                         return 0;
1181                 }
1182                 lock_rw_unlock(&z->lock);
1183         }
1184         lock_rw_unlock(&az->lock);
1185         return 1;
1186 }
1187
1188 /** set str2list with (zonename, zonefile) config items and create zones */
1189 static int
1190 auth_zones_cfg_zonefile(struct auth_zones* az, struct config_str2list* zlist)
1191 {
1192         struct auth_zone* z;
1193         while(zlist) {
1194                 lock_rw_wrlock(&az->lock);
1195                 if(!(z=auth_zones_find_or_add_zone(az, zlist->str))) {
1196                         lock_rw_unlock(&az->lock);
1197                         return 0;
1198                 }
1199                 lock_rw_unlock(&az->lock);
1200                 if(!auth_zone_set_zonefile(z, zlist->str2)) {
1201                         lock_rw_unlock(&z->lock);
1202                         return 0;
1203                 }
1204                 lock_rw_unlock(&z->lock);
1205                 zlist = zlist->next;
1206         }
1207         return 1;
1208 }
1209
1210 /** set str2list with (zonename, fallback) config items and create zones */
1211 static int
1212 auth_zones_cfg_fallback(struct auth_zones* az, struct config_str2list* zlist)
1213 {
1214         struct auth_zone* z;
1215         while(zlist) {
1216                 lock_rw_wrlock(&az->lock);
1217                 if(!(z=auth_zones_find_or_add_zone(az, zlist->str))) {
1218                         lock_rw_unlock(&az->lock);
1219                         return 0;
1220                 }
1221                 lock_rw_unlock(&az->lock);
1222                 if(!auth_zone_set_fallback(z, zlist->str2)) {
1223                         lock_rw_unlock(&z->lock);
1224                         return 0;
1225                 }
1226                 lock_rw_unlock(&z->lock);
1227                 zlist = zlist->next;
1228         }
1229         return 1;
1230 }
1231
1232 int auth_zones_apply_config(struct auth_zones* az, struct config_file* cfg)
1233 {
1234         (void)cfg;
1235         /* TODO cfg str2lists */
1236         /* create config items for
1237          * auth-zone:   name: "example.com"
1238          *              zonefile: "zones/example.com"
1239          *              fallback: yes
1240          */
1241         if(!auth_zones_cfg_zonefile(az, NULL /*cfg->auth_zones*/))
1242                 return 0;
1243         if(!auth_zones_cfg_fallback(az, NULL /*cfg->auth_zones*/))
1244                 return 0;
1245         if(!auth_zones_read_zones(az))
1246                 return 0;
1247         return 1;
1248 }
1249
1250 /** helper traverse to delete zones */
1251 static void
1252 auth_zone_del(rbnode_type* n, void* ATTR_UNUSED(arg))
1253 {
1254         struct auth_zone* z = (struct auth_zone*)n->key;
1255         auth_zone_delete(z);
1256 }
1257
1258 void auth_zones_delete(struct auth_zones* az)
1259 {
1260         if(!az) return;
1261         lock_rw_destroy(&az->lock);
1262         traverse_postorder(&az->ztree, auth_zone_del, NULL);
1263         free(az);
1264 }
1265
1266 /** true if domain has only nsec3 */
1267 static int
1268 domain_has_only_nsec3(struct auth_data* n)
1269 {
1270         struct auth_rrset* rrset = n->rrsets;
1271         int nsec3_seen = 0;
1272         while(rrset) {
1273                 if(rrset->type == LDNS_RR_TYPE_NSEC3) {
1274                         nsec3_seen = 1;
1275                 } else if(rrset->type != LDNS_RR_TYPE_RRSIG) {
1276                         return 0;
1277                 }
1278                 rrset = rrset->next;
1279         }
1280         return nsec3_seen;
1281 }
1282
1283 /** see if the domain has a wildcard child '*.domain' */
1284 static struct auth_data*
1285 az_find_wildcard_domain(struct auth_zone* z, uint8_t* nm, size_t nmlen)
1286 {
1287         uint8_t wc[LDNS_MAX_DOMAINLEN];
1288         if(nmlen+2 > sizeof(wc))
1289                 return NULL; /* result would be too long */
1290         wc[0] = 1; /* length of wildcard label */
1291         wc[1] = (uint8_t)'*'; /* wildcard label */
1292         memmove(wc+2, nm, nmlen);
1293         return az_find_name(z, wc, nmlen+2);
1294 }
1295
1296 /** find wildcard between qname and cename */
1297 static struct auth_data*
1298 az_find_wildcard(struct auth_zone* z, struct query_info* qinfo,
1299         struct auth_data* ce)
1300 {
1301         uint8_t* nm = qinfo->qname;
1302         size_t nmlen = qinfo->qname_len;
1303         struct auth_data* node;
1304         if(!dname_subdomain_c(nm, z->name))
1305                 return NULL; /* out of zone */
1306         while((node=az_find_wildcard_domain(z, nm, nmlen))==NULL) {
1307                 /* see if we can go up to find the wildcard */
1308                 if(nmlen == z->namelen)
1309                         return NULL; /* top of zone reached */
1310                 if(ce && nmlen == ce->namelen)
1311                         return NULL; /* ce reached */
1312                 if(dname_is_root(nm))
1313                         return NULL; /* cannot go up */
1314                 dname_remove_label(&nm, &nmlen);
1315         }
1316         return node;
1317 }
1318
1319 /** domain is not exact, find first candidate ce (name that matches
1320  * a part of qname) in tree */
1321 static struct auth_data*
1322 az_find_candidate_ce(struct auth_zone* z, struct query_info* qinfo,
1323         struct auth_data* n)
1324 {
1325         uint8_t* nm;
1326         size_t nmlen;
1327         if(n) {
1328                 nm = dname_get_shared_topdomain(qinfo->qname, n->name);
1329         } else {
1330                 nm = qinfo->qname;
1331         }
1332         dname_count_size_labels(nm, &nmlen);
1333         n = az_find_name(z, nm, nmlen);
1334         /* delete labels and go up on name */
1335         while(!n) {
1336                 if(dname_is_root(nm))
1337                         return NULL; /* cannot go up */
1338                 dname_remove_label(&nm, &nmlen);
1339                 n = az_find_name(z, nm, nmlen);
1340         }
1341         return n;
1342 }
1343
1344 /** go up the auth tree to next existing name. */
1345 static struct auth_data*
1346 az_domain_go_up(struct auth_zone* z, struct auth_data* n)
1347 {
1348         uint8_t* nm = n->name;
1349         size_t nmlen = n->namelen;
1350         while(!dname_is_root(nm)) {
1351                 dname_remove_label(&nm, &nmlen);
1352                 if((n=az_find_name(z, nm, nmlen)) != NULL)
1353                         return n;
1354         }
1355         return NULL;
1356 }
1357
1358 /** Find the closest encloser, an name that exists and is above the
1359  * qname.
1360  * return true if the node (param node) is existing, nonobscured and
1361  *      can be used to generate answers from.  It is then also node_exact.
1362  * returns false if the node is not good enough (or it wasn't node_exact)
1363  *      in this case the ce can be filled.
1364  *      if ce is NULL, no ce exists, and likely the zone is completely empty,
1365  *      not even with a zone apex.
1366  *      if ce is nonNULL it is the closest enclosing upper name (that exists
1367  *      itself for answer purposes).  That name may have DNAME, NS or wildcard
1368  *      rrset is the closest DNAME or NS rrset that was found.
1369  */
1370 static int
1371 az_find_ce(struct auth_zone* z, struct query_info* qinfo,
1372         struct auth_data* node, int node_exact, struct auth_data** ce,
1373         struct auth_rrset** rrset)
1374 {
1375         struct auth_data* n = node;
1376         *ce = NULL;
1377         *rrset = NULL;
1378         if(!node_exact) {
1379                 /* if not exact, lookup closest exact match */
1380                 n = az_find_candidate_ce(z, qinfo, n);
1381         } else {
1382                 /* if exact, the node itself is the first candidate ce */
1383                 *ce = n;
1384         }
1385
1386         /* no direct answer from nsec3-only domains */
1387         if(n && domain_has_only_nsec3(n)) {
1388                 node_exact = 0;
1389                 *ce = NULL;
1390         }
1391
1392         /* with exact matches, walk up the labels until we find the
1393          * delegation, or DNAME or zone end */
1394         while(n) {
1395                 /* see if the current candidate has issues */
1396                 /* not zone apex and has type NS */
1397                 if(n->namelen != z->namelen &&
1398                         (*rrset=az_domain_rrset(n, LDNS_RR_TYPE_NS)) &&
1399                         /* delegate here, but DS at exact the dp has notype */
1400                         (qinfo->qtype != LDNS_RR_TYPE_DS || 
1401                         n->namelen != qinfo->qname_len)) {
1402                         /* referral */
1403                         /* this is ce and the lowernode is nonexisting */
1404                         *ce = n;
1405                         return 0;
1406                 }
1407                 /* not equal to qname and has type DNAME */
1408                 if(n->namelen != qinfo->qname_len &&
1409                         (*rrset=az_domain_rrset(n, LDNS_RR_TYPE_DNAME))) {
1410                         /* this is ce and the lowernode is nonexisting */
1411                         *ce = n;
1412                         return 0;
1413                 }
1414
1415                 if(*ce == NULL && !domain_has_only_nsec3(n)) {
1416                         /* if not found yet, this exact name must be
1417                          * our lowest match (but not nsec3onlydomain) */
1418                         *ce = n;
1419                 }
1420
1421                 /* walk up the tree by removing labels from name and lookup */
1422                 n = az_domain_go_up(z, n);
1423         }
1424         /* found no problems, if it was an exact node, it is fine to use */
1425         return node_exact;
1426 }
1427
1428 /** add additional A/AAAA from domain names in rrset rdata (+offset)
1429  * offset is number of bytes in rdata where the dname is located. */
1430 static int
1431 az_add_additionals_from(struct auth_zone* z, struct regional* region,
1432         struct dns_msg* msg, struct auth_rrset* rrset, size_t offset)
1433 {
1434         struct packed_rrset_data* d = rrset->data;
1435         size_t i;
1436         if(!d) return 0;
1437         for(i=0; i<d->count; i++) {
1438                 size_t dlen;
1439                 struct auth_data* domain;
1440                 struct auth_rrset* ref;
1441                 if(d->rr_len[i] < 2+offset)
1442                         continue; /* too short */
1443                 if(!(dlen = dname_valid(d->rr_data[i]+2+offset,
1444                         d->rr_len[i]-2-offset)))
1445                         continue; /* malformed */
1446                 domain = az_find_name(z, d->rr_data[i]+2+offset, dlen);
1447                 if(!domain)
1448                         continue;
1449                 if((ref=az_domain_rrset(domain, LDNS_RR_TYPE_A)) != NULL) {
1450                         if(!msg_add_rrset_ar(z, region, msg, domain, ref))
1451                                 return 0;
1452                 }
1453                 if((ref=az_domain_rrset(domain, LDNS_RR_TYPE_AAAA)) != NULL) {
1454                         if(!msg_add_rrset_ar(z, region, msg, domain, ref))
1455                                 return 0;
1456                 }
1457         }
1458         return 1;
1459 }
1460
1461 /** add negative SOA record (with negative TTL) */
1462 static int
1463 az_add_negative_soa(struct auth_zone* z, struct regional* region,
1464         struct dns_msg* msg)
1465 {
1466         uint32_t minimum;
1467         struct packed_rrset_data* d;
1468         struct auth_rrset* soa;
1469         struct auth_data* apex = az_find_name(z, z->name, z->namelen);
1470         if(!apex) return 0;
1471         soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA);
1472         if(!soa) return 0;
1473         /* must be first to put in message; we want to fix the TTL with
1474          * one RRset here, otherwise we'd need to loop over the RRs to get
1475          * the resulting lower TTL */
1476         log_assert(msg->rep->rrset_count == 0);
1477         if(!msg_add_rrset_ns(z, region, msg, apex, soa)) return 0;
1478         /* fixup TTL */
1479         d = (struct packed_rrset_data*)msg->rep->rrsets[msg->rep->rrset_count-1]->entry.data;
1480         /* last 4 bytes are minimum ttl in network format */
1481         if(d->count == 0) return 0;
1482         if(d->rr_len[0] < 2+4) return 0;
1483         minimum = sldns_read_uint32(d->rr_data[0]+(d->rr_len[0]-4));
1484         d->ttl = (time_t)minimum;
1485         d->rr_ttl[0] = (time_t)minimum;
1486         msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[0]);
1487         msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
1488         return 1;
1489 }
1490
1491 /** See if the query goes to empty nonterminal (that has no auth_data,
1492  * but there are nodes underneath.  We already checked that there are
1493  * not NS, or DNAME above, so that we only need to check if some node
1494  * exists below (with nonempty rr list), return true if emptynonterminal */
1495 static int
1496 az_empty_nonterminal(struct auth_zone* z, struct query_info* qinfo,
1497         struct auth_data* node)
1498 {
1499         struct auth_data* next;
1500         if(!node) {
1501                 /* no smaller was found, use first (smallest) node as the
1502                  * next one */
1503                 next = (struct auth_data*)rbtree_first(&z->data);
1504         } else {
1505                 next = (struct auth_data*)rbtree_next(&node->node);
1506         }
1507         while(next && (rbnode_type*)next != RBTREE_NULL && next->rrsets == NULL) {
1508                 /* the next name has empty rrsets, is an empty nonterminal
1509                  * itself, see if there exists something below it */
1510                 next = (struct auth_data*)rbtree_next(&node->node);
1511         }
1512         if((rbnode_type*)next == RBTREE_NULL || !next) {
1513                 /* there is no next node, so something below it cannot
1514                  * exist */
1515                 return 0;
1516         }
1517         /* a next node exists, if there was something below the query,
1518          * this node has to be it.  See if it is below the query name */
1519         if(dname_strict_subdomain_c(next->name, qinfo->qname))
1520                 return 1;
1521         return 0;
1522 }
1523
1524 /** create synth cname target name in buffer, or fail if too long */
1525 static size_t
1526 synth_cname_buf(uint8_t* qname, size_t qname_len, size_t dname_len,
1527         uint8_t* dtarg, size_t dtarglen, uint8_t* buf, size_t buflen)
1528 {
1529         size_t newlen = qname_len + dtarglen - dname_len;
1530         if(newlen > buflen) {
1531                 /* YXDOMAIN error */
1532                 return 0;
1533         }
1534         /* new name is concatenation of qname front (without DNAME owner)
1535          * and DNAME target name */
1536         memcpy(buf, qname, qname_len-dname_len);
1537         memmove(buf+(qname_len-dname_len), dtarg, dtarglen);
1538         return newlen;
1539 }
1540
1541 /** create synthetic CNAME rrset for in a DNAME answer in region,
1542  * false on alloc failure, cname==NULL when name too long. */
1543 static int
1544 create_synth_cname(uint8_t* qname, size_t qname_len, struct regional* region,
1545         struct auth_data* node, struct auth_rrset* dname, uint16_t dclass,
1546         struct ub_packed_rrset_key** cname)
1547 {
1548         uint8_t buf[LDNS_MAX_DOMAINLEN];
1549         uint8_t* dtarg;
1550         size_t dtarglen, newlen;
1551         struct packed_rrset_data* d;
1552
1553         /* get DNAME target name */
1554         if(dname->data->count < 1) return 0;
1555         if(dname->data->rr_len[0] < 3) return 0; /* at least rdatalen +1 */
1556         dtarg = dname->data->rr_data[0]+2;
1557         dtarglen = dname->data->rr_len[0]-2;
1558         if(sldns_read_uint16(dname->data->rr_data[0]) != dtarglen)
1559                 return 0; /* rdatalen in DNAME rdata is malformed */
1560         if(dname_valid(dtarg, dtarglen) != dtarglen)
1561                 return 0; /* DNAME RR has malformed rdata */
1562
1563         /* synthesize a CNAME */
1564         newlen = synth_cname_buf(qname, qname_len, node->namelen,
1565                 dtarg, dtarglen, buf, sizeof(buf));
1566         if(newlen == 0) {
1567                 /* YXDOMAIN error */
1568                 *cname = NULL;
1569                 return 1;
1570         }
1571         *cname = (struct ub_packed_rrset_key*)regional_alloc(region,
1572                 sizeof(struct ub_packed_rrset_key));
1573         if(!*cname)
1574                 return 0; /* out of memory */
1575         memset(&(*cname)->entry, 0, sizeof((*cname)->entry));
1576         (*cname)->entry.key = (*cname);
1577         (*cname)->rk.type = htons(LDNS_RR_TYPE_CNAME);
1578         (*cname)->rk.rrset_class = htons(dclass);
1579         (*cname)->rk.flags = 0;
1580         (*cname)->rk.dname = regional_alloc_init(region, qname, qname_len);
1581         if(!(*cname)->rk.dname)
1582                 return 0; /* out of memory */
1583         (*cname)->rk.dname_len = qname_len;
1584         (*cname)->entry.hash = rrset_key_hash(&(*cname)->rk);
1585         d = (struct packed_rrset_data*)regional_alloc_zero(region,
1586                 sizeof(struct packed_rrset_data) + sizeof(size_t) +
1587                 sizeof(uint8_t*) + sizeof(time_t) + sizeof(uint16_t)
1588                 + newlen);
1589         if(!d)
1590                 return 0; /* out of memory */
1591         (*cname)->entry.data = d;
1592         d->ttl = 0; /* 0 for synthesized CNAME TTL */
1593         d->count = 1;
1594         d->rrsig_count = 0;
1595         d->trust = rrset_trust_ans_noAA;
1596         d->rr_len = (size_t*)((uint8_t*)d +
1597                 sizeof(struct packed_rrset_data));
1598         d->rr_len[0] = newlen + sizeof(uint16_t);
1599         packed_rrset_ptr_fixup(d);
1600         d->rr_ttl[0] = d->ttl;
1601         sldns_write_uint16(d->rr_data[0], newlen);
1602         memmove(d->rr_data[0] + sizeof(uint16_t), buf, newlen);
1603         return 1;
1604 }
1605
1606 /** add a synthesized CNAME to the answer section */
1607 static int
1608 add_synth_cname(struct auth_zone* z, uint8_t* qname, size_t qname_len,
1609         struct regional* region, struct dns_msg* msg, struct auth_data* dname,
1610         struct auth_rrset* rrset)
1611 {
1612         struct ub_packed_rrset_key* cname;
1613         /* synthesize a CNAME */
1614         if(!create_synth_cname(qname, qname_len, region, dname, rrset,
1615                 z->dclass, &cname)) {
1616                 /* out of memory */
1617                 return 0;
1618         }
1619         if(!cname) {
1620                 /* cname cannot be create because of YXDOMAIN */
1621                 msg->rep->flags |= LDNS_RCODE_YXDOMAIN;
1622                 return 1;
1623         }
1624         /* add cname to message */
1625         if(!msg_grow_array(region, msg))
1626                 return 0;
1627         msg->rep->rrsets[msg->rep->rrset_count] = cname;
1628         msg->rep->rrset_count++;
1629         msg->rep->an_numrrsets++;
1630         msg_ttl(msg);
1631         return 1;
1632 }
1633
1634 /** Change a dname to a different one, for wildcard namechange */
1635 static void
1636 az_change_dnames(struct dns_msg* msg, uint8_t* oldname, uint8_t* newname,
1637         size_t newlen, int an_only)
1638 {
1639         size_t i;
1640         size_t start = 0, end = msg->rep->rrset_count;
1641         if(!an_only) start = msg->rep->an_numrrsets;
1642         if(an_only) end = msg->rep->an_numrrsets;
1643         for(i=start; i<end; i++) {
1644                 /* allocated in region so we can change the ptrs */
1645                 if(query_dname_compare(msg->rep->rrsets[i]->rk.dname, oldname)
1646                         == 0) {
1647                         msg->rep->rrsets[i]->rk.dname = newname;
1648                         msg->rep->rrsets[i]->rk.dname_len = newlen;
1649                 }
1650         }
1651 }
1652
1653 /** find NSEC record covering the query */
1654 static struct auth_rrset*
1655 az_find_nsec_cover(struct auth_zone* z, struct auth_data** node)
1656 {
1657         uint8_t* nm = (*node)->name;
1658         size_t nmlen = (*node)->namelen;
1659         struct auth_rrset* rrset;
1660         /* find the NSEC for the smallest-or-equal node */
1661         /* if node == NULL, we did not find a smaller name.  But the zone
1662          * name is the smallest name and should have an NSEC. So there is
1663          * no NSEC to return (for a properly signed zone) */
1664         /* for empty nonterminals, the auth-data node should not exist,
1665          * and thus we don't need to go rbtree_previous here to find
1666          * a domain with an NSEC record */
1667         /* but there could be glue, and if this is node, then it has no NSEC.
1668          * Go up to find nonglue (previous) NSEC-holding nodes */
1669         while((rrset=az_domain_rrset(*node, LDNS_RR_TYPE_NSEC)) == NULL) {
1670                 if(dname_is_root(nm)) return NULL;
1671                 if(nmlen == z->namelen) return NULL;
1672                 dname_remove_label(&nm, &nmlen);
1673                 /* adjust *node for the nsec rrset to find in */
1674                 *node = az_find_name(z, nm, nmlen);
1675         }
1676         return rrset;
1677 }
1678
1679 /** Find NSEC and add for wildcard denial */
1680 static int
1681 az_nsec_wildcard_denial(struct auth_zone* z, struct regional* region,
1682         struct dns_msg* msg, uint8_t* cenm, size_t cenmlen)
1683 {
1684         struct query_info qinfo;
1685         int node_exact;
1686         struct auth_data* node;
1687         struct auth_rrset* nsec;
1688         uint8_t wc[LDNS_MAX_DOMAINLEN];
1689         if(cenmlen+2 > sizeof(wc))
1690                 return 0; /* result would be too long */
1691         wc[0] = 1; /* length of wildcard label */
1692         wc[1] = (uint8_t)'*'; /* wildcard label */
1693         memmove(wc+2, cenm, cenmlen);
1694
1695         /* we have '*.ce' in wc wildcard name buffer */
1696         /* get nsec cover for that */
1697         qinfo.qname = wc;
1698         qinfo.qname_len = cenmlen+2;
1699         qinfo.qtype = 0;
1700         qinfo.qclass = 0;
1701         az_find_domain(z, &qinfo, &node_exact, &node);
1702         if((nsec=az_find_nsec_cover(z, &node)) != NULL) {
1703                 if(!msg_add_rrset_ns(z, region, msg, node, nsec)) return 0;
1704         }
1705         return 1;
1706 }
1707
1708 /** Find the NSEC3PARAM rrset (if any) and if true you have the parameters */
1709 static int
1710 az_nsec3_param(struct auth_zone* z, int* algo, size_t* iter, uint8_t** salt,
1711         size_t* saltlen)
1712 {
1713         struct auth_data* apex;
1714         struct auth_rrset* param;
1715         size_t i;
1716         apex = az_find_name(z, z->name, z->namelen);
1717         if(!apex) return 0;
1718         param = az_domain_rrset(apex, LDNS_RR_TYPE_NSEC3PARAM);
1719         if(!param || param->data->count==0)
1720                 return 0; /* no RRset or no RRs in rrset */
1721         /* find out which NSEC3PARAM RR has supported parameters */
1722         /* skip unknown flags (dynamic signer is recalculating nsec3 chain) */
1723         for(i=0; i<param->data->count; i++) {
1724                 uint8_t* rdata = param->data->rr_data[i]+2;
1725                 size_t rdatalen = param->data->rr_len[i];
1726                 if(rdatalen < 2+5)
1727                         continue; /* too short */
1728                 if(!nsec3_hash_algo_size_supported((int)(rdata[0])))
1729                         continue; /* unsupported algo */
1730                 if(rdatalen < (size_t)(2+5+(size_t)rdata[4]))
1731                         continue; /* salt missing */
1732                 if((rdata[1]&NSEC3_UNKNOWN_FLAGS)!=0)
1733                         continue; /* unknown flags */
1734                 *algo = (int)(rdata[0]);
1735                 *iter = sldns_read_uint16(rdata+2);
1736                 *saltlen = rdata[4];
1737                 if(*saltlen == 0)
1738                         *salt = NULL;
1739                 else    *salt = rdata+5;
1740                 return 1;
1741         }
1742         /* no supported params */
1743         return 0;
1744 }
1745
1746 /** Hash a name with nsec3param into buffer, it has zone name appended.
1747  * return length of hash */
1748 static size_t
1749 az_nsec3_hash(uint8_t* buf, size_t buflen, uint8_t* nm, size_t nmlen,
1750         int algo, size_t iter, uint8_t* salt, size_t saltlen)
1751 {
1752         size_t hlen = nsec3_hash_algo_size_supported(algo);
1753         /* buffer has domain name, nsec3hash, and 256 is for max saltlen
1754          * (salt has 0-255 length) */
1755         unsigned char p[LDNS_MAX_DOMAINLEN+1+N3HASHBUFLEN+256];
1756         size_t i;
1757         if(nmlen+saltlen > sizeof(p) || hlen+saltlen > sizeof(p))
1758                 return 0;
1759         if(hlen > buflen)
1760                 return 0; /* somehow too large for destination buffer */
1761         /* hashfunc(name, salt) */
1762         memmove(p, nm, nmlen);
1763         query_dname_tolower(p);
1764         memmove(p+nmlen, salt, saltlen);
1765         (void)secalgo_nsec3_hash(algo, p, nmlen+saltlen, (unsigned char*)buf);
1766         for(i=0; i<iter; i++) {
1767                 /* hashfunc(hash, salt) */
1768                 memmove(p, buf, hlen);
1769                 memmove(p+hlen, salt, saltlen);
1770                 (void)secalgo_nsec3_hash(algo, p, hlen+saltlen,
1771                         (unsigned char*)buf);
1772         }
1773         return hlen;
1774 }
1775
1776 /** Hash name and return b32encoded hashname for lookup, zone name appended */
1777 static int
1778 az_nsec3_hashname(struct auth_zone* z, uint8_t* hashname, size_t* hashnmlen,
1779         uint8_t* nm, size_t nmlen, int algo, size_t iter, uint8_t* salt,
1780         size_t saltlen)
1781 {
1782         uint8_t hash[N3HASHBUFLEN];
1783         size_t hlen;
1784         int ret;
1785         hlen = az_nsec3_hash(hash, sizeof(hash), nm, nmlen, algo, iter,
1786                 salt, saltlen);
1787         if(!hlen) return 0;
1788         /* b32 encode */
1789         if(*hashnmlen < hlen*2+1+z->namelen) /* approx b32 as hexb16 */
1790                 return 0;
1791         ret = sldns_b32_ntop_extended_hex(hash, hlen, (char*)(hashname+1),
1792                 (*hashnmlen)-1);
1793         if(ret<1)
1794                 return 0;
1795         hashname[0] = (uint8_t)ret;
1796         ret++;
1797         if((*hashnmlen) - ret < z->namelen)
1798                 return 0;
1799         memmove(hashname+ret, z->name, z->namelen);
1800         *hashnmlen = z->namelen+(size_t)ret;
1801         return 1;
1802 }
1803
1804 /** Find the datanode that covers the nsec3hash-name */
1805 static struct auth_data*
1806 az_nsec3_findnode(struct auth_zone* z, uint8_t* hashnm, size_t hashnmlen)
1807 {
1808         struct query_info qinfo;
1809         struct auth_data* node;
1810         int node_exact;
1811         qinfo.qclass = 0;
1812         qinfo.qtype = 0;
1813         qinfo.qname = hashnm;
1814         qinfo.qname_len = hashnmlen;
1815         /* because canonical ordering and b32 nsec3 ordering are the same.
1816          * this is a good lookup to find the nsec3 name. */
1817         az_find_domain(z, &qinfo, &node_exact, &node);
1818         /* but we may have to skip non-nsec3 nodes */
1819         /* this may be a lot, the way to speed that up is to have a
1820          * separate nsec3 tree with nsec3 nodes */
1821         while(node && (rbnode_type*)node != RBTREE_NULL &&
1822                 !az_domain_rrset(node, LDNS_RR_TYPE_NSEC3)) {
1823                 node = (struct auth_data*)rbtree_previous(&node->node);
1824         }
1825         if((rbnode_type*)node == RBTREE_NULL)
1826                 node = NULL;
1827         return node;
1828 }
1829
1830 /** Find cover for hashed(nm, nmlen) (or NULL) */
1831 static struct auth_data*
1832 az_nsec3_find_cover(struct auth_zone* z, uint8_t* nm, size_t nmlen,
1833         int algo, size_t iter, uint8_t* salt, size_t saltlen)
1834 {
1835         struct auth_data* node;
1836         uint8_t hname[LDNS_MAX_DOMAINLEN];
1837         size_t hlen = sizeof(hname);
1838         if(!az_nsec3_hashname(z, hname, &hlen, nm, nmlen, algo, iter,
1839                 salt, saltlen))
1840                 return NULL;
1841         node = az_nsec3_findnode(z, hname, hlen);
1842         if(node)
1843                 return node;
1844         /* we did not find any, perhaps because the NSEC3 hash is before
1845          * the first hash, we have to find the 'last hash' in the zone */
1846         node = (struct auth_data*)rbtree_last(&z->data);
1847         while(node && (rbnode_type*)node != RBTREE_NULL &&
1848                 !az_domain_rrset(node, LDNS_RR_TYPE_NSEC3)) {
1849                 node = (struct auth_data*)rbtree_previous(&node->node);
1850         }
1851         if((rbnode_type*)node == RBTREE_NULL)
1852                 node = NULL;
1853         return node;
1854 }
1855
1856 /** Find exact match for hashed(nm, nmlen) NSEC3 record or NULL */
1857 static struct auth_data*
1858 az_nsec3_find_exact(struct auth_zone* z, uint8_t* nm, size_t nmlen,
1859         int algo, size_t iter, uint8_t* salt, size_t saltlen)
1860 {
1861         struct auth_data* node;
1862         uint8_t hname[LDNS_MAX_DOMAINLEN];
1863         size_t hlen = sizeof(hname);
1864         if(!az_nsec3_hashname(z, hname, &hlen, nm, nmlen, algo, iter,
1865                 salt, saltlen))
1866                 return NULL;
1867         node = az_find_name(z, hname, hlen);
1868         if(az_domain_rrset(node, LDNS_RR_TYPE_NSEC3))
1869                 return node;
1870         return NULL;
1871 }
1872
1873 /** Return nextcloser name (as a ref into the qname).  This is one label
1874  * more than the cenm (cename must be a suffix of qname) */
1875 static void
1876 az_nsec3_get_nextcloser(uint8_t* cenm, uint8_t* qname, size_t qname_len,
1877         uint8_t** nx, size_t* nxlen)
1878 {
1879         int celabs = dname_count_labels(cenm);
1880         int qlabs = dname_count_labels(qname);
1881         int strip = qlabs - celabs -1;
1882         log_assert(dname_strict_subdomain(qname, qlabs, cenm, celabs));
1883         *nx = qname;
1884         *nxlen = qname_len;
1885         if(strip>0)
1886                 dname_remove_labels(nx, nxlen, strip);
1887 }
1888
1889 /** Find the closest encloser that has exact NSEC3.
1890  * updated cenm to the new name. If it went up no-exact-ce is true. */
1891 static struct auth_data*
1892 az_nsec3_find_ce(struct auth_zone* z, uint8_t** cenm, size_t* cenmlen,
1893         int* no_exact_ce, int algo, size_t iter, uint8_t* salt, size_t saltlen)
1894 {
1895         struct auth_data* node;
1896         while((node = az_nsec3_find_exact(z, *cenm, *cenmlen,
1897                 algo, iter, salt, saltlen)) == NULL) {
1898                 if(*cenmlen == z->namelen) {
1899                         /* next step up would take us out of the zone. fail */
1900                         return NULL;
1901                 }
1902                 *no_exact_ce = 1;
1903                 dname_remove_label(cenm, cenmlen);
1904         }
1905         return node;
1906 }
1907
1908 /* Insert NSEC3 record in authority section, if NULL does nothing */
1909 static int
1910 az_nsec3_insert(struct auth_zone* z, struct regional* region,
1911         struct dns_msg* msg, struct auth_data* node)
1912 {
1913         struct auth_rrset* nsec3;
1914         if(!node) return 1; /* no node, skip this */
1915         nsec3 = az_domain_rrset(node, LDNS_RR_TYPE_NSEC3);
1916         if(!nsec3) return 1; /* if no nsec3 RR, skip it */
1917         if(!msg_add_rrset_ns(z, region, msg, node, nsec3)) return 0;
1918         return 1;
1919 }
1920
1921 /** add NSEC3 records to the zone for the nsec3 proof.
1922  * Specify with the flags with parts of the proof are required.
1923  * the ce is the exact matching name (for notype) but also delegation points.
1924  * qname is the one where the nextcloser name can be derived from.
1925  * If NSEC3 is not properly there (in the zone) nothing is added.
1926  * always enabled: include nsec3 proving about the Closest Encloser.
1927  *      that is an exact match that should exist for it.
1928  *      If that does not exist, a higher exact match + nxproof is enabled
1929  *      (for some sort of opt-out empty nonterminal cases).
1930  * nxproof: include denial of the qname.
1931  * wcproof: include denial of wildcard (wildcard.ce).
1932  */
1933 static int
1934 az_add_nsec3_proof(struct auth_zone* z, struct regional* region,
1935         struct dns_msg* msg, uint8_t* cenm, size_t cenmlen, uint8_t* qname,
1936         size_t qname_len, int nxproof, int wcproof)
1937 {
1938         int algo;
1939         size_t iter, saltlen;
1940         uint8_t* salt;
1941         int no_exact_ce = 0;
1942         struct auth_data* node;
1943
1944         /* find parameters of nsec3 proof */
1945         if(!az_nsec3_param(z, &algo, &iter, &salt, &saltlen))
1946                 return 1; /* no nsec3 */
1947         /* find ce that has an NSEC3 */
1948         node = az_nsec3_find_ce(z, &cenm, &cenmlen, &no_exact_ce,
1949                 algo, iter, salt, saltlen);
1950         if(no_exact_ce) nxproof = 1;
1951         if(!az_nsec3_insert(z, region, msg, node))
1952                 return 0;
1953
1954         if(nxproof) {
1955                 uint8_t* nx;
1956                 size_t nxlen;
1957                 /* create nextcloser domain name */
1958                 az_nsec3_get_nextcloser(cenm, qname, qname_len, &nx, &nxlen);
1959                 /* find nsec3 that matches or covers it */
1960                 node = az_nsec3_find_cover(z, nx, nxlen, algo, iter, salt,
1961                         saltlen);
1962                 if(!az_nsec3_insert(z, region, msg, node))
1963                         return 0;
1964         }
1965         if(wcproof) {
1966                 /* create wildcard name *.ce */
1967                 uint8_t wc[LDNS_MAX_DOMAINLEN];
1968                 size_t wclen;
1969                 if(cenmlen+2 > sizeof(wc))
1970                         return 0; /* result would be too long */
1971                 wc[0] = 1; /* length of wildcard label */
1972                 wc[1] = (uint8_t)'*'; /* wildcard label */
1973                 memmove(wc+2, cenm, cenmlen);
1974                 wclen = cenmlen+2;
1975                 /* find nsec3 that matches or covers it */
1976                 node = az_nsec3_find_cover(z, wc, wclen, algo, iter, salt,
1977                         saltlen);
1978                 if(!az_nsec3_insert(z, region, msg, node))
1979                         return 0;
1980         }
1981         return 1;
1982 }
1983
1984 /** generate answer for positive answer */
1985 static int
1986 az_generate_positive_answer(struct auth_zone* z, struct regional* region,
1987         struct dns_msg* msg, struct auth_data* node, struct auth_rrset* rrset)
1988 {
1989         if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
1990         /* see if we want additional rrs */
1991         if(rrset->type == LDNS_RR_TYPE_MX) {
1992                 if(!az_add_additionals_from(z, region, msg, rrset, 2))
1993                         return 0;
1994         } else if(rrset->type == LDNS_RR_TYPE_SRV) {
1995                 if(!az_add_additionals_from(z, region, msg, rrset, 6))
1996                         return 0;
1997         } else if(rrset->type == LDNS_RR_TYPE_NS) {
1998                 if(!az_add_additionals_from(z, region, msg, rrset, 0))
1999                         return 0;
2000         }
2001         return 1;
2002 }
2003
2004 /** generate answer for type ANY answer */
2005 static int
2006 az_generate_any_answer(struct auth_zone* z, struct regional* region,
2007         struct dns_msg* msg, struct auth_data* node)
2008 {
2009         struct auth_rrset* rrset;
2010         int added = 0;
2011         /* add a couple (at least one) RRs */
2012         if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_SOA)) != NULL) {
2013                 if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
2014                 added++;
2015         }
2016         if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_MX)) != NULL) {
2017                 if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
2018                 added++;
2019         }
2020         if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_A)) != NULL) {
2021                 if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
2022                 added++;
2023         }
2024         if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_AAAA)) != NULL) {
2025                 if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
2026                 added++;
2027         }
2028         if(added == 0 && node->rrsets) {
2029                 if(!msg_add_rrset_an(z, region, msg, node,
2030                         node->rrsets)) return 0;
2031         }
2032         return 1;
2033 }
2034
2035 /** follow cname chain and add more data to the answer section */
2036 static int
2037 follow_cname_chain(struct auth_zone* z, uint16_t qtype,
2038         struct regional* region, struct dns_msg* msg,
2039         struct packed_rrset_data* d)
2040 {
2041         int maxchain = 0;
2042         /* see if we can add the target of the CNAME into the answer */
2043         while(maxchain++ < MAX_CNAME_CHAIN) {
2044                 struct auth_data* node;
2045                 struct auth_rrset* rrset;
2046                 size_t clen;
2047                 /* d has cname rdata */
2048                 if(d->count == 0) break; /* no CNAME */
2049                 if(d->rr_len[0] < 2+1) break; /* too small */
2050                 if((clen=dname_valid(d->rr_data[0]+2, d->rr_len[0]-2))==0)
2051                         break; /* malformed */
2052                 if(!dname_subdomain_c(d->rr_data[0]+2, z->name))
2053                         break; /* target out of zone */
2054                 if((node = az_find_name(z, d->rr_data[0]+2, clen))==NULL)
2055                         break; /* no such target name */
2056                 if((rrset=az_domain_rrset(node, qtype))!=NULL) {
2057                         /* done we found the target */
2058                         if(!msg_add_rrset_an(z, region, msg, node, rrset))
2059                                 return 0;
2060                         break;
2061                 }
2062                 if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_CNAME))==NULL)
2063                         break; /* no further CNAME chain, notype */
2064                 if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
2065                 d = rrset->data;
2066         }
2067         return 1;
2068 }
2069
2070 /** generate answer for cname answer */
2071 static int
2072 az_generate_cname_answer(struct auth_zone* z, struct query_info* qinfo,
2073         struct regional* region, struct dns_msg* msg,
2074         struct auth_data* node, struct auth_rrset* rrset)
2075 {
2076         if(!msg_add_rrset_an(z, region, msg, node, rrset)) return 0;
2077         if(!rrset) return 1;
2078         if(!follow_cname_chain(z, qinfo->qtype, region, msg, rrset->data))
2079                 return 0;
2080         return 1;
2081 }
2082
2083 /** generate answer for notype answer */
2084 static int
2085 az_generate_notype_answer(struct auth_zone* z, struct regional* region,
2086         struct dns_msg* msg, struct auth_data* node)
2087 {
2088         struct auth_rrset* rrset;
2089         if(!az_add_negative_soa(z, region, msg)) return 0;
2090         /* DNSSEC denial NSEC */
2091         if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_NSEC))!=NULL) {
2092                 if(!msg_add_rrset_ns(z, region, msg, node, rrset)) return 0;
2093         } else if(node) {
2094                 /* DNSSEC denial NSEC3 */
2095                 if(!az_add_nsec3_proof(z, region, msg, node->name,
2096                         node->namelen, msg->qinfo.qname,
2097                         msg->qinfo.qname_len, 0, 0))
2098                         return 0;
2099         }
2100         return 1;
2101 }
2102
2103 /** generate answer for referral answer */
2104 static int
2105 az_generate_referral_answer(struct auth_zone* z, struct regional* region,
2106         struct dns_msg* msg, struct auth_data* ce, struct auth_rrset* rrset)
2107 {
2108         struct auth_rrset* ds, *nsec;
2109         /* turn off AA flag, referral is nonAA because it leaves the zone */
2110         log_assert(ce);
2111         msg->rep->flags &= ~BIT_AA;
2112         if(!msg_add_rrset_ns(z, region, msg, ce, rrset)) return 0;
2113         /* add DS or deny it */
2114         if((ds=az_domain_rrset(ce, LDNS_RR_TYPE_DS))!=NULL) {
2115                 if(!msg_add_rrset_ns(z, region, msg, ce, ds)) return 0;
2116         } else {
2117                 /* deny the DS */
2118                 if((nsec=az_domain_rrset(ce, LDNS_RR_TYPE_NSEC))!=NULL) {
2119                         if(!msg_add_rrset_ns(z, region, msg, ce, nsec))
2120                                 return 0;
2121                 } else {
2122                         if(!az_add_nsec3_proof(z, region, msg, ce->name,
2123                                 ce->namelen, msg->qinfo.qname,
2124                                 msg->qinfo.qname_len, 0, 0))
2125                                 return 0;
2126                 }
2127         }
2128         /* add additional rrs for type NS */
2129         if(!az_add_additionals_from(z, region, msg, rrset, 0)) return 0;
2130         return 1;
2131 }
2132
2133 /** generate answer for DNAME answer */
2134 static int
2135 az_generate_dname_answer(struct auth_zone* z, struct query_info* qinfo,
2136         struct regional* region, struct dns_msg* msg, struct auth_data* ce,
2137         struct auth_rrset* rrset)
2138 {
2139         log_assert(ce);
2140         /* add the DNAME and then a CNAME */
2141         if(!msg_add_rrset_an(z, region, msg, ce, rrset)) return 0;
2142         if(!add_synth_cname(z, qinfo->qname, qinfo->qname_len, region,
2143                 msg, ce, rrset)) return 0;
2144         if(FLAGS_GET_RCODE(msg->rep->flags) == LDNS_RCODE_YXDOMAIN)
2145                 return 1;
2146         if(msg->rep->rrset_count == 0 ||
2147                 !msg->rep->rrsets[msg->rep->rrset_count-1])
2148                 return 0;
2149         if(!follow_cname_chain(z, qinfo->qtype, region, msg, 
2150                 (struct packed_rrset_data*)msg->rep->rrsets[
2151                 msg->rep->rrset_count-1]->entry.data))
2152                 return 0;
2153         return 1;
2154 }
2155
2156 /** generate answer for wildcard answer */
2157 static int
2158 az_generate_wildcard_answer(struct auth_zone* z, struct query_info* qinfo,
2159         struct regional* region, struct dns_msg* msg, struct auth_data* ce,
2160         struct auth_data* wildcard, struct auth_data* node)
2161 {
2162         struct auth_rrset* rrset, *nsec;
2163         if(verbosity>=VERB_ALGO) {
2164                 char wcname[256];
2165                 sldns_wire2str_dname_buf(wildcard->name, wildcard->namelen,
2166                         wcname, sizeof(wcname));
2167                 log_info("wildcard %s", wcname);
2168         }
2169         if((rrset=az_domain_rrset(wildcard, qinfo->qtype)) != NULL) {
2170                 /* wildcard has type, add it */
2171                 if(!msg_add_rrset_an(z, region, msg, wildcard, rrset))
2172                         return 0;
2173                 az_change_dnames(msg, wildcard->name, msg->qinfo.qname,
2174                         msg->qinfo.qname_len, 1);
2175         } else if((rrset=az_domain_rrset(wildcard, LDNS_RR_TYPE_CNAME))!=NULL) {
2176                 /* wildcard has cname instead, do that */
2177                 if(!msg_add_rrset_an(z, region, msg, wildcard, rrset))
2178                         return 0;
2179                 az_change_dnames(msg, wildcard->name, msg->qinfo.qname,
2180                         msg->qinfo.qname_len, 1);
2181                 if(!follow_cname_chain(z, qinfo->qtype, region, msg,
2182                         rrset->data))
2183                         return 0;
2184         } else if(qinfo->qtype == LDNS_RR_TYPE_ANY && wildcard->rrsets) {
2185                 /* add ANY rrsets from wildcard node */
2186                 if(!az_generate_any_answer(z, region, msg, wildcard))
2187                         return 0;
2188                 az_change_dnames(msg, wildcard->name, msg->qinfo.qname,
2189                         msg->qinfo.qname_len, 1);
2190         } else {
2191                 /* wildcard has nodata, notype answer */
2192                 /* call other notype routine for dnssec notype denials */
2193                 if(!az_generate_notype_answer(z, region, msg, wildcard))
2194                         return 0;
2195         }
2196
2197         /* ce and node for dnssec denial of wildcard original name */
2198         if((nsec=az_find_nsec_cover(z, &node)) != NULL) {
2199                 if(!msg_add_rrset_ns(z, region, msg, node, nsec)) return 0;
2200         } else if(ce) {
2201                 if(!az_add_nsec3_proof(z, region, msg, ce->name,
2202                         ce->namelen, msg->qinfo.qname,
2203                         msg->qinfo.qname_len, 1, 0))
2204                         return 0;
2205         }
2206
2207         /* fixup name of wildcard from *.zone to qname, use already allocated
2208          * pointer to msg qname */
2209         az_change_dnames(msg, wildcard->name, msg->qinfo.qname,
2210                 msg->qinfo.qname_len, 0);
2211         return 1;
2212 }
2213
2214 /** generate answer for nxdomain answer */
2215 static int
2216 az_generate_nxdomain_answer(struct auth_zone* z, struct regional* region,
2217         struct dns_msg* msg, struct auth_data* ce, struct auth_data* node)
2218 {
2219         struct auth_rrset* nsec;
2220         msg->rep->flags |= LDNS_RCODE_NXDOMAIN;
2221         if(!az_add_negative_soa(z, region, msg)) return 0;
2222         if((nsec=az_find_nsec_cover(z, &node)) != NULL) {
2223                 if(!msg_add_rrset_ns(z, region, msg, node, nsec)) return 0;
2224                 if(ce && !az_nsec_wildcard_denial(z, region, msg, ce->name,
2225                         ce->namelen)) return 0;
2226         } else if(ce) {
2227                 if(!az_add_nsec3_proof(z, region, msg, ce->name,
2228                         ce->namelen, msg->qinfo.qname,
2229                         msg->qinfo.qname_len, 1, 1))
2230                         return 0;
2231         }
2232         return 1;
2233 }
2234
2235 /** Create answers when an exact match exists for the domain name */
2236 static int
2237 az_generate_answer_with_node(struct auth_zone* z, struct query_info* qinfo,
2238         struct regional* region, struct dns_msg* msg, struct auth_data* node)
2239 {
2240         struct auth_rrset* rrset;
2241         /* positive answer, rrset we are looking for exists */
2242         if((rrset=az_domain_rrset(node, qinfo->qtype)) != NULL) {
2243                 return az_generate_positive_answer(z, region, msg, node, rrset);
2244         }
2245         /* CNAME? */
2246         if((rrset=az_domain_rrset(node, LDNS_RR_TYPE_CNAME)) != NULL) {
2247                 return az_generate_cname_answer(z, qinfo, region, msg,
2248                         node, rrset);
2249         }
2250         /* type ANY ? */
2251         if(qinfo->qtype == LDNS_RR_TYPE_ANY) {
2252                 return az_generate_any_answer(z, region, msg, node);
2253         }
2254         /* NOERROR/NODATA (no such type at domain name) */
2255         return az_generate_notype_answer(z, region, msg, node);
2256 }
2257
2258 /** Generate answer without an existing-node that we can use.
2259  * So it'll be a referral, DNAME or nxdomain */
2260 static int
2261 az_generate_answer_nonexistnode(struct auth_zone* z, struct query_info* qinfo,
2262         struct regional* region, struct dns_msg* msg, struct auth_data* ce,
2263         struct auth_rrset* rrset, struct auth_data* node)
2264 {
2265         struct auth_data* wildcard;
2266
2267         /* we do not have an exact matching name (that exists) */
2268         /* see if we have a NS or DNAME in the ce */
2269         if(ce && rrset && rrset->type == LDNS_RR_TYPE_NS) {
2270                 return az_generate_referral_answer(z, region, msg, ce, rrset);
2271         }
2272         if(ce && rrset && rrset->type == LDNS_RR_TYPE_DNAME) {
2273                 return az_generate_dname_answer(z, qinfo, region, msg, ce,
2274                         rrset);
2275         }
2276         /* if there is an empty nonterminal, wildcard and nxdomain don't
2277          * happen, it is a notype answer */
2278         if(az_empty_nonterminal(z, qinfo, node)) {
2279                 return az_generate_notype_answer(z, region, msg, node);
2280         }
2281         /* see if we have a wildcard under the ce */
2282         if((wildcard=az_find_wildcard(z, qinfo, ce)) != NULL) {
2283                 return az_generate_wildcard_answer(z, qinfo, region, msg,
2284                         ce, wildcard, node);
2285         }
2286         /* generate nxdomain answer */
2287         return az_generate_nxdomain_answer(z, region, msg, ce, node);
2288 }
2289
2290 /** Lookup answer in a zone. */
2291 static int
2292 auth_zone_generate_answer(struct auth_zone* z, struct query_info* qinfo,
2293         struct regional* region, struct dns_msg** msg, int* fallback)
2294 {
2295         struct auth_data* node, *ce;
2296         struct auth_rrset* rrset;
2297         int node_exact, node_exists;
2298         /* does the zone want fallback in case of failure? */
2299         *fallback = z->fallback_enabled;
2300         if(!(*msg=msg_create(region, qinfo))) return 0;
2301
2302         /* lookup if there is a matching domain name for the query */
2303         az_find_domain(z, qinfo, &node_exact, &node);
2304
2305         /* see if node exists for generating answers from (i.e. not glue and
2306          * obscured by NS or DNAME or NSEC3-only), and also return the
2307          * closest-encloser from that, closest node that should be used
2308          * to generate answers from that is above the query */
2309         node_exists = az_find_ce(z, qinfo, node, node_exact, &ce, &rrset);
2310
2311         if(verbosity >= VERB_ALGO) {
2312                 char zname[256], qname[256], nname[256], cename[256],
2313                         tpstr[32], rrstr[32];
2314                 sldns_wire2str_dname_buf(qinfo->qname, qinfo->qname_len, qname,
2315                         sizeof(qname));
2316                 sldns_wire2str_type_buf(qinfo->qtype, tpstr, sizeof(tpstr));
2317                 sldns_wire2str_dname_buf(z->name, z->namelen, zname,
2318                         sizeof(zname));
2319                 if(node)
2320                         sldns_wire2str_dname_buf(node->name, node->namelen,
2321                                 nname, sizeof(nname));
2322                 else    snprintf(nname, sizeof(nname), "NULL");
2323                 if(ce)
2324                         sldns_wire2str_dname_buf(ce->name, ce->namelen,
2325                                 cename, sizeof(cename));
2326                 else    snprintf(cename, sizeof(cename), "NULL");
2327                 if(rrset) sldns_wire2str_type_buf(rrset->type, rrstr,
2328                         sizeof(rrstr));
2329                 else    snprintf(rrstr, sizeof(rrstr), "NULL");
2330                 log_info("auth_zone %s query %s %s, domain %s %s %s, "
2331                         "ce %s, rrset %s", zname, qname, tpstr, nname,
2332                         (node_exact?"exact":"notexact"),
2333                         (node_exists?"exist":"notexist"), cename, rrstr);
2334         }
2335
2336         if(node_exists) {
2337                 /* the node is fine, generate answer from node */
2338                 return az_generate_answer_with_node(z, qinfo, region, *msg,
2339                         node);
2340         }
2341         return az_generate_answer_nonexistnode(z, qinfo, region, *msg,
2342                 ce, rrset, node);
2343 }
2344
2345 int auth_zones_lookup(struct auth_zones* az, struct query_info* qinfo,
2346         struct regional* region, struct dns_msg** msg, int* fallback,
2347         uint8_t* dp_nm, size_t dp_nmlen)
2348 {
2349         int r;
2350         struct auth_zone* z;
2351
2352         /* find the zone that should contain the answer. */
2353         lock_rw_rdlock(&az->lock);
2354         z = auth_zone_find(az, dp_nm, dp_nmlen, qinfo->qclass);
2355         if(!z) {
2356                 lock_rw_unlock(&az->lock);
2357                 verbose(VERB_ALGO, "no auth zone for query, fallback");
2358                 /* no auth zone, fallback to internet */
2359                 *fallback = 1;
2360                 return 0;
2361         }
2362         lock_rw_rdlock(&z->lock);
2363         lock_rw_unlock(&az->lock);
2364
2365         /* see what answer that zone would generate */
2366         r = auth_zone_generate_answer(z, qinfo, region, msg, fallback);
2367         lock_rw_unlock(&z->lock);
2368         return r;
2369 }