xref: /netbsd-src/external/bsd/nsd/dist/options.c (revision 36f29c42dc045ef9455baf105305a0d7958f2a71)
1 /*
2  * options.c -- options functions.
3  *
4  * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
5  *
6  * See LICENSE for the license.
7  *
8  */
9 #include "config.h"
10 #include <string.h>
11 #include <stdio.h>
12 #include <sys/stat.h>
13 #include <errno.h>
14 #ifdef HAVE_IFADDRS_H
15 #include <ifaddrs.h>
16 #endif
17 #include "options.h"
18 #include "query.h"
19 #include "tsig.h"
20 #include "ixfr.h"
21 #include "difffile.h"
22 #include "rrl.h"
23 #include "bitset.h"
24 
25 #include "configparser.h"
26 config_parser_state_type* cfg_parser = 0;
27 extern FILE* c_in, *c_out;
28 int c_parse(void);
29 int c_lex(void);
30 int c_wrap(void);
31 int c_lex_destroy(void);
32 extern char* c_text;
33 
34 static int
rbtree_strcmp(const void * p1,const void * p2)35 rbtree_strcmp(const void* p1, const void* p2)
36 {
37 	if(p1 == NULL && p2 == NULL) return 0;
38 	if(p1 == NULL) return -1;
39 	if(p2 == NULL) return 1;
40 	return strcmp((const char*)p1, (const char*)p2);
41 }
42 
43 struct nsd_options*
nsd_options_create(region_type * region)44 nsd_options_create(region_type* region)
45 {
46 	struct nsd_options* opt;
47 	opt = (struct nsd_options*)region_alloc(region, sizeof(
48 		struct nsd_options));
49 	opt->region = region;
50 	opt->zone_options = rbtree_create(region,
51 		(int (*)(const void *, const void *)) dname_compare);
52 	opt->configfile = NULL;
53 	opt->zonestatnames = rbtree_create(opt->region, rbtree_strcmp);
54 	opt->patterns = rbtree_create(region, rbtree_strcmp);
55 	opt->keys = rbtree_create(region, rbtree_strcmp);
56 	opt->tls_auths = rbtree_create(region, rbtree_strcmp);
57 	opt->ip_addresses = NULL;
58 	opt->ip_transparent = 0;
59 	opt->ip_freebind = 0;
60 	opt->send_buffer_size = 0;
61 	opt->receive_buffer_size = 0;
62 	opt->debug_mode = 0;
63 	opt->verbosity = 0;
64 	opt->hide_version = 0;
65 	opt->hide_identity = 0;
66 	opt->drop_updates = 0;
67 	opt->do_ip4 = 1;
68 	opt->do_ip6 = 1;
69 	opt->identity = 0;
70 	opt->version = 0;
71 	opt->nsid = 0;
72 	opt->logfile = 0;
73 	opt->log_only_syslog = 0;
74 	opt->log_time_ascii = 1;
75 	opt->round_robin = 0; /* also packet.h::round_robin */
76 	opt->minimal_responses = 0; /* also packet.h::minimal_responses */
77 	opt->confine_to_zone = 0;
78 	opt->refuse_any = 0;
79 	opt->server_count = 1;
80 	opt->cpu_affinity = NULL;
81 	opt->service_cpu_affinity = NULL;
82 	opt->tcp_count = 100;
83 	opt->tcp_reject_overflow = 0;
84 	opt->tcp_query_count = 0;
85 	opt->tcp_timeout = TCP_TIMEOUT;
86 	opt->tcp_mss = 0;
87 	opt->outgoing_tcp_mss = 0;
88 	opt->ipv4_edns_size = EDNS_MAX_MESSAGE_LEN;
89 	opt->ipv6_edns_size = EDNS_MAX_MESSAGE_LEN;
90 	opt->pidfile = PIDFILE;
91 	opt->port = UDP_PORT;
92 /* deprecated?	opt->port = TCP_PORT; */
93 	opt->reuseport = 0;
94 	opt->xfrd_tcp_max = 128;
95 	opt->xfrd_tcp_pipeline = 128;
96 	opt->statistics = 0;
97 	opt->chroot = 0;
98 	opt->username = USER;
99 	opt->zonesdir = ZONESDIR;
100 	opt->xfrdfile = XFRDFILE;
101 	opt->xfrdir = XFRDIR;
102 	opt->zonelistfile = ZONELISTFILE;
103 #ifdef RATELIMIT
104 	opt->rrl_size = RRL_BUCKETS;
105 	opt->rrl_slip = RRL_SLIP;
106 	opt->rrl_ipv4_prefix_length = RRL_IPV4_PREFIX_LENGTH;
107 	opt->rrl_ipv6_prefix_length = RRL_IPV6_PREFIX_LENGTH;
108 #  ifdef RATELIMIT_DEFAULT_OFF
109 	opt->rrl_ratelimit = 0;
110 	opt->rrl_whitelist_ratelimit = 0;
111 #  else
112 	opt->rrl_ratelimit = RRL_LIMIT/2;
113 	opt->rrl_whitelist_ratelimit = RRL_WLIST_LIMIT/2;
114 #  endif
115 #endif
116 #ifdef USE_DNSTAP
117 	opt->dnstap_enable = 0;
118 	opt->dnstap_socket_path = DNSTAP_SOCKET_PATH;
119 	opt->dnstap_ip = "";
120 	opt->dnstap_tls = 1;
121 	opt->dnstap_tls_server_name = NULL;
122 	opt->dnstap_tls_cert_bundle = NULL;
123 	opt->dnstap_tls_client_key_file = NULL;
124 	opt->dnstap_tls_client_cert_file = NULL;
125 	opt->dnstap_send_identity = 0;
126 	opt->dnstap_send_version = 0;
127 	opt->dnstap_identity = NULL;
128 	opt->dnstap_version = NULL;
129 	opt->dnstap_log_auth_query_messages = 0;
130 	opt->dnstap_log_auth_response_messages = 0;
131 #endif
132 	opt->zonefiles_check = 1;
133 	opt->zonefiles_write = ZONEFILES_WRITE_INTERVAL;
134 	opt->xfrd_reload_timeout = 1;
135 	opt->tls_service_key = NULL;
136 	opt->tls_service_ocsp = NULL;
137 	opt->tls_service_pem = NULL;
138 	opt->tls_port = TLS_PORT;
139 	opt->tls_cert_bundle = NULL;
140 	opt->proxy_protocol_port = NULL;
141 	opt->answer_cookie = 0;
142 	opt->cookie_secret = NULL;
143 	opt->cookie_secret_file = CONFIGDIR"/nsd_cookiesecrets.txt";
144 	opt->control_enable = 0;
145 	opt->control_interface = NULL;
146 	opt->control_port = NSD_CONTROL_PORT;
147 	opt->server_key_file = CONFIGDIR"/nsd_server.key";
148 	opt->server_cert_file = CONFIGDIR"/nsd_server.pem";
149 	opt->control_key_file = CONFIGDIR"/nsd_control.key";
150 	opt->control_cert_file = CONFIGDIR"/nsd_control.pem";
151 
152 	opt->verify_enable = 0;
153 	opt->verify_ip_addresses = NULL;
154 	opt->verify_port = VERIFY_PORT;
155 	opt->verify_zones = 1;
156 	opt->verifier = NULL;
157 	opt->verifier_count = 1;
158 	opt->verifier_feed_zone = 1;
159 	opt->verifier_timeout = 0;
160 
161 	return opt;
162 }
163 
164 int
nsd_options_insert_zone(struct nsd_options * opt,struct zone_options * zone)165 nsd_options_insert_zone(struct nsd_options* opt, struct zone_options* zone)
166 {
167 	/* create dname for lookup */
168 	const dname_type* dname = dname_parse(opt->region, zone->name);
169 	if(!dname)
170 		return 0;
171 	zone->node.key = dname;
172 	if(!rbtree_insert(opt->zone_options, (rbnode_type*)zone))
173 		return 0;
174 	return 1;
175 }
176 
177 int
nsd_options_insert_pattern(struct nsd_options * opt,struct pattern_options * pat)178 nsd_options_insert_pattern(struct nsd_options* opt,
179 	struct pattern_options* pat)
180 {
181 	if(!pat->pname)
182 		return 0;
183 	pat->node.key = pat->pname;
184 	if(!rbtree_insert(opt->patterns, (rbnode_type*)pat))
185 		return 0;
186 	return 1;
187 }
188 
189 void
warn_if_directory(const char * filetype,FILE * f,const char * fname)190 warn_if_directory(const char* filetype, FILE* f, const char* fname)
191 {
192 	if(fileno(f) != -1) {
193 		struct stat st;
194 		memset(&st, 0, sizeof(st));
195 		if(fstat(fileno(f), &st) != -1) {
196 			if(S_ISDIR(st.st_mode)) {
197 				log_msg(LOG_WARNING, "trying to read %s but it is a directory: %s", filetype, fname);
198 			}
199 		}
200 	}
201 }
202 
203 int
parse_options_file(struct nsd_options * opt,const char * file,void (* err)(void *,const char *),void * err_arg)204 parse_options_file(struct nsd_options* opt, const char* file,
205 	void (*err)(void*,const char*), void* err_arg)
206 {
207 	FILE *in = 0;
208 	struct pattern_options* pat;
209 	struct acl_options* acl;
210 
211 	if(!cfg_parser) {
212 		cfg_parser = (config_parser_state_type*)region_alloc(
213 			opt->region, sizeof(config_parser_state_type));
214 		cfg_parser->chroot = 0;
215 	}
216 	cfg_parser->err = err;
217 	cfg_parser->err_arg = err_arg;
218 	cfg_parser->filename = (char*)file;
219 	cfg_parser->line = 1;
220 	cfg_parser->errors = 0;
221 	cfg_parser->opt = opt;
222 	cfg_parser->pattern = NULL;
223 	cfg_parser->zone = NULL;
224 	cfg_parser->key = NULL;
225 	cfg_parser->tls_auth = NULL;
226 
227 	in = fopen(cfg_parser->filename, "r");
228 	if(!in) {
229 		if(err) {
230 			char m[MAXSYSLOGMSGLEN];
231 			snprintf(m, sizeof(m), "Could not open %s: %s\n",
232 				file, strerror(errno));
233 			err(err_arg, m);
234 		} else {
235 			fprintf(stderr, "Could not open %s: %s\n",
236 				file, strerror(errno));
237 		}
238 		return 0;
239 	}
240 	warn_if_directory("configfile", in, file);
241 	c_in = in;
242 	c_parse();
243 	fclose(in);
244 
245 	opt->configfile = region_strdup(opt->region, file);
246 
247 	RBTREE_FOR(pat, struct pattern_options*, opt->patterns)
248 	{
249 		/* lookup keys for acls */
250 		for(acl=pat->allow_notify; acl; acl=acl->next)
251 		{
252 			if(acl->nokey || acl->blocked)
253 				continue;
254 			acl->key_options = key_options_find(opt, acl->key_name);
255 			if(!acl->key_options)
256 				c_error("key %s in pattern %s could not be found",
257 					acl->key_name, pat->pname);
258 		}
259 		for(acl=pat->notify; acl; acl=acl->next)
260 		{
261 			if(acl->nokey || acl->blocked)
262 				continue;
263 			acl->key_options = key_options_find(opt, acl->key_name);
264 			if(!acl->key_options)
265 				c_error("key %s in pattern %s could not be found",
266 					acl->key_name, pat->pname);
267 		}
268 		for(acl=pat->request_xfr; acl; acl=acl->next)
269 		{
270 			/* Find tls_auth */
271 			if (!acl->tls_auth_name)
272 				; /* pass */
273 			else if (!(acl->tls_auth_options =
274 			                tls_auth_options_find(opt, acl->tls_auth_name)))
275 				c_error("tls_auth %s in pattern %s could not be found",
276 						acl->tls_auth_name, pat->pname);
277 			/* Find key */
278 			if(acl->nokey || acl->blocked)
279 				continue;
280 			acl->key_options = key_options_find(opt, acl->key_name);
281 			if(!acl->key_options)
282 				c_error("key %s in pattern %s could not be found",
283 					acl->key_name, pat->pname);
284 		}
285 		for(acl=pat->provide_xfr; acl; acl=acl->next)
286 		{
287 			if(acl->nokey || acl->blocked)
288 				continue;
289 			acl->key_options = key_options_find(opt, acl->key_name);
290 			if(!acl->key_options)
291 				c_error("key %s in pattern %s could not be found",
292 					acl->key_name, pat->pname);
293 		}
294 		for(acl=pat->allow_query; acl; acl=acl->next)
295 		{
296 			if(acl->nokey || acl->blocked)
297 				continue;
298 			acl->key_options = key_options_find(opt, acl->key_name);
299 			if(!acl->key_options)
300 				c_error("key %s in pattern %s could not be found",
301 					acl->key_name, pat->pname);
302 		}
303 	}
304 
305 	if(cfg_parser->errors > 0)
306 	{
307 		if(err) {
308 			char m[MAXSYSLOGMSGLEN];
309 			snprintf(m, sizeof(m), "read %s failed: %d errors in "
310 				"configuration file\n", file,
311 				cfg_parser->errors);
312 			err(err_arg, m);
313 		} else {
314 			fprintf(stderr, "read %s failed: %d errors in "
315 				"configuration file\n", file,
316 				cfg_parser->errors);
317 		}
318 		return 0;
319 	}
320 	return 1;
321 }
322 
options_zonestatnames_create(struct nsd_options * opt)323 void options_zonestatnames_create(struct nsd_options* opt)
324 {
325 	struct zone_options* zopt;
326 	/* allocate "" as zonestat 0, for zones without a zonestat */
327 	if(!rbtree_search(opt->zonestatnames, "")) {
328 		struct zonestatname* n;
329 		n = (struct zonestatname*)region_alloc_zero(opt->region,
330 			sizeof(*n));
331 		n->node.key = region_strdup(opt->region, "");
332 		if(!n->node.key) {
333 			log_msg(LOG_ERR, "malloc failed: %s", strerror(errno));
334 			exit(1);
335 		}
336 		n->id = (unsigned)(opt->zonestatnames->count);
337 		rbtree_insert(opt->zonestatnames, (rbnode_type*)n);
338 	}
339 	RBTREE_FOR(zopt, struct zone_options*, opt->zone_options) {
340 		/* insert into tree, so that when read in later id exists */
341 		(void)getzonestatid(opt, zopt);
342 	}
343 }
344 
345 #define ZONELIST_HEADER "# NSD zone list\n# name pattern\n"
346 static int
comp_zonebucket(const void * a,const void * b)347 comp_zonebucket(const void* a, const void* b)
348 {
349 	/* the line size is much smaller than max-int, and positive,
350 	 * so the subtraction works */
351 	return *(const int*)b - *(const int*)a;
352 }
353 
354 /* insert free entry into zonelist free buckets */
355 static void
zone_list_free_insert(struct nsd_options * opt,int linesize,off_t off)356 zone_list_free_insert(struct nsd_options* opt, int linesize, off_t off)
357 {
358 	struct zonelist_free* e;
359 	struct zonelist_bucket* b = (struct zonelist_bucket*)rbtree_search(
360 		opt->zonefree, &linesize);
361 	if(!b) {
362 		b = region_alloc_zero(opt->region, sizeof(*b));
363 		b->linesize = linesize;
364 		b->node = *RBTREE_NULL;
365 		b->node.key = &b->linesize;
366 		rbtree_insert(opt->zonefree, &b->node);
367 	}
368 	e = (struct zonelist_free*)region_alloc_zero(opt->region, sizeof(*e));
369 	e->next = b->list;
370 	b->list = e;
371 	e->off = off;
372 	opt->zonefree_number++;
373 }
374 
375 struct zone_options*
zone_list_zone_insert(struct nsd_options * opt,const char * nm,const char * patnm,int linesize,off_t off)376 zone_list_zone_insert(struct nsd_options* opt, const char* nm,
377 	const char* patnm, int linesize, off_t off)
378 {
379 	struct pattern_options* pat = pattern_options_find(opt, patnm);
380 	struct zone_options* zone;
381 	if(!pat) {
382 		log_msg(LOG_ERR, "pattern does not exist for zone %s "
383 			"pattern %s", nm, patnm);
384 		return NULL;
385 	}
386 	zone = zone_options_create(opt->region);
387 	zone->part_of_config = 0;
388 	zone->name = region_strdup(opt->region, nm);
389 	zone->linesize = linesize;
390 	zone->off = off;
391 	zone->pattern = pat;
392 	if(!nsd_options_insert_zone(opt, zone)) {
393 		log_msg(LOG_ERR, "bad domain name or duplicate zone '%s' "
394 			"pattern %s", nm, patnm);
395 		region_recycle(opt->region, (void*)zone->name, strlen(nm)+1);
396 		region_recycle(opt->region, zone, sizeof(*zone));
397 		return NULL;
398 	}
399 	return zone;
400 }
401 
402 int
parse_zone_list_file(struct nsd_options * opt)403 parse_zone_list_file(struct nsd_options* opt)
404 {
405 	/* zonelist looks like this:
406 	# name pattern
407 	add example.com master
408 	del example.net slave
409 	add foo.bar.nl slave
410 	add rutabaga.uk config
411 	*/
412 	char hdr[64];
413 	char buf[1024];
414 
415 	/* create empty data structures */
416 	opt->zonefree = rbtree_create(opt->region, comp_zonebucket);
417 	opt->zonelist = NULL;
418 	opt->zonefree_number = 0;
419 	opt->zonelist_off = 0;
420 
421 	/* try to open the zonelist file, an empty or nonexist file is OK */
422 	opt->zonelist = fopen(opt->zonelistfile, "r+");
423 	if(!opt->zonelist) {
424 		if(errno == ENOENT)
425 			return 1; /* file does not exist, it is created later */
426 		log_msg(LOG_ERR, "could not open zone list %s: %s", opt->zonelistfile,
427 			strerror(errno));
428 		return 0;
429 	}
430 	/* read header */
431 	hdr[strlen(ZONELIST_HEADER)] = 0;
432 	if(fread(hdr, 1, strlen(ZONELIST_HEADER), opt->zonelist) !=
433 		strlen(ZONELIST_HEADER) || strncmp(hdr, ZONELIST_HEADER,
434 		strlen(ZONELIST_HEADER)) != 0) {
435 		log_msg(LOG_ERR, "zone list %s contains bad header\n", opt->zonelistfile);
436 		fclose(opt->zonelist);
437 		opt->zonelist = NULL;
438 		return 0;
439 	}
440 	buf[sizeof(buf)-1]=0;
441 
442 	/* read entries in file */
443 	while(fgets(buf, sizeof(buf), opt->zonelist)) {
444 		/* skip comments and empty lines */
445 		if(buf[0] == 0 || buf[0] == '\n' || buf[0] == '#')
446 			continue;
447 		if(strncmp(buf, "add ", 4) == 0) {
448 			int linesize = strlen(buf);
449 			/* parse the 'add' line */
450 			/* pick last space on the line, so that the domain
451 			 * name can have a space in it (but not the pattern)*/
452 			char* space = strrchr(buf+4, ' ');
453 			char* nm, *patnm;
454 			if(!space) {
455 				/* parse error */
456 				log_msg(LOG_ERR, "parse error in %s: '%s'",
457 					opt->zonelistfile, buf);
458 				continue;
459 			}
460 			nm = buf+4;
461 			*space = 0;
462 			patnm = space+1;
463 			if(linesize && buf[linesize-1] == '\n')
464 				buf[linesize-1] = 0;
465 
466 			/* store offset and line size for zone entry */
467 			/* and create zone entry in zonetree */
468 			(void)zone_list_zone_insert(opt, nm, patnm, linesize,
469 				ftello(opt->zonelist)-linesize);
470 		} else if(strncmp(buf, "del ", 4) == 0) {
471 			/* store offset and line size for deleted entry */
472 			int linesize = strlen(buf);
473 			zone_list_free_insert(opt, linesize,
474 				ftello(opt->zonelist)-linesize);
475 		} else {
476 			log_msg(LOG_WARNING, "bad data in %s, '%s'", opt->zonelistfile,
477 				buf);
478 		}
479 	}
480 	/* store EOF offset */
481 	opt->zonelist_off = ftello(opt->zonelist);
482 	return 1;
483 }
484 
485 void
zone_options_delete(struct nsd_options * opt,struct zone_options * zone)486 zone_options_delete(struct nsd_options* opt, struct zone_options* zone)
487 {
488 	rbtree_delete(opt->zone_options, zone->node.key);
489 	region_recycle(opt->region, (void*)zone->node.key, dname_total_size(
490 		(dname_type*)zone->node.key));
491 	region_recycle(opt->region, zone, sizeof(*zone));
492 }
493 
494 /* add a new zone to the zonelist */
495 struct zone_options*
zone_list_add(struct nsd_options * opt,const char * zname,const char * pname)496 zone_list_add(struct nsd_options* opt, const char* zname, const char* pname)
497 {
498 	int r;
499 	struct zonelist_free* e;
500 	struct zonelist_bucket* b;
501 	int linesize = 6 + strlen(zname) + strlen(pname);
502 	/* create zone entry */
503 	struct zone_options* zone = zone_list_zone_insert(opt, zname, pname,
504 		linesize, 0);
505 	if(!zone)
506 		return NULL;
507 
508 	/* use free entry or append to file or create new file */
509 	if(!opt->zonelist || opt->zonelist_off == 0) {
510 		/* create new file */
511 		if(opt->zonelist) fclose(opt->zonelist);
512 		opt->zonelist = fopen(opt->zonelistfile, "w+");
513 		if(!opt->zonelist) {
514 			log_msg(LOG_ERR, "could not create zone list %s: %s",
515 				opt->zonelistfile, strerror(errno));
516 			log_msg(LOG_ERR, "zone %s could not be added", zname);
517 			zone_options_delete(opt, zone);
518 			return NULL;
519 		}
520 		r = fprintf(opt->zonelist, ZONELIST_HEADER);
521 		if(r != strlen(ZONELIST_HEADER)) {
522 			if(r == -1)
523 				log_msg(LOG_ERR, "could not write to %s: %s",
524 					opt->zonelistfile, strerror(errno));
525 			else log_msg(LOG_ERR, "partial write to %s: disk full",
526 				opt->zonelistfile);
527 			log_msg(LOG_ERR, "zone %s could not be added", zname);
528 			zone_options_delete(opt, zone);
529 			return NULL;
530 		}
531 		zone->off = ftello(opt->zonelist);
532 		if(zone->off == -1)
533 			log_msg(LOG_ERR, "ftello(%s): %s", opt->zonelistfile, strerror(errno));
534 		r = fprintf(opt->zonelist, "add %s %s\n", zname, pname);
535 		if(r != zone->linesize) {
536 			if(r == -1)
537 				log_msg(LOG_ERR, "could not write to %s: %s",
538 					opt->zonelistfile, strerror(errno));
539 			else log_msg(LOG_ERR, "partial write to %s: disk full",
540 				opt->zonelistfile);
541 			log_msg(LOG_ERR, "zone %s could not be added", zname);
542 			zone_options_delete(opt, zone);
543 			return NULL;
544 		}
545 		opt->zonelist_off = ftello(opt->zonelist);
546 		if(opt->zonelist_off == -1)
547 			log_msg(LOG_ERR, "ftello(%s): %s", opt->zonelistfile, strerror(errno));
548 		if(fflush(opt->zonelist) != 0) {
549 			log_msg(LOG_ERR, "fflush %s: %s", opt->zonelistfile, strerror(errno));
550 		}
551 		return zone;
552 	}
553 	b = (struct zonelist_bucket*)rbtree_search(opt->zonefree,
554 		&zone->linesize);
555 	if(!b || b->list == NULL) {
556 		/* no empty place, append to file */
557 		zone->off = opt->zonelist_off;
558 		if(fseeko(opt->zonelist, zone->off, SEEK_SET) == -1) {
559 			log_msg(LOG_ERR, "fseeko(%s): %s", opt->zonelistfile, strerror(errno));
560 			log_msg(LOG_ERR, "zone %s could not be added", zname);
561 			zone_options_delete(opt, zone);
562 			return NULL;
563 		}
564 		r = fprintf(opt->zonelist, "add %s %s\n", zname, pname);
565 		if(r != zone->linesize) {
566 			if(r == -1)
567 				log_msg(LOG_ERR, "could not write to %s: %s",
568 					opt->zonelistfile, strerror(errno));
569 			else log_msg(LOG_ERR, "partial write to %s: disk full",
570 				opt->zonelistfile);
571 			log_msg(LOG_ERR, "zone %s could not be added", zname);
572 			zone_options_delete(opt, zone);
573 			return NULL;
574 		}
575 		opt->zonelist_off += linesize;
576 		if(fflush(opt->zonelist) != 0) {
577 			log_msg(LOG_ERR, "fflush %s: %s", opt->zonelistfile, strerror(errno));
578 		}
579 		return zone;
580 	}
581 	/* reuse empty spot */
582 	e = b->list;
583 	zone->off = e->off;
584 	if(fseeko(opt->zonelist, zone->off, SEEK_SET) == -1) {
585 		log_msg(LOG_ERR, "fseeko(%s): %s", opt->zonelistfile, strerror(errno));
586 		log_msg(LOG_ERR, "zone %s could not be added", zname);
587 		zone_options_delete(opt, zone);
588 		return NULL;
589 	}
590 	r = fprintf(opt->zonelist, "add %s %s\n", zname, pname);
591 	if(r != zone->linesize) {
592 		if(r == -1)
593 			log_msg(LOG_ERR, "could not write to %s: %s",
594 				opt->zonelistfile, strerror(errno));
595 		else log_msg(LOG_ERR, "partial write to %s: disk full",
596 			opt->zonelistfile);
597 		log_msg(LOG_ERR, "zone %s could not be added", zname);
598 		zone_options_delete(opt, zone);
599 		return NULL;
600 	}
601 	if(fflush(opt->zonelist) != 0) {
602 		log_msg(LOG_ERR, "fflush %s: %s", opt->zonelistfile, strerror(errno));
603 	}
604 
605 	/* snip off and recycle element */
606 	b->list = e->next;
607 	region_recycle(opt->region, e, sizeof(*e));
608 	if(b->list == NULL) {
609 		rbtree_delete(opt->zonefree, &b->linesize);
610 		region_recycle(opt->region, b, sizeof(*b));
611 	}
612 	opt->zonefree_number--;
613 	return zone;
614 }
615 
616 /* remove a zone on the zonelist */
617 void
zone_list_del(struct nsd_options * opt,struct zone_options * zone)618 zone_list_del(struct nsd_options* opt, struct zone_options* zone)
619 {
620 	/* put its space onto the free entry */
621 	if(fseeko(opt->zonelist, zone->off, SEEK_SET) == -1) {
622 		log_msg(LOG_ERR, "fseeko(%s): %s", opt->zonelistfile, strerror(errno));
623 		return;
624 	}
625 	fprintf(opt->zonelist, "del");
626 	zone_list_free_insert(opt, zone->linesize, zone->off);
627 
628 	/* remove zone_options */
629 	zone_options_delete(opt, zone);
630 
631 	/* see if we need to compact: it is going to halve the zonelist */
632 	if(opt->zonefree_number > opt->zone_options->count) {
633 		zone_list_compact(opt);
634 	} else {
635 		if(fflush(opt->zonelist) != 0) {
636 			log_msg(LOG_ERR, "fflush %s: %s", opt->zonelistfile, strerror(errno));
637 		}
638 	}
639 }
640 /* postorder delete of zonelist free space tree */
641 static void
delbucket(region_type * region,struct zonelist_bucket * b)642 delbucket(region_type* region, struct zonelist_bucket* b)
643 {
644 	struct zonelist_free* e, *f;
645 	if(!b || (rbnode_type*)b==RBTREE_NULL)
646 		return;
647 	delbucket(region, (struct zonelist_bucket*)b->node.left);
648 	delbucket(region, (struct zonelist_bucket*)b->node.right);
649 	e = b->list;
650 	while(e) {
651 		f = e->next;
652 		region_recycle(region, e, sizeof(*e));
653 		e = f;
654 	}
655 	region_recycle(region, b, sizeof(*b));
656 }
657 
658 /* compact zonelist file */
659 void
zone_list_compact(struct nsd_options * opt)660 zone_list_compact(struct nsd_options* opt)
661 {
662 	char outname[1024];
663 	FILE* out;
664 	struct zone_options* zone;
665 	off_t off;
666 	int r;
667 	snprintf(outname, sizeof(outname), "%s~", opt->zonelistfile);
668 	/* useful, when : count-of-free > count-of-used */
669 	/* write zonelist to zonelist~ */
670 	out = fopen(outname, "w+");
671 	if(!out) {
672 		log_msg(LOG_ERR, "could not open %s: %s", outname, strerror(errno));
673 		return;
674 	}
675 	r = fprintf(out, ZONELIST_HEADER);
676 	if(r == -1) {
677 		log_msg(LOG_ERR, "write %s failed: %s", outname,
678 			strerror(errno));
679 		fclose(out);
680 		return;
681 	} else if(r != strlen(ZONELIST_HEADER)) {
682 		log_msg(LOG_ERR, "write %s was partial: disk full",
683 			outname);
684 		fclose(out);
685 		return;
686 	}
687 	off = ftello(out);
688 	if(off == -1) {
689 		log_msg(LOG_ERR, "ftello(%s): %s", outname, strerror(errno));
690 		fclose(out);
691 		return;
692 	}
693 	RBTREE_FOR(zone, struct zone_options*, opt->zone_options) {
694 		if(zone->part_of_config)
695 			continue;
696 		r = fprintf(out, "add %s %s\n", zone->name,
697 			zone->pattern->pname);
698 		if(r < 0) {
699 			log_msg(LOG_ERR, "write %s failed: %s", outname,
700 				strerror(errno));
701 			fclose(out);
702 			return;
703 		} else if(r != zone->linesize) {
704 			log_msg(LOG_ERR, "write %s was partial: disk full",
705 				outname);
706 			fclose(out);
707 			return;
708 		}
709 	}
710 	if(fflush(out) != 0) {
711 		log_msg(LOG_ERR, "fflush %s: %s", outname, strerror(errno));
712 	}
713 
714 	/* rename zonelist~ onto zonelist */
715 	if(rename(outname, opt->zonelistfile) == -1) {
716 		log_msg(LOG_ERR, "rename(%s to %s) failed: %s",
717 			outname, opt->zonelistfile, strerror(errno));
718 		fclose(out);
719 		return;
720 	}
721 	fclose(opt->zonelist);
722 	/* set offsets */
723 	RBTREE_FOR(zone, struct zone_options*, opt->zone_options) {
724 		if(zone->part_of_config)
725 			continue;
726 		zone->off = off;
727 		off += zone->linesize;
728 	}
729 	/* empty the free tree */
730 	delbucket(opt->region, (struct zonelist_bucket*)opt->zonefree->root);
731 	opt->zonefree->root = RBTREE_NULL;
732 	opt->zonefree->count = 0;
733 	opt->zonefree_number = 0;
734 	/* finish */
735 	opt->zonelist = out;
736 	opt->zonelist_off = off;
737 }
738 
739 /* close zonelist file */
740 void
zone_list_close(struct nsd_options * opt)741 zone_list_close(struct nsd_options* opt)
742 {
743 	if(opt->zonelist) {
744 		fclose(opt->zonelist);
745 		opt->zonelist = NULL;
746 	}
747 }
748 
749 static void
c_error_va_list_pos(int showpos,const char * fmt,va_list args)750 c_error_va_list_pos(int showpos, const char* fmt, va_list args)
751 {
752 	char* at = NULL;
753 	cfg_parser->errors++;
754 	if(showpos && c_text && c_text[0]!=0) {
755 		at = c_text;
756 	}
757 	if(cfg_parser->err) {
758 		char m[MAXSYSLOGMSGLEN];
759 		snprintf(m, sizeof(m), "%s:%d: ", cfg_parser->filename,
760 			cfg_parser->line);
761 		(*cfg_parser->err)(cfg_parser->err_arg, m);
762 		if(at) {
763 			snprintf(m, sizeof(m), "at '%s': ", at);
764 			(*cfg_parser->err)(cfg_parser->err_arg, m);
765 		}
766 		(*cfg_parser->err)(cfg_parser->err_arg, "error: ");
767 		vsnprintf(m, sizeof(m), fmt, args);
768 		(*cfg_parser->err)(cfg_parser->err_arg, m);
769 		(*cfg_parser->err)(cfg_parser->err_arg, "\n");
770 		return;
771 	}
772         fprintf(stderr, "%s:%d: ", cfg_parser->filename, cfg_parser->line);
773 	if(at) fprintf(stderr, "at '%s': ", at);
774 	fprintf(stderr, "error: ");
775 	vfprintf(stderr, fmt, args);
776 	fprintf(stderr, "\n");
777 }
778 
779 void
c_error(const char * fmt,...)780 c_error(const char *fmt, ...)
781 {
782 	va_list ap;
783 	int showpos = 0;
784 
785 	if (strcmp(fmt, "syntax error") == 0 || strcmp(fmt, "parse error") == 0) {
786 		showpos = 1;
787 	}
788 
789 	va_start(ap, fmt);
790 	c_error_va_list_pos(showpos, fmt, ap);
791 	va_end(ap);
792 }
793 
794 int
c_wrap(void)795 c_wrap(void)
796 {
797 	return 1;
798 }
799 
800 struct zone_options*
zone_options_create(region_type * region)801 zone_options_create(region_type* region)
802 {
803 	struct zone_options* zone;
804 	zone = (struct zone_options*)region_alloc(region, sizeof(
805 		struct zone_options));
806 	zone->node = *RBTREE_NULL;
807 	zone->name = 0;
808 	zone->pattern = 0;
809 	zone->part_of_config = 0;
810 	return zone;
811 }
812 
813 /* true is booleans are the same truth value */
814 #define booleq(x,y) ( ((x) && (y)) || (!(x) && !(y)) )
815 
816 /* true is min_expire_time_expr has either an equal known value
817  * or none of these known values but booleanally equal
818  */
819 #define expire_expr_eq(x,y) (  (  (x) == REFRESHPLUSRETRYPLUS1 \
820                                && (y) == REFRESHPLUSRETRYPLUS1 ) \
821                             || (  (x) != REFRESHPLUSRETRYPLUS1 \
822                                && (y) != REFRESHPLUSRETRYPLUS1 \
823                                && booleq((x), (y))))
824 
825 
826 int
acl_equal(struct acl_options * p,struct acl_options * q)827 acl_equal(struct acl_options* p, struct acl_options* q)
828 {
829 	if(!booleq(p->use_axfr_only, q->use_axfr_only)) return 0;
830 	if(!booleq(p->allow_udp, q->allow_udp)) return 0;
831 	if(strcmp(p->ip_address_spec, q->ip_address_spec)!=0) return 0;
832 	/* the ip6, port, addr, mask, type: are derived from the ip_address_spec */
833 	if(!booleq(p->nokey, q->nokey)) return 0;
834 	if(!booleq(p->blocked, q->blocked)) return 0;
835 	if(p->key_name && q->key_name) {
836 		if(strcmp(p->key_name, q->key_name)!=0) return 0;
837 	} else if(p->key_name && !q->key_name) return 0;
838 	else if(!p->key_name && q->key_name) return 0;
839 	/* key_options is derived from key_name */
840 	if(p->tls_auth_name && q->tls_auth_name) {
841 		if(strcmp(p->tls_auth_name, q->tls_auth_name)!=0) return 0;
842 	} else if(p->tls_auth_name && !q->tls_auth_name) return 0;
843 	else if(!p->tls_auth_name && q->tls_auth_name) return 0;
844 	/* tls_auth_options is derived from tls_auth_name */
845 	return 1;
846 }
847 
848 int
acl_list_equal(struct acl_options * p,struct acl_options * q)849 acl_list_equal(struct acl_options* p, struct acl_options* q)
850 {
851 	/* must be same and in same order */
852 	while(p && q) {
853 		if(!acl_equal(p, q))
854 			return 0;
855 		p = p->next;
856 		q = q->next;
857 	}
858 	if(!p && !q) return 1;
859 	/* different lengths */
860 	return 0;
861 }
862 
863 struct pattern_options*
pattern_options_create(region_type * region)864 pattern_options_create(region_type* region)
865 {
866 	struct pattern_options* p;
867 	p = (struct pattern_options*)region_alloc(region, sizeof(
868 		struct pattern_options));
869 	p->node = *RBTREE_NULL;
870 	p->pname = 0;
871 	p->zonefile = 0;
872 	p->zonestats = 0;
873 	p->allow_notify = 0;
874 	p->request_xfr = 0;
875 	p->size_limit_xfr = 0;
876 	p->notify = 0;
877 	p->provide_xfr = 0;
878 	p->allow_query = 0;
879 	p->outgoing_interface = 0;
880 	p->notify_retry = 5;
881 	p->notify_retry_is_default = 1;
882 	p->allow_axfr_fallback = 1;
883 	p->allow_axfr_fallback_is_default = 1;
884 	p->implicit = 0;
885 	p->xfrd_flags = 0;
886 	p->max_refresh_time = 2419200;	/* 4 weeks */
887 	p->max_refresh_time_is_default = 1;
888 	p->min_refresh_time = 0;
889 	p->min_refresh_time_is_default = 1;
890 	p->max_retry_time = 1209600;	/* 2 weeks */
891 	p->max_retry_time_is_default = 1;
892 	p->min_retry_time = 0;
893 	p->min_retry_time_is_default = 1;
894 	p->min_expire_time = 0;
895 	p->min_expire_time_expr = EXPIRE_TIME_IS_DEFAULT;
896 #ifdef RATELIMIT
897 	p->rrl_whitelist = 0;
898 #endif
899 	p->multi_master_check = 0;
900 	p->store_ixfr = 0;
901 	p->store_ixfr_is_default = 1;
902 	p->ixfr_size = IXFR_SIZE_DEFAULT;
903 	p->ixfr_size_is_default = 1;
904 	p->ixfr_number = IXFR_NUMBER_DEFAULT;
905 	p->ixfr_number_is_default = 1;
906 	p->create_ixfr = 0;
907 	p->create_ixfr_is_default = 1;
908 	p->verify_zone = VERIFY_ZONE_INHERIT;
909 	p->verify_zone_is_default = 1;
910 	p->verifier = NULL;
911 	p->verifier_feed_zone = VERIFIER_FEED_ZONE_INHERIT;
912 	p->verifier_feed_zone_is_default = 1;
913 	p->verifier_timeout = VERIFIER_TIMEOUT_INHERIT;
914 	p->verifier_timeout_is_default = 1;
915 
916 	return p;
917 }
918 
919 static void
acl_delete(region_type * region,struct acl_options * acl)920 acl_delete(region_type* region, struct acl_options* acl)
921 {
922 	if(acl->ip_address_spec)
923 		region_recycle(region, (void*)acl->ip_address_spec,
924 			strlen(acl->ip_address_spec)+1);
925 	if(acl->key_name)
926 		region_recycle(region, (void*)acl->key_name,
927 			strlen(acl->key_name)+1);
928 	if(acl->tls_auth_name)
929 		region_recycle(region, (void*)acl->tls_auth_name,
930 			strlen(acl->tls_auth_name)+1);
931 	/* key_options is a convenience pointer, not owned by the acl */
932 	region_recycle(region, acl, sizeof(*acl));
933 }
934 
935 static void
acl_list_delete(region_type * region,struct acl_options * list)936 acl_list_delete(region_type* region, struct acl_options* list)
937 {
938 	struct acl_options* n;
939 	while(list) {
940 		n = list->next;
941 		acl_delete(region, list);
942 		list = n;
943 	}
944 }
945 
946 static void
verifier_delete(region_type * region,char ** v)947 verifier_delete(region_type* region, char **v)
948 {
949 	if(v != NULL) {
950 		size_t vc = 0;
951 		for(vc = 0; v[vc] != NULL; vc++)
952 			region_recycle(region, v[vc], strlen(v[vc]) + 1);
953 		region_recycle(region, v, (vc + 1) * sizeof(char *));
954 	}
955 }
956 
957 void
pattern_options_remove(struct nsd_options * opt,const char * name)958 pattern_options_remove(struct nsd_options* opt, const char* name)
959 {
960 	struct pattern_options* p = (struct pattern_options*)rbtree_delete(
961 		opt->patterns, name);
962 	/* delete p and its contents */
963 	if (!p)
964 		return;
965 	if(p->pname)
966 		region_recycle(opt->region, (void*)p->pname,
967 			strlen(p->pname)+1);
968 	if(p->zonefile)
969 		region_recycle(opt->region, (void*)p->zonefile,
970 			strlen(p->zonefile)+1);
971 	if(p->zonestats)
972 		region_recycle(opt->region, (void*)p->zonestats,
973 			strlen(p->zonestats)+1);
974 	acl_list_delete(opt->region, p->allow_notify);
975 	acl_list_delete(opt->region, p->request_xfr);
976 	acl_list_delete(opt->region, p->notify);
977 	acl_list_delete(opt->region, p->provide_xfr);
978 	acl_list_delete(opt->region, p->allow_query);
979 	acl_list_delete(opt->region, p->outgoing_interface);
980 	verifier_delete(opt->region, p->verifier);
981 
982 	region_recycle(opt->region, p, sizeof(struct pattern_options));
983 }
984 
985 static struct acl_options*
copy_acl(region_type * region,struct acl_options * a)986 copy_acl(region_type* region, struct acl_options* a)
987 {
988 	struct acl_options* b;
989 	if(!a) return NULL;
990 	b = (struct acl_options*)region_alloc(region, sizeof(*b));
991 	/* copy the whole lot */
992 	*b = *a;
993 	/* fix the pointers */
994 	if(a->ip_address_spec)
995 		b->ip_address_spec = region_strdup(region, a->ip_address_spec);
996 	if(a->key_name)
997 		b->key_name = region_strdup(region, a->key_name);
998 	if(a->tls_auth_name)
999 		b->tls_auth_name = region_strdup(region, a->tls_auth_name);
1000 	b->next = NULL;
1001 	b->key_options = NULL;
1002 	b->tls_auth_options = NULL;
1003 	return b;
1004 }
1005 
1006 static struct acl_options*
copy_acl_list(struct nsd_options * opt,struct acl_options * a)1007 copy_acl_list(struct nsd_options* opt, struct acl_options* a)
1008 {
1009 	struct acl_options* b, *blast = NULL, *blist = NULL;
1010 	while(a) {
1011 		b = copy_acl(opt->region, a);
1012 		/* fixup key_options */
1013 		if(b->key_name)
1014 			b->key_options = key_options_find(opt, b->key_name);
1015 		else	b->key_options = NULL;
1016 		/* fixup tls_auth_options */
1017 		if(b->tls_auth_name)
1018 			b->tls_auth_options = tls_auth_options_find(opt, b->tls_auth_name);
1019 		else	b->tls_auth_options = NULL;
1020 
1021 		/* link as last into list */
1022 		b->next = NULL;
1023 		if(!blist) blist = b;
1024 		else blast->next = b;
1025 		blast = b;
1026 
1027 		a = a->next;
1028 	}
1029 	return blist;
1030 }
1031 
1032 static void
copy_changed_acl(struct nsd_options * opt,struct acl_options ** orig,struct acl_options * anew)1033 copy_changed_acl(struct nsd_options* opt, struct acl_options** orig,
1034 	struct acl_options* anew)
1035 {
1036 	if(!acl_list_equal(*orig, anew)) {
1037 		acl_list_delete(opt->region, *orig);
1038 		*orig = copy_acl_list(opt, anew);
1039 	}
1040 }
1041 
1042 static void
copy_changed_verifier(struct nsd_options * opt,char *** ov,char ** nv)1043 copy_changed_verifier(struct nsd_options* opt, char ***ov, char **nv)
1044 {
1045 	size_t ovc, nvc;
1046 	assert(ov != NULL);
1047 	ovc = nvc = 0;
1048 	if(nv != NULL) {
1049 		for(; nv[nvc] != NULL; nvc++) ;
1050 	} else {
1051 		verifier_delete(opt->region, *ov);
1052 		*ov = NULL;
1053 		return;
1054 	}
1055 	if(*ov != NULL) {
1056 		for(; (*ov)[ovc] != NULL; ovc++) {
1057 			if(ovc < nvc && strcmp((*ov)[ovc], nv[ovc]) != 0)
1058 				break;
1059 		}
1060 		if(ovc == nvc)
1061 			return;
1062 		verifier_delete(opt->region, *ov);
1063 		*ov = NULL;
1064 	}
1065 	*ov = region_alloc(opt->region, (nvc + 1) * sizeof(*nv));
1066 	for(ovc = 0; nv[ovc] != NULL; ovc++) {
1067 		(*ov)[ovc] = region_strdup(opt->region, nv[ovc]);
1068 	}
1069 	(*ov)[ovc] = NULL;
1070 	assert(ovc == nvc);
1071 }
1072 
1073 static void
copy_pat_fixed(region_type * region,struct pattern_options * orig,struct pattern_options * p)1074 copy_pat_fixed(region_type* region, struct pattern_options* orig,
1075 	struct pattern_options* p)
1076 {
1077 	orig->allow_axfr_fallback = p->allow_axfr_fallback;
1078 	orig->allow_axfr_fallback_is_default =
1079 		p->allow_axfr_fallback_is_default;
1080 	orig->notify_retry = p->notify_retry;
1081 	orig->notify_retry_is_default = p->notify_retry_is_default;
1082 	orig->implicit = p->implicit;
1083 	if(p->zonefile)
1084 		orig->zonefile = region_strdup(region, p->zonefile);
1085 	else orig->zonefile = NULL;
1086 	if(p->zonestats)
1087 		orig->zonestats = region_strdup(region, p->zonestats);
1088 	else orig->zonestats = NULL;
1089 	orig->max_refresh_time = p->max_refresh_time;
1090 	orig->max_refresh_time_is_default = p->max_refresh_time_is_default;
1091 	orig->min_refresh_time = p->min_refresh_time;
1092 	orig->min_refresh_time_is_default = p->min_refresh_time_is_default;
1093 	orig->max_retry_time = p->max_retry_time;
1094 	orig->max_retry_time_is_default = p->max_retry_time_is_default;
1095 	orig->min_retry_time = p->min_retry_time;
1096 	orig->min_retry_time_is_default = p->min_retry_time_is_default;
1097 	orig->min_expire_time = p->min_expire_time;
1098 	orig->min_expire_time_expr = p->min_expire_time_expr;
1099 #ifdef RATELIMIT
1100 	orig->rrl_whitelist = p->rrl_whitelist;
1101 #endif
1102 	orig->multi_master_check = p->multi_master_check;
1103 	orig->store_ixfr = p->store_ixfr;
1104 	orig->store_ixfr_is_default = p->store_ixfr_is_default;
1105 	orig->ixfr_size = p->ixfr_size;
1106 	orig->ixfr_size_is_default = p->ixfr_size_is_default;
1107 	orig->ixfr_number = p->ixfr_number;
1108 	orig->ixfr_number_is_default = p->ixfr_number_is_default;
1109 	orig->create_ixfr = p->create_ixfr;
1110 	orig->create_ixfr_is_default = p->create_ixfr_is_default;
1111 	orig->verify_zone = p->verify_zone;
1112 	orig->verify_zone_is_default = p->verify_zone_is_default;
1113 	orig->verifier_timeout = p->verifier_timeout;
1114 	orig->verifier_timeout_is_default = p->verifier_timeout_is_default;
1115 	orig->verifier_feed_zone = p->verifier_feed_zone;
1116 	orig->verifier_feed_zone_is_default = p->verifier_feed_zone_is_default;
1117 }
1118 
1119 void
pattern_options_add_modify(struct nsd_options * opt,struct pattern_options * p)1120 pattern_options_add_modify(struct nsd_options* opt, struct pattern_options* p)
1121 {
1122 	struct pattern_options* orig = pattern_options_find(opt, p->pname);
1123 	if(!orig) {
1124 		/* needs to be copied to opt region */
1125 		orig = pattern_options_create(opt->region);
1126 		orig->pname = region_strdup(opt->region, p->pname);
1127 		copy_pat_fixed(opt->region, orig, p);
1128 		orig->allow_notify = copy_acl_list(opt, p->allow_notify);
1129 		orig->request_xfr = copy_acl_list(opt, p->request_xfr);
1130 		orig->notify = copy_acl_list(opt, p->notify);
1131 		orig->provide_xfr = copy_acl_list(opt, p->provide_xfr);
1132 		orig->allow_query = copy_acl_list(opt, p->allow_query);
1133 		orig->outgoing_interface = copy_acl_list(opt,
1134 			p->outgoing_interface);
1135 		copy_changed_verifier(opt, &orig->verifier, p->verifier);
1136 		nsd_options_insert_pattern(opt, orig);
1137 	} else {
1138 		/* modify in place so pointers stay valid (and copy
1139 		   into region). Do not touch unchanged acls. */
1140 		if(orig->zonefile)
1141 			region_recycle(opt->region, (char*)orig->zonefile,
1142 				strlen(orig->zonefile)+1);
1143 		if(orig->zonestats)
1144 			region_recycle(opt->region, (char*)orig->zonestats,
1145 				strlen(orig->zonestats)+1);
1146 		copy_pat_fixed(opt->region, orig, p);
1147 		copy_changed_acl(opt, &orig->allow_notify, p->allow_notify);
1148 		copy_changed_acl(opt, &orig->request_xfr, p->request_xfr);
1149 		copy_changed_acl(opt, &orig->notify, p->notify);
1150 		copy_changed_acl(opt, &orig->provide_xfr, p->provide_xfr);
1151 		copy_changed_acl(opt, &orig->allow_query, p->allow_query);
1152 		copy_changed_acl(opt, &orig->outgoing_interface,
1153 			p->outgoing_interface);
1154 		copy_changed_verifier(opt, &orig->verifier, p->verifier);
1155 	}
1156 }
1157 
1158 struct pattern_options*
pattern_options_find(struct nsd_options * opt,const char * name)1159 pattern_options_find(struct nsd_options* opt, const char* name)
1160 {
1161 	return (struct pattern_options*)rbtree_search(opt->patterns, name);
1162 }
1163 
1164 static int
pattern_verifiers_equal(const char ** vp,const char ** vq)1165 pattern_verifiers_equal(const char **vp, const char **vq)
1166 {
1167 	size_t vpc, vqc;
1168 	if(vp == NULL)
1169 		return vq == NULL;
1170 	if(vq == NULL)
1171 		return 0;
1172 	for(vpc = 0; vp[vpc] != NULL; vpc++) ;
1173 	for(vqc = 0; vq[vqc] != NULL; vqc++) ;
1174 	if(vpc != vqc)
1175 		return 0;
1176 	for(vpc = 0; vp[vpc] != NULL; vpc++) {
1177 		assert(vq[vpc] != NULL);
1178 		if (strcmp(vp[vpc], vq[vpc]) != 0)
1179 			return 0;
1180 	}
1181 	return 1;
1182 }
1183 
1184 int
pattern_options_equal(struct pattern_options * p,struct pattern_options * q)1185 pattern_options_equal(struct pattern_options* p, struct pattern_options* q)
1186 {
1187 	if(strcmp(p->pname, q->pname) != 0) return 0;
1188 	if(!p->zonefile && q->zonefile) return 0;
1189 	else if(p->zonefile && !q->zonefile) return 0;
1190 	else if(p->zonefile && q->zonefile) {
1191 		if(strcmp(p->zonefile, q->zonefile) != 0) return 0;
1192 	}
1193 	if(!p->zonestats && q->zonestats) return 0;
1194 	else if(p->zonestats && !q->zonestats) return 0;
1195 	else if(p->zonestats && q->zonestats) {
1196 		if(strcmp(p->zonestats, q->zonestats) != 0) return 0;
1197 	}
1198 	if(!booleq(p->allow_axfr_fallback, q->allow_axfr_fallback)) return 0;
1199 	if(!booleq(p->allow_axfr_fallback_is_default,
1200 		q->allow_axfr_fallback_is_default)) return 0;
1201 	if(p->notify_retry != q->notify_retry) return 0;
1202 	if(!booleq(p->notify_retry_is_default,
1203 		q->notify_retry_is_default)) return 0;
1204 	if(!booleq(p->implicit, q->implicit)) return 0;
1205 	if(!acl_list_equal(p->allow_notify, q->allow_notify)) return 0;
1206 	if(!acl_list_equal(p->request_xfr, q->request_xfr)) return 0;
1207 	if(!acl_list_equal(p->notify, q->notify)) return 0;
1208 	if(!acl_list_equal(p->provide_xfr, q->provide_xfr)) return 0;
1209 	if(!acl_list_equal(p->allow_query, q->allow_query)) return 0;
1210 	if(!acl_list_equal(p->outgoing_interface, q->outgoing_interface))
1211 		return 0;
1212 	if(p->max_refresh_time != q->max_refresh_time) return 0;
1213 	if(!booleq(p->max_refresh_time_is_default,
1214 		q->max_refresh_time_is_default)) return 0;
1215 	if(p->min_refresh_time != q->min_refresh_time) return 0;
1216 	if(!booleq(p->min_refresh_time_is_default,
1217 		q->min_refresh_time_is_default)) return 0;
1218 	if(p->max_retry_time != q->max_retry_time) return 0;
1219 	if(!booleq(p->max_retry_time_is_default,
1220 		q->max_retry_time_is_default)) return 0;
1221 	if(p->min_retry_time != q->min_retry_time) return 0;
1222 	if(!booleq(p->min_retry_time_is_default,
1223 		q->min_retry_time_is_default)) return 0;
1224 	if(p->min_expire_time != q->min_expire_time) return 0;
1225 	if(!expire_expr_eq(p->min_expire_time_expr,
1226 		q->min_expire_time_expr)) return 0;
1227 #ifdef RATELIMIT
1228 	if(p->rrl_whitelist != q->rrl_whitelist) return 0;
1229 #endif
1230 	if(!booleq(p->multi_master_check,q->multi_master_check)) return 0;
1231 	if(p->size_limit_xfr != q->size_limit_xfr) return 0;
1232 	if(!booleq(p->store_ixfr,q->store_ixfr)) return 0;
1233 	if(!booleq(p->store_ixfr_is_default,q->store_ixfr_is_default)) return 0;
1234 	if(p->ixfr_size != q->ixfr_size) return 0;
1235 	if(!booleq(p->ixfr_size_is_default,q->ixfr_size_is_default)) return 0;
1236 	if(p->ixfr_number != q->ixfr_number) return 0;
1237 	if(!booleq(p->ixfr_number_is_default,q->ixfr_number_is_default)) return 0;
1238 	if(!booleq(p->create_ixfr,q->create_ixfr)) return 0;
1239 	if(!booleq(p->create_ixfr_is_default,q->create_ixfr_is_default)) return 0;
1240 	if(p->verify_zone != q->verify_zone) return 0;
1241 	if(!booleq(p->verify_zone_is_default,
1242 		q->verify_zone_is_default)) return 0;
1243 	if(!pattern_verifiers_equal((const char **)p->verifier,
1244 		(const char **)q->verifier)) return 0;
1245 	if(p->verifier_feed_zone != q->verifier_feed_zone) return 0;
1246 	if(!booleq(p->verifier_feed_zone_is_default,
1247 		q->verifier_feed_zone_is_default)) return 0;
1248 	if(p->verifier_timeout != q->verifier_timeout) return 0;
1249 	if(!booleq(p->verifier_timeout_is_default,
1250 		q->verifier_timeout_is_default)) return 0;
1251 	return 1;
1252 }
1253 
1254 static void
marshal_u8(struct buffer * b,uint8_t v)1255 marshal_u8(struct buffer* b, uint8_t v)
1256 {
1257 	buffer_reserve(b, 1);
1258 	buffer_write_u8(b, v);
1259 }
1260 
1261 static uint8_t
unmarshal_u8(struct buffer * b)1262 unmarshal_u8(struct buffer* b)
1263 {
1264 	return buffer_read_u8(b);
1265 }
1266 
1267 static void
marshal_u64(struct buffer * b,uint64_t v)1268 marshal_u64(struct buffer* b, uint64_t v)
1269 {
1270 	buffer_reserve(b, 8);
1271 	buffer_write_u64(b, v);
1272 }
1273 
1274 static uint64_t
unmarshal_u64(struct buffer * b)1275 unmarshal_u64(struct buffer* b)
1276 {
1277 	return buffer_read_u64(b);
1278 }
1279 
1280 #ifdef RATELIMIT
1281 static void
marshal_u16(struct buffer * b,uint16_t v)1282 marshal_u16(struct buffer* b, uint16_t v)
1283 {
1284 	buffer_reserve(b, 2);
1285 	buffer_write_u16(b, v);
1286 }
1287 #endif
1288 
1289 #ifdef RATELIMIT
1290 static uint16_t
unmarshal_u16(struct buffer * b)1291 unmarshal_u16(struct buffer* b)
1292 {
1293 	return buffer_read_u16(b);
1294 }
1295 #endif
1296 
1297 static void
marshal_u32(struct buffer * b,uint32_t v)1298 marshal_u32(struct buffer* b, uint32_t v)
1299 {
1300 	buffer_reserve(b, 4);
1301 	buffer_write_u32(b, v);
1302 }
1303 
1304 static uint32_t
unmarshal_u32(struct buffer * b)1305 unmarshal_u32(struct buffer* b)
1306 {
1307 	return buffer_read_u32(b);
1308 }
1309 
1310 static void
marshal_str(struct buffer * b,const char * s)1311 marshal_str(struct buffer* b, const char* s)
1312 {
1313 	if(!s) marshal_u8(b, 0);
1314 	else {
1315 		size_t len = strlen(s);
1316 		marshal_u8(b, 1);
1317 		buffer_reserve(b, len+1);
1318 		buffer_write(b, s, len+1);
1319 	}
1320 }
1321 
1322 static char*
unmarshal_str(region_type * r,struct buffer * b)1323 unmarshal_str(region_type* r, struct buffer* b)
1324 {
1325 	uint8_t nonnull = unmarshal_u8(b);
1326 	if(nonnull) {
1327 		char* result = region_strdup(r, (char*)buffer_current(b));
1328 		size_t len = strlen((char*)buffer_current(b));
1329 		buffer_skip(b, len+1);
1330 		return result;
1331 	} else return NULL;
1332 }
1333 
1334 static void
marshal_acl(struct buffer * b,struct acl_options * acl)1335 marshal_acl(struct buffer* b, struct acl_options* acl)
1336 {
1337 	buffer_reserve(b, sizeof(*acl));
1338 	buffer_write(b, acl, sizeof(*acl));
1339 	marshal_str(b, acl->ip_address_spec);
1340 	marshal_str(b, acl->key_name);
1341 	marshal_str(b, acl->tls_auth_name);
1342 }
1343 
1344 static struct acl_options*
unmarshal_acl(region_type * r,struct buffer * b)1345 unmarshal_acl(region_type* r, struct buffer* b)
1346 {
1347 	struct acl_options* acl = (struct acl_options*)region_alloc(r,
1348 		sizeof(*acl));
1349 	buffer_read(b, acl, sizeof(*acl));
1350 	acl->next = NULL;
1351 	acl->key_options = NULL;
1352 	acl->tls_auth_options = NULL;
1353 	acl->ip_address_spec = unmarshal_str(r, b);
1354 	acl->key_name = unmarshal_str(r, b);
1355 	acl->tls_auth_name = unmarshal_str(r, b);
1356 	return acl;
1357 }
1358 
1359 static void
marshal_acl_list(struct buffer * b,struct acl_options * list)1360 marshal_acl_list(struct buffer* b, struct acl_options* list)
1361 {
1362 	while(list) {
1363 		marshal_u8(b, 1); /* is there a next one marker */
1364 		marshal_acl(b, list);
1365 		list = list->next;
1366 	}
1367 	marshal_u8(b, 0); /* end of list marker */
1368 }
1369 
1370 static struct acl_options*
unmarshal_acl_list(region_type * r,struct buffer * b)1371 unmarshal_acl_list(region_type* r, struct buffer* b)
1372 {
1373 	struct acl_options* a, *last=NULL, *list=NULL;
1374 	while(unmarshal_u8(b)) {
1375 		a = unmarshal_acl(r, b);
1376 		/* link in */
1377 		a->next = NULL;
1378 		if(!list) list = a;
1379 		else last->next = a;
1380 		last = a;
1381 	}
1382 	return list;
1383 }
1384 
1385 static void
marshal_strv(struct buffer * b,char ** strv)1386 marshal_strv(struct buffer* b, char **strv)
1387 {
1388 	uint32_t i, n;
1389 
1390 	assert(b != NULL);
1391 
1392 	if (strv == NULL) {
1393 		marshal_u32(b, 0);
1394 		return;
1395 	}
1396 	for(n = 0; strv[n]; n++) {
1397 		/* do nothing */
1398 	}
1399 	marshal_u32(b, n);
1400 	for(i = 0; strv[i] != NULL; i++) {
1401 		marshal_str(b, strv[i]);
1402 	}
1403 	marshal_u8(b, 0);
1404 }
1405 
1406 static char **
unmarshal_strv(region_type * r,struct buffer * b)1407 unmarshal_strv(region_type* r, struct buffer* b)
1408 {
1409 	uint32_t i, n;
1410 	char **strv;
1411 
1412 	assert(r != NULL);
1413 	assert(b != NULL);
1414 
1415 	if ((n = unmarshal_u32(b)) == 0) {
1416 		return NULL;
1417 	}
1418 	strv = region_alloc_zero(r, (n + 1) * sizeof(char *));
1419 	for(i = 0; i <= n; i++) {
1420 		strv[i] = unmarshal_str(r, b);
1421 	}
1422 	assert(i == (n + 1));
1423 	assert(strv[i - 1] == NULL);
1424 
1425 	return strv;
1426 }
1427 
1428 void
pattern_options_marshal(struct buffer * b,struct pattern_options * p)1429 pattern_options_marshal(struct buffer* b, struct pattern_options* p)
1430 {
1431 	marshal_str(b, p->pname);
1432 	marshal_str(b, p->zonefile);
1433 	marshal_str(b, p->zonestats);
1434 #ifdef RATELIMIT
1435 	marshal_u16(b, p->rrl_whitelist);
1436 #endif
1437 	marshal_u8(b, p->allow_axfr_fallback);
1438 	marshal_u8(b, p->allow_axfr_fallback_is_default);
1439 	marshal_u8(b, p->notify_retry);
1440 	marshal_u8(b, p->notify_retry_is_default);
1441 	marshal_u8(b, p->implicit);
1442 	marshal_u64(b, p->size_limit_xfr);
1443 	marshal_acl_list(b, p->allow_notify);
1444 	marshal_acl_list(b, p->request_xfr);
1445 	marshal_acl_list(b, p->notify);
1446 	marshal_acl_list(b, p->provide_xfr);
1447 	marshal_acl_list(b, p->allow_query);
1448 	marshal_acl_list(b, p->outgoing_interface);
1449 	marshal_u32(b, p->max_refresh_time);
1450 	marshal_u8(b, p->max_refresh_time_is_default);
1451 	marshal_u32(b, p->min_refresh_time);
1452 	marshal_u8(b, p->min_refresh_time_is_default);
1453 	marshal_u32(b, p->max_retry_time);
1454 	marshal_u8(b, p->max_retry_time_is_default);
1455 	marshal_u32(b, p->min_retry_time);
1456 	marshal_u8(b, p->min_retry_time_is_default);
1457 	marshal_u32(b, p->min_expire_time);
1458 	marshal_u8(b, p->min_expire_time_expr);
1459 	marshal_u8(b, p->multi_master_check);
1460 	marshal_u8(b, p->store_ixfr);
1461 	marshal_u8(b, p->store_ixfr_is_default);
1462 	marshal_u64(b, p->ixfr_size);
1463 	marshal_u8(b, p->ixfr_size_is_default);
1464 	marshal_u32(b, p->ixfr_number);
1465 	marshal_u8(b, p->ixfr_number_is_default);
1466 	marshal_u8(b, p->create_ixfr);
1467 	marshal_u8(b, p->create_ixfr_is_default);
1468 	marshal_u8(b, p->verify_zone);
1469 	marshal_u8(b, p->verify_zone_is_default);
1470 	marshal_strv(b, p->verifier);
1471 	marshal_u8(b, p->verifier_feed_zone);
1472 	marshal_u8(b, p->verifier_feed_zone_is_default);
1473 	marshal_u32(b, p->verifier_timeout);
1474 	marshal_u8(b, p->verifier_timeout_is_default);
1475 }
1476 
1477 struct pattern_options*
pattern_options_unmarshal(region_type * r,struct buffer * b)1478 pattern_options_unmarshal(region_type* r, struct buffer* b)
1479 {
1480 	struct pattern_options* p = pattern_options_create(r);
1481 	p->pname = unmarshal_str(r, b);
1482 	p->zonefile = unmarshal_str(r, b);
1483 	p->zonestats = unmarshal_str(r, b);
1484 #ifdef RATELIMIT
1485 	p->rrl_whitelist = unmarshal_u16(b);
1486 #endif
1487 	p->allow_axfr_fallback = unmarshal_u8(b);
1488 	p->allow_axfr_fallback_is_default = unmarshal_u8(b);
1489 	p->notify_retry = unmarshal_u8(b);
1490 	p->notify_retry_is_default = unmarshal_u8(b);
1491 	p->implicit = unmarshal_u8(b);
1492 	p->size_limit_xfr = unmarshal_u64(b);
1493 	p->allow_notify = unmarshal_acl_list(r, b);
1494 	p->request_xfr = unmarshal_acl_list(r, b);
1495 	p->notify = unmarshal_acl_list(r, b);
1496 	p->provide_xfr = unmarshal_acl_list(r, b);
1497 	p->allow_query = unmarshal_acl_list(r, b);
1498 	p->outgoing_interface = unmarshal_acl_list(r, b);
1499 	p->max_refresh_time = unmarshal_u32(b);
1500 	p->max_refresh_time_is_default = unmarshal_u8(b);
1501 	p->min_refresh_time = unmarshal_u32(b);
1502 	p->min_refresh_time_is_default = unmarshal_u8(b);
1503 	p->max_retry_time = unmarshal_u32(b);
1504 	p->max_retry_time_is_default = unmarshal_u8(b);
1505 	p->min_retry_time = unmarshal_u32(b);
1506 	p->min_retry_time_is_default = unmarshal_u8(b);
1507 	p->min_expire_time = unmarshal_u32(b);
1508 	p->min_expire_time_expr = unmarshal_u8(b);
1509 	p->multi_master_check = unmarshal_u8(b);
1510 	p->store_ixfr = unmarshal_u8(b);
1511 	p->store_ixfr_is_default = unmarshal_u8(b);
1512 	p->ixfr_size = unmarshal_u64(b);
1513 	p->ixfr_size_is_default = unmarshal_u8(b);
1514 	p->ixfr_number = unmarshal_u32(b);
1515 	p->ixfr_number_is_default = unmarshal_u8(b);
1516 	p->create_ixfr = unmarshal_u8(b);
1517 	p->create_ixfr_is_default = unmarshal_u8(b);
1518 	p->verify_zone = unmarshal_u8(b);
1519 	p->verify_zone_is_default = unmarshal_u8(b);
1520 	p->verifier = unmarshal_strv(r, b);
1521 	p->verifier_feed_zone = unmarshal_u8(b);
1522 	p->verifier_feed_zone_is_default = unmarshal_u8(b);
1523 	p->verifier_timeout = unmarshal_u32(b);
1524 	p->verifier_timeout_is_default = unmarshal_u8(b);
1525 	return p;
1526 }
1527 
1528 struct key_options*
key_options_create(region_type * region)1529 key_options_create(region_type* region)
1530 {
1531 	struct key_options* key;
1532 	key = (struct key_options*)region_alloc_zero(region,
1533 		sizeof(struct key_options));
1534 	return key;
1535 }
1536 
1537 struct tls_auth_options*
tls_auth_options_create(region_type * region)1538 tls_auth_options_create(region_type* region)
1539 {
1540 	struct tls_auth_options* tls_auth_options;
1541 	tls_auth_options = (struct tls_auth_options*)region_alloc_zero(region, sizeof(struct tls_auth_options));
1542 	return tls_auth_options;
1543 }
1544 
1545 void
key_options_insert(struct nsd_options * opt,struct key_options * key)1546 key_options_insert(struct nsd_options* opt, struct key_options* key)
1547 {
1548 	if(!key->name) return;
1549 	key->node.key = key->name;
1550 	(void)rbtree_insert(opt->keys, &key->node);
1551 }
1552 
1553 struct key_options*
key_options_find(struct nsd_options * opt,const char * name)1554 key_options_find(struct nsd_options* opt, const char* name)
1555 {
1556 	return (struct key_options*)rbtree_search(opt->keys, name);
1557 }
1558 
1559 void
tls_auth_options_insert(struct nsd_options * opt,struct tls_auth_options * auth)1560 tls_auth_options_insert(struct nsd_options* opt, struct tls_auth_options* auth)
1561 {
1562 	if(!auth->name) return;
1563 	auth->node.key = auth->name;
1564 	(void)rbtree_insert(opt->tls_auths, &auth->node);
1565 }
1566 
1567 struct tls_auth_options*
tls_auth_options_find(struct nsd_options * opt,const char * name)1568 tls_auth_options_find(struct nsd_options* opt, const char* name)
1569 {
1570 	return (struct tls_auth_options*)rbtree_search(opt->tls_auths, name);
1571 }
1572 
1573 /** remove tsig_key contents */
1574 void
key_options_desetup(region_type * region,struct key_options * key)1575 key_options_desetup(region_type* region, struct key_options* key)
1576 {
1577 	/* keep tsig_key pointer so that existing references keep valid */
1578 	if(!key->tsig_key)
1579 		return;
1580 	/* name stays the same */
1581 	if(key->tsig_key->data) {
1582 		/* wipe secret! */
1583 		memset(key->tsig_key->data, 0xdd, key->tsig_key->size);
1584 		region_recycle(region, key->tsig_key->data,
1585 			key->tsig_key->size);
1586 		key->tsig_key->data = NULL;
1587 		key->tsig_key->size = 0;
1588 	}
1589 }
1590 
1591 /** add tsig_key contents */
1592 void
key_options_setup(region_type * region,struct key_options * key)1593 key_options_setup(region_type* region, struct key_options* key)
1594 {
1595 	uint8_t data[16384]; /* 16KB */
1596 	int size;
1597 	if(!key->tsig_key) {
1598 		/* create it */
1599 		key->tsig_key = (tsig_key_type *) region_alloc(region,
1600 			sizeof(tsig_key_type));
1601 		/* create name */
1602 		key->tsig_key->name = dname_parse(region, key->name);
1603 		if(!key->tsig_key->name) {
1604 			log_msg(LOG_ERR, "Failed to parse tsig key name %s",
1605 				key->name);
1606 			/* key and base64 were checked during syntax parse */
1607 			exit(1);
1608 		}
1609 		key->tsig_key->size = 0;
1610 		key->tsig_key->data = NULL;
1611 	}
1612 	size = b64_pton(key->secret, data, sizeof(data));
1613 	if(size == -1) {
1614 		log_msg(LOG_ERR, "Failed to parse tsig key data %s",
1615 			key->name);
1616 		/* key and base64 were checked during syntax parse */
1617 		exit(1);
1618 	}
1619 	key->tsig_key->size = size;
1620 	key->tsig_key->data = (uint8_t *)region_alloc_init(region, data, size);
1621 }
1622 
1623 void
key_options_remove(struct nsd_options * opt,const char * name)1624 key_options_remove(struct nsd_options* opt, const char* name)
1625 {
1626 	struct key_options* k = key_options_find(opt, name);
1627 	if(!k) return;
1628 	(void)rbtree_delete(opt->keys, name);
1629 	if(k->name)
1630 		region_recycle(opt->region, k->name, strlen(k->name)+1);
1631 	if(k->algorithm)
1632 		region_recycle(opt->region, k->algorithm, strlen(k->algorithm)+1);
1633 	if(k->secret) {
1634 		memset(k->secret, 0xdd, strlen(k->secret)); /* wipe secret! */
1635 		region_recycle(opt->region, k->secret, strlen(k->secret)+1);
1636 	}
1637 	if(k->tsig_key) {
1638 		tsig_del_key(k->tsig_key);
1639 		if(k->tsig_key->name)
1640 			region_recycle(opt->region, (void*)k->tsig_key->name,
1641 				dname_total_size(k->tsig_key->name));
1642 		key_options_desetup(opt->region, k);
1643 		region_recycle(opt->region, k->tsig_key, sizeof(tsig_key_type));
1644 	}
1645 	region_recycle(opt->region, k, sizeof(struct key_options));
1646 }
1647 
1648 int
key_options_equal(struct key_options * p,struct key_options * q)1649 key_options_equal(struct key_options* p, struct key_options* q)
1650 {
1651 	return strcmp(p->name, q->name)==0 && strcmp(p->algorithm,
1652 		q->algorithm)==0 && strcmp(p->secret, q->secret)==0;
1653 }
1654 
1655 void
key_options_add_modify(struct nsd_options * opt,struct key_options * key)1656 key_options_add_modify(struct nsd_options* opt, struct key_options* key)
1657 {
1658 	struct key_options* orig = key_options_find(opt, key->name);
1659 	if(!orig) {
1660 		/* needs to be copied to opt region */
1661 		orig = key_options_create(opt->region);
1662 		orig->name = region_strdup(opt->region, key->name);
1663 		orig->algorithm = region_strdup(opt->region, key->algorithm);
1664 		orig->secret = region_strdup(opt->region, key->secret);
1665 		key_options_setup(opt->region, orig);
1666 		tsig_add_key(orig->tsig_key);
1667 		key_options_insert(opt, orig);
1668 	} else {
1669 		/* modify entries in existing key, and copy to opt region */
1670 		key_options_desetup(opt->region, orig);
1671 		region_recycle(opt->region, orig->algorithm,
1672 			strlen(orig->algorithm)+1);
1673 		orig->algorithm = region_strdup(opt->region, key->algorithm);
1674 		region_recycle(opt->region, orig->secret,
1675 			strlen(orig->secret)+1);
1676 		orig->secret = region_strdup(opt->region, key->secret);
1677 		key_options_setup(opt->region, orig);
1678 	}
1679 }
1680 
1681 int
acl_check_incoming_block_proxy(struct acl_options * acl,struct query * q,struct acl_options ** reason)1682 acl_check_incoming_block_proxy(struct acl_options* acl, struct query* q,
1683 	struct acl_options** reason)
1684 {
1685 	/* check each acl element.
1686 	 * if it is blocked, return -1.
1687 	 * return false if no matches for blocked elements. */
1688 	if(reason)
1689 		*reason = NULL;
1690 
1691 	while(acl)
1692 	{
1693 		DEBUG(DEBUG_XFRD,2, (LOG_INFO, "proxy testing acl %s %s",
1694 			acl->ip_address_spec, acl->nokey?"NOKEY":
1695 			(acl->blocked?"BLOCKED":acl->key_name)));
1696 		if(acl_addr_matches_proxy(acl, q) && acl->blocked) {
1697 			if(reason)
1698 				*reason = acl;
1699 			return -1;
1700 		}
1701 		acl = acl->next;
1702 	}
1703 
1704 	return 0;
1705 }
1706 
1707 int
acl_check_incoming(struct acl_options * acl,struct query * q,struct acl_options ** reason)1708 acl_check_incoming(struct acl_options* acl, struct query* q,
1709 	struct acl_options** reason)
1710 {
1711 	/* check each acl element.
1712 	   if 1 blocked element matches - return -1.
1713 	   if any element matches - return number.
1714 	   else return -1. */
1715 	int found_match = -1;
1716 	int number = 0;
1717 	struct acl_options* match = 0;
1718 
1719 	if(reason)
1720 		*reason = NULL;
1721 
1722 	while(acl)
1723 	{
1724 		DEBUG(DEBUG_XFRD,2, (LOG_INFO, "testing acl %s %s",
1725 			acl->ip_address_spec, acl->nokey?"NOKEY":
1726 			(acl->blocked?"BLOCKED":acl->key_name)));
1727 		if(acl_addr_matches(acl, q) && acl_key_matches(acl, q)) {
1728 			if(!match)
1729 			{
1730 				match = acl; /* remember first match */
1731 				found_match=number;
1732 			}
1733 			if(acl->blocked) {
1734 				if(reason)
1735 					*reason = acl;
1736 				return -1;
1737 			}
1738 		}
1739 		number++;
1740 		acl = acl->next;
1741 	}
1742 
1743 	if(reason)
1744 		*reason = match;
1745 	return found_match;
1746 }
1747 
1748 #ifdef INET6
1749 int
acl_addr_matches_ipv6host(struct acl_options * acl,struct sockaddr_storage * addr_storage,unsigned int port)1750 acl_addr_matches_ipv6host(struct acl_options* acl, struct sockaddr_storage* addr_storage, unsigned int port)
1751 {
1752 	struct sockaddr_in6* addr = (struct sockaddr_in6*)addr_storage;
1753 	if(acl->port != 0 && acl->port != port)
1754 		return 0;
1755 	switch(acl->rangetype) {
1756 	case acl_range_mask:
1757 	case acl_range_subnet:
1758 		if(!acl_addr_match_mask((uint32_t*)&acl->addr.addr6, (uint32_t*)&addr->sin6_addr,
1759 			(uint32_t*)&acl->range_mask.addr6, sizeof(struct in6_addr)))
1760 			return 0;
1761 		break;
1762 	case acl_range_minmax:
1763 		if(!acl_addr_match_range_v6((uint32_t*)&acl->addr.addr6, (uint32_t*)&addr->sin6_addr,
1764 			(uint32_t*)&acl->range_mask.addr6, sizeof(struct in6_addr)))
1765 			return 0;
1766 		break;
1767 	case acl_range_single:
1768 	default:
1769 		if(memcmp(&addr->sin6_addr, &acl->addr.addr6,
1770 			sizeof(struct in6_addr)) != 0)
1771 			return 0;
1772 		break;
1773 	}
1774 	return 1;
1775 }
1776 #endif
1777 
1778 int
acl_addr_matches_ipv4host(struct acl_options * acl,struct sockaddr_in * addr,unsigned int port)1779 acl_addr_matches_ipv4host(struct acl_options* acl, struct sockaddr_in* addr, unsigned int port)
1780 {
1781 	if(acl->port != 0 && acl->port != port)
1782 		return 0;
1783 	switch(acl->rangetype) {
1784 	case acl_range_mask:
1785 	case acl_range_subnet:
1786 		if(!acl_addr_match_mask((uint32_t*)&acl->addr.addr, (uint32_t*)&addr->sin_addr,
1787 			(uint32_t*)&acl->range_mask.addr, sizeof(struct in_addr)))
1788 			return 0;
1789 		break;
1790 	case acl_range_minmax:
1791 		if(!acl_addr_match_range_v4((uint32_t*)&acl->addr.addr, (uint32_t*)&addr->sin_addr,
1792 			(uint32_t*)&acl->range_mask.addr, sizeof(struct in_addr)))
1793 			return 0;
1794 		break;
1795 	case acl_range_single:
1796 	default:
1797 		if(memcmp(&addr->sin_addr, &acl->addr.addr,
1798 			sizeof(struct in_addr)) != 0)
1799 			return 0;
1800 		break;
1801 	}
1802 	return 1;
1803 }
1804 
1805 int
acl_addr_matches_host(struct acl_options * acl,struct acl_options * host)1806 acl_addr_matches_host(struct acl_options* acl, struct acl_options* host)
1807 {
1808 	if(acl->is_ipv6)
1809 	{
1810 #ifdef INET6
1811 		struct sockaddr_storage* addr = (struct sockaddr_storage*)&host->addr;
1812 		if(!host->is_ipv6) return 0;
1813 		return acl_addr_matches_ipv6host(acl, addr, host->port);
1814 #else
1815 		return 0; /* no inet6, no match */
1816 #endif
1817 	}
1818 	else
1819 	{
1820 		struct sockaddr_in* addr = (struct sockaddr_in*)&host->addr;
1821 		if(host->is_ipv6) return 0;
1822 		return acl_addr_matches_ipv4host(acl, addr, host->port);
1823 	}
1824 	/* ENOTREACH */
1825 	return 0;
1826 }
1827 
1828 int
acl_addr_matches(struct acl_options * acl,struct query * q)1829 acl_addr_matches(struct acl_options* acl, struct query* q)
1830 {
1831 	if(acl->is_ipv6)
1832 	{
1833 #ifdef INET6
1834 		struct sockaddr_storage* addr = (struct sockaddr_storage*)&q->client_addr;
1835 		if(addr->ss_family != AF_INET6)
1836 			return 0;
1837 		return acl_addr_matches_ipv6host(acl, addr, ntohs(((struct sockaddr_in6*)addr)->sin6_port));
1838 #else
1839 		return 0; /* no inet6, no match */
1840 #endif
1841 	}
1842 	else
1843 	{
1844 		struct sockaddr_in* addr = (struct sockaddr_in*)&q->client_addr;
1845 		if(addr->sin_family != AF_INET)
1846 			return 0;
1847 		return acl_addr_matches_ipv4host(acl, addr, ntohs(addr->sin_port));
1848 	}
1849 	/* ENOTREACH */
1850 	return 0;
1851 }
1852 
1853 int
acl_addr_matches_proxy(struct acl_options * acl,struct query * q)1854 acl_addr_matches_proxy(struct acl_options* acl, struct query* q)
1855 {
1856 	if(acl->is_ipv6)
1857 	{
1858 #ifdef INET6
1859 		struct sockaddr_storage* addr = (struct sockaddr_storage*)&q->remote_addr;
1860 		if(addr->ss_family != AF_INET6)
1861 			return 0;
1862 		return acl_addr_matches_ipv6host(acl, addr, ntohs(((struct sockaddr_in6*)addr)->sin6_port));
1863 #else
1864 		return 0; /* no inet6, no match */
1865 #endif
1866 	}
1867 	else
1868 	{
1869 		struct sockaddr_in* addr = (struct sockaddr_in*)&q->remote_addr;
1870 		if(addr->sin_family != AF_INET)
1871 			return 0;
1872 		return acl_addr_matches_ipv4host(acl, addr, ntohs(addr->sin_port));
1873 	}
1874 	/* ENOTREACH */
1875 	return 0;
1876 }
1877 
1878 int
acl_addr_match_mask(uint32_t * a,uint32_t * b,uint32_t * mask,size_t sz)1879 acl_addr_match_mask(uint32_t* a, uint32_t* b, uint32_t* mask, size_t sz)
1880 {
1881 	size_t i;
1882 #ifndef NDEBUG
1883 	assert(sz % 4 == 0);
1884 #endif
1885 	sz /= 4;
1886 	for(i=0; i<sz; ++i)
1887 	{
1888 		if(((*a++)&*mask) != ((*b++)&*mask))
1889 			return 0;
1890 		++mask;
1891 	}
1892 	return 1;
1893 }
1894 
1895 int
acl_addr_match_range_v4(uint32_t * minval,uint32_t * x,uint32_t * maxval,size_t sz)1896 acl_addr_match_range_v4(uint32_t* minval, uint32_t* x, uint32_t* maxval, size_t sz)
1897 {
1898 	assert(sz == 4); (void)sz;
1899 	/* check treats x as one huge number */
1900 
1901 	/* if outside bounds, we are done */
1902 	if(*minval > *x)
1903 		return 0;
1904 	if(*maxval < *x)
1905 		return 0;
1906 
1907 	return 1;
1908 }
1909 
1910 #ifdef INET6
1911 int
acl_addr_match_range_v6(uint32_t * minval,uint32_t * x,uint32_t * maxval,size_t sz)1912 acl_addr_match_range_v6(uint32_t* minval, uint32_t* x, uint32_t* maxval, size_t sz)
1913 {
1914 	size_t i;
1915 	uint8_t checkmin = 1, checkmax = 1;
1916 #ifndef NDEBUG
1917 	assert(sz % 4 == 0);
1918 #endif
1919 	/* check treats x as one huge number */
1920 	sz /= 4;
1921 	for(i=0; i<sz; ++i)
1922 	{
1923 		/* if outside bounds, we are done */
1924 		if(checkmin)
1925 			if(minval[i] > x[i])
1926 				return 0;
1927 		if(checkmax)
1928 			if(maxval[i] < x[i])
1929 				return 0;
1930 		/* if x is equal to a bound, that bound needs further checks */
1931 		if(checkmin && minval[i]!=x[i])
1932 			checkmin = 0;
1933 		if(checkmax && maxval[i]!=x[i])
1934 			checkmax = 0;
1935 		if(!checkmin && !checkmax)
1936 			return 1; /* will always match */
1937 	}
1938 	return 1;
1939 }
1940 #endif /* INET6 */
1941 
1942 int
acl_key_matches(struct acl_options * acl,struct query * q)1943 acl_key_matches(struct acl_options* acl, struct query* q)
1944 {
1945 	if(acl->blocked)
1946 		return 1;
1947 	if(acl->nokey) {
1948 		if(q->tsig.status == TSIG_NOT_PRESENT)
1949 			return 1;
1950 		return 0;
1951 	}
1952 	/* check name of tsig key */
1953 	if(q->tsig.status != TSIG_OK) {
1954 		DEBUG(DEBUG_XFRD,2, (LOG_INFO, "keymatch fail query has no TSIG"));
1955 		return 0; /* query has no TSIG */
1956 	}
1957 	if(q->tsig.error_code != TSIG_ERROR_NOERROR) {
1958 		DEBUG(DEBUG_XFRD,2, (LOG_INFO, "keymatch fail, tsig has error"));
1959 		return 0; /* some tsig error */
1960 	}
1961 	if(!acl->key_options->tsig_key) {
1962 		DEBUG(DEBUG_XFRD,2, (LOG_INFO, "keymatch fail no config"));
1963 		return 0; /* key not properly configured */
1964 	}
1965 	if(dname_compare(q->tsig.key_name,
1966 		acl->key_options->tsig_key->name) != 0) {
1967 		DEBUG(DEBUG_XFRD,2, (LOG_INFO, "keymatch fail wrong key name"));
1968 		return 0; /* wrong key name */
1969 	}
1970 	if(tsig_strlowercmp(q->tsig.algorithm->short_name,
1971 		acl->key_options->algorithm) != 0 && (
1972 		strncmp("hmac-", q->tsig.algorithm->short_name, 5) != 0 ||
1973 		tsig_strlowercmp(q->tsig.algorithm->short_name+5,
1974 		acl->key_options->algorithm) != 0) ) {
1975 		DEBUG(DEBUG_XFRD,2, (LOG_ERR, "query tsig wrong algorithm"));
1976 		return 0; /* no such algo */
1977 	}
1978 	return 1;
1979 }
1980 
1981 int
acl_same_host(struct acl_options * a,struct acl_options * b)1982 acl_same_host(struct acl_options* a, struct acl_options* b)
1983 {
1984 	if(a->is_ipv6 && !b->is_ipv6)
1985 		return 0;
1986 	if(!a->is_ipv6 && b->is_ipv6)
1987 		return 0;
1988 	if(a->port != b->port)
1989 		return 0;
1990 	if(a->rangetype != b->rangetype)
1991 		return 0;
1992 	if(!a->is_ipv6) {
1993 		if(memcmp(&a->addr.addr, &b->addr.addr,
1994 		   sizeof(struct in_addr)) != 0)
1995 			return 0;
1996 		if(a->rangetype != acl_range_single &&
1997 		   memcmp(&a->range_mask.addr, &b->range_mask.addr,
1998 		   sizeof(struct in_addr)) != 0)
1999 			return 0;
2000 	} else {
2001 #ifdef INET6
2002 		if(memcmp(&a->addr.addr6, &b->addr.addr6,
2003 		   sizeof(struct in6_addr)) != 0)
2004 			return 0;
2005 		if(a->rangetype != acl_range_single &&
2006 		   memcmp(&a->range_mask.addr6, &b->range_mask.addr6,
2007 		   sizeof(struct in6_addr)) != 0)
2008 			return 0;
2009 #else
2010 		return 0;
2011 #endif
2012 	}
2013 	return 1;
2014 }
2015 
2016 #if defined(HAVE_SSL)
2017 void
key_options_tsig_add(struct nsd_options * opt)2018 key_options_tsig_add(struct nsd_options* opt)
2019 {
2020 	struct key_options* optkey;
2021 	RBTREE_FOR(optkey, struct key_options*, opt->keys) {
2022 		key_options_setup(opt->region, optkey);
2023 		tsig_add_key(optkey->tsig_key);
2024 	}
2025 }
2026 #endif
2027 
2028 int
zone_is_slave(struct zone_options * opt)2029 zone_is_slave(struct zone_options* opt)
2030 {
2031 	return opt && opt->pattern && opt->pattern->request_xfr != 0;
2032 }
2033 
2034 /* get a character in string (or replacement char if not long enough) */
2035 static const char*
get_char(const char * str,size_t i)2036 get_char(const char* str, size_t i)
2037 {
2038 	static char res[2];
2039 	if(i >= strlen(str))
2040 		return ".";
2041 	res[0] = str[i];
2042 	res[1] = 0;
2043 	return res;
2044 }
2045 /* get end label of the zone name (or .) */
2046 static const char*
get_end_label(struct zone_options * zone,int i)2047 get_end_label(struct zone_options* zone, int i)
2048 {
2049 	const dname_type* d = (const dname_type*)zone->node.key;
2050 	if(i >= d->label_count) {
2051 		return ".";
2052 	}
2053 	return wirelabel2str(dname_label(d, i));
2054 }
2055 /* replace occurrences of one with two */
2056 void
replace_str(char * str,size_t len,const char * one,const char * two)2057 replace_str(char* str, size_t len, const char* one, const char* two)
2058 {
2059 	char* pos;
2060 	char* at = str;
2061 	while( (pos=strstr(at, one)) ) {
2062 		if(strlen(str)+strlen(two)-strlen(one) >= len)
2063 			return; /* no more space to replace */
2064 		/* stuff before pos is fine */
2065 		/* move the stuff after pos to make space for two, add
2066 		 * one to length of remainder to also copy the 0 byte end */
2067 		memmove(pos+strlen(two), pos+strlen(one),
2068 			strlen(pos+strlen(one))+1);
2069 		/* copy in two */
2070 		memmove(pos, two, strlen(two));
2071 		/* at is end of the newly inserted two (avoids recursion if
2072 		 * two contains one) */
2073 		at = pos+strlen(two);
2074 	}
2075 }
2076 
2077 const char*
config_cook_string(struct zone_options * zone,const char * input)2078 config_cook_string(struct zone_options* zone, const char* input)
2079 {
2080 	static char f[1024];
2081 	/* if not a template, return as-is */
2082 	if(!strchr(input, '%')) {
2083 		return input;
2084 	}
2085 	strlcpy(f, input, sizeof(f));
2086 	if(strstr(f, "%1"))
2087 		replace_str(f, sizeof(f), "%1", get_char(zone->name, 0));
2088 	if(strstr(f, "%2"))
2089 		replace_str(f, sizeof(f), "%2", get_char(zone->name, 1));
2090 	if(strstr(f, "%3"))
2091 		replace_str(f, sizeof(f), "%3", get_char(zone->name, 2));
2092 	if(strstr(f, "%z"))
2093 		replace_str(f, sizeof(f), "%z", get_end_label(zone, 1));
2094 	if(strstr(f, "%y"))
2095 		replace_str(f, sizeof(f), "%y", get_end_label(zone, 2));
2096 	if(strstr(f, "%x"))
2097 		replace_str(f, sizeof(f), "%x", get_end_label(zone, 3));
2098 	if(strstr(f, "%s"))
2099 		replace_str(f, sizeof(f), "%s", zone->name);
2100 	return f;
2101 }
2102 
2103 const char*
config_make_zonefile(struct zone_options * zone,struct nsd * nsd)2104 config_make_zonefile(struct zone_options* zone, struct nsd* nsd)
2105 {
2106 	static char f[1024];
2107 	/* if not a template, return as-is */
2108 	if(!strchr(zone->pattern->zonefile, '%')) {
2109 		if (nsd->chrootdir && nsd->chrootdir[0] &&
2110 			zone->pattern->zonefile &&
2111 			zone->pattern->zonefile[0] == '/' &&
2112 			strncmp(zone->pattern->zonefile, nsd->chrootdir,
2113 			strlen(nsd->chrootdir)) == 0)
2114 			/* -1 because chrootdir ends in trailing slash */
2115 			return zone->pattern->zonefile + strlen(nsd->chrootdir) - 1;
2116 		return zone->pattern->zonefile;
2117 	}
2118 	strlcpy(f, zone->pattern->zonefile, sizeof(f));
2119 	if(strstr(f, "%1"))
2120 		replace_str(f, sizeof(f), "%1", get_char(zone->name, 0));
2121 	if(strstr(f, "%2"))
2122 		replace_str(f, sizeof(f), "%2", get_char(zone->name, 1));
2123 	if(strstr(f, "%3"))
2124 		replace_str(f, sizeof(f), "%3", get_char(zone->name, 2));
2125 	if(strstr(f, "%z"))
2126 		replace_str(f, sizeof(f), "%z", get_end_label(zone, 1));
2127 	if(strstr(f, "%y"))
2128 		replace_str(f, sizeof(f), "%y", get_end_label(zone, 2));
2129 	if(strstr(f, "%x"))
2130 		replace_str(f, sizeof(f), "%x", get_end_label(zone, 3));
2131 	if(strstr(f, "%s"))
2132 		replace_str(f, sizeof(f), "%s", zone->name);
2133 	if (nsd->chrootdir && nsd->chrootdir[0] && f[0] == '/' &&
2134 		strncmp(f, nsd->chrootdir, strlen(nsd->chrootdir)) == 0)
2135 		/* -1 because chrootdir ends in trailing slash */
2136 		return f + strlen(nsd->chrootdir) - 1;
2137 	return f;
2138 }
2139 
2140 struct zone_options*
zone_options_find(struct nsd_options * opt,const struct dname * apex)2141 zone_options_find(struct nsd_options* opt, const struct dname* apex)
2142 {
2143 	return (struct zone_options*) rbtree_search(opt->zone_options, apex);
2144 }
2145 
2146 struct acl_options*
acl_find_num(struct acl_options * acl,int num)2147 acl_find_num(struct acl_options* acl, int num)
2148 {
2149 	int count = num;
2150 	if(num < 0)
2151 		return 0;
2152 	while(acl && count > 0) {
2153 		acl = acl->next;
2154 		count--;
2155 	}
2156 	if(count == 0)
2157 		return acl;
2158 	return 0;
2159 }
2160 
2161 /* true if ipv6 address, false if ipv4 */
2162 int
parse_acl_is_ipv6(const char * p)2163 parse_acl_is_ipv6(const char* p)
2164 {
2165 	/* see if addr is ipv6 or ipv4 -- by : and . */
2166 	while(*p) {
2167 		if(*p == '.') return 0;
2168 		if(*p == ':') return 1;
2169 		++p;
2170 	}
2171 	return 0;
2172 }
2173 
2174 /* returns range type. mask is the 2nd part of the range */
2175 int
parse_acl_range_type(char * ip,char ** mask)2176 parse_acl_range_type(char* ip, char** mask)
2177 {
2178 	char *p;
2179 	if((p=strchr(ip, '&'))!=0) {
2180 		*p = 0;
2181 		*mask = p+1;
2182 		return acl_range_mask;
2183 	}
2184 	if((p=strchr(ip, '/'))!=0) {
2185 		*p = 0;
2186 		*mask = p+1;
2187 		return acl_range_subnet;
2188 	}
2189 	if((p=strchr(ip, '-'))!=0) {
2190 		*p = 0;
2191 		*mask = p+1;
2192 		return acl_range_minmax;
2193 	}
2194 	*mask = 0;
2195 	return acl_range_single;
2196 }
2197 
2198 /* parses subnet mask, fills 0 mask as well */
2199 void
parse_acl_range_subnet(char * p,void * addr,int maxbits)2200 parse_acl_range_subnet(char* p, void* addr, int maxbits)
2201 {
2202 	int subnet_bits = atoi(p);
2203 	uint8_t* addr_bytes = (uint8_t*)addr;
2204 	if(subnet_bits == 0 && strcmp(p, "0")!=0) {
2205 		c_error("bad subnet range '%s'", p);
2206 		return;
2207 	}
2208 	if(subnet_bits < 0 || subnet_bits > maxbits) {
2209 		c_error("subnet of %d bits out of range [0..%d]", subnet_bits, maxbits);
2210 		return;
2211 	}
2212 	/* fill addr with n bits of 1s (struct has been zeroed) */
2213 	while(subnet_bits >= 8) {
2214 		*addr_bytes++ = 0xff;
2215 		subnet_bits -= 8;
2216 	}
2217 	if(subnet_bits > 0) {
2218 		uint8_t shifts[] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff};
2219 		*addr_bytes = shifts[subnet_bits];
2220 	}
2221 }
2222 
2223 struct acl_options*
parse_acl_info(region_type * region,char * ip,const char * key)2224 parse_acl_info(region_type* region, char* ip, const char* key)
2225 {
2226 	char* p;
2227 	struct acl_options* acl = (struct acl_options*)region_alloc(region,
2228 		sizeof(struct acl_options));
2229 	acl->next = 0;
2230 	/* ip */
2231 	acl->ip_address_spec = region_strdup(region, ip);
2232 	acl->use_axfr_only = 0;
2233 	acl->allow_udp = 0;
2234 	acl->ixfr_disabled = 0;
2235 	acl->bad_xfr_count = 0;
2236 	acl->key_options = 0;
2237 	acl->tls_auth_options = 0;
2238 	acl->tls_auth_name = 0;
2239 	acl->is_ipv6 = 0;
2240 	acl->port = 0;
2241 	memset(&acl->addr, 0, sizeof(union acl_addr_storage));
2242 	memset(&acl->range_mask, 0, sizeof(union acl_addr_storage));
2243 	if((p=strrchr(ip, '@'))!=0) {
2244 		if(atoi(p+1) == 0) c_error("expected port number after '@'");
2245 		else acl->port = atoi(p+1);
2246 		*p=0;
2247 	}
2248 	acl->rangetype = parse_acl_range_type(ip, &p);
2249 	if(parse_acl_is_ipv6(ip)) {
2250 		acl->is_ipv6 = 1;
2251 #ifdef INET6
2252 		if(inet_pton(AF_INET6, ip, &acl->addr.addr6) != 1)
2253 			c_error("Bad ip6 address '%s'", ip);
2254 		if(acl->rangetype==acl_range_mask || acl->rangetype==acl_range_minmax) {
2255 			assert(p);
2256 			if(inet_pton(AF_INET6, p, &acl->range_mask.addr6) != 1)
2257 				c_error("Bad ip6 address mask '%s'", p);
2258 		}
2259 		if(acl->rangetype==acl_range_subnet) {
2260 			assert(p);
2261 			parse_acl_range_subnet(p, &acl->range_mask.addr6, 128);
2262 		}
2263 #else
2264 		c_error("encountered IPv6 address '%s'.", ip);
2265 #endif /* INET6 */
2266 	} else {
2267 		acl->is_ipv6 = 0;
2268 		if(inet_pton(AF_INET, ip, &acl->addr.addr) != 1)
2269 			c_error("Bad ip4 address '%s'", ip);
2270 		if(acl->rangetype==acl_range_mask || acl->rangetype==acl_range_minmax) {
2271 			assert(p);
2272 			if(inet_pton(AF_INET, p, &acl->range_mask.addr) != 1)
2273 				c_error("Bad ip4 address mask '%s'", p);
2274 		}
2275 		if(acl->rangetype==acl_range_subnet) {
2276 			assert(p);
2277 			parse_acl_range_subnet(p, &acl->range_mask.addr, 32);
2278 		}
2279 	}
2280 
2281 	/* key */
2282 	if(strcmp(key, "NOKEY")==0) {
2283 		acl->nokey = 1;
2284 		acl->blocked = 0;
2285 		acl->key_name = 0;
2286 	} else if(strcmp(key, "BLOCKED")==0) {
2287 		acl->nokey = 0;
2288 		acl->blocked = 1;
2289 		acl->key_name = 0;
2290 	} else {
2291 		acl->nokey = 0;
2292 		acl->blocked = 0;
2293 		acl->key_name = region_strdup(region, key);
2294 	}
2295 	return acl;
2296 }
2297 
2298 /* copy acl list at end of parser start, update current */
2299 static
copy_and_append_acls(struct acl_options ** start,struct acl_options * list)2300 void copy_and_append_acls(struct acl_options** start, struct acl_options* list)
2301 {
2302 	struct acl_options *tail = NULL;
2303 
2304 	assert(start != NULL);
2305 
2306 	tail = *start;
2307 	if(tail) {
2308 		while(tail->next) {
2309 			tail = tail->next;
2310 		}
2311 	}
2312 
2313 	while(list) {
2314 		struct acl_options* acl = copy_acl(cfg_parser->opt->region,
2315 			list);
2316 		acl->next = NULL;
2317 		if(tail) {
2318 			tail->next = acl;
2319 		} else {
2320 			*start = acl;
2321 		}
2322 		tail = acl;
2323 		list = list->next;
2324 	}
2325 }
2326 
2327 void
config_apply_pattern(struct pattern_options * dest,const char * name)2328 config_apply_pattern(struct pattern_options *dest, const char* name)
2329 {
2330 	/* find the pattern */
2331 	struct pattern_options* pat = pattern_options_find(cfg_parser->opt,
2332 		name);
2333 	if(!pat) {
2334 		c_error("could not find pattern %s", name);
2335 		return;
2336 	}
2337 
2338 	/* apply settings */
2339 	if(pat->zonefile)
2340 		dest->zonefile = region_strdup(cfg_parser->opt->region,
2341 			pat->zonefile);
2342 	if(pat->zonestats)
2343 		dest->zonestats = region_strdup(cfg_parser->opt->region,
2344 			pat->zonestats);
2345 	if(!pat->allow_axfr_fallback_is_default) {
2346 		dest->allow_axfr_fallback = pat->allow_axfr_fallback;
2347 		dest->allow_axfr_fallback_is_default = 0;
2348 	}
2349 	if(!pat->notify_retry_is_default) {
2350 		dest->notify_retry = pat->notify_retry;
2351 		dest->notify_retry_is_default = 0;
2352 	}
2353 	if(!pat->max_refresh_time_is_default) {
2354 		dest->max_refresh_time = pat->max_refresh_time;
2355 		dest->max_refresh_time_is_default = 0;
2356 	}
2357 	if(!pat->min_refresh_time_is_default) {
2358 		dest->min_refresh_time = pat->min_refresh_time;
2359 		dest->min_refresh_time_is_default = 0;
2360 	}
2361 	if(!pat->max_retry_time_is_default) {
2362 		dest->max_retry_time = pat->max_retry_time;
2363 		dest->max_retry_time_is_default = 0;
2364 	}
2365 	if(!pat->min_retry_time_is_default) {
2366 		dest->min_retry_time = pat->min_retry_time;
2367 		dest->min_retry_time_is_default = 0;
2368 	}
2369 	if(!expire_time_is_default(pat->min_expire_time_expr)) {
2370 		dest->min_expire_time = pat->min_expire_time;
2371 		dest->min_expire_time_expr = pat->min_expire_time_expr;
2372 	}
2373 	if(!pat->store_ixfr_is_default) {
2374 		dest->store_ixfr = pat->store_ixfr;
2375 		dest->store_ixfr_is_default = 0;
2376 	}
2377 	if(!pat->ixfr_size_is_default) {
2378 		dest->ixfr_size = pat->ixfr_size;
2379 		dest->ixfr_size_is_default = 0;
2380 	}
2381 	if(!pat->ixfr_number_is_default) {
2382 		dest->ixfr_number = pat->ixfr_number;
2383 		dest->ixfr_number_is_default = 0;
2384 	}
2385 	if(!pat->create_ixfr_is_default) {
2386 		dest->create_ixfr = pat->create_ixfr;
2387 		dest->create_ixfr_is_default = 0;
2388 	}
2389 	dest->size_limit_xfr = pat->size_limit_xfr;
2390 #ifdef RATELIMIT
2391 	dest->rrl_whitelist |= pat->rrl_whitelist;
2392 #endif
2393 	/* append acl items */
2394 	copy_and_append_acls(&dest->allow_notify, pat->allow_notify);
2395 	copy_and_append_acls(&dest->request_xfr, pat->request_xfr);
2396 	copy_and_append_acls(&dest->notify, pat->notify);
2397 	copy_and_append_acls(&dest->provide_xfr, pat->provide_xfr);
2398 	copy_and_append_acls(&dest->allow_query, pat->allow_query);
2399 	copy_and_append_acls(&dest->outgoing_interface, pat->outgoing_interface);
2400 	if(pat->multi_master_check)
2401 		dest->multi_master_check = pat->multi_master_check;
2402 
2403 	if(!pat->verify_zone_is_default) {
2404 		dest->verify_zone = pat->verify_zone;
2405 		dest->verify_zone_is_default = 0;
2406 	}
2407 	if(!pat->verifier_timeout_is_default) {
2408 		dest->verifier_timeout = pat->verifier_timeout;
2409 		dest->verifier_timeout_is_default = 0;
2410 	}
2411 	if(!pat->verifier_feed_zone_is_default) {
2412 		dest->verifier_feed_zone = pat->verifier_feed_zone;
2413 		dest->verifier_feed_zone_is_default = 0;
2414 	}
2415 	if(pat->verifier != NULL) {
2416 		size_t cnt;
2417 		char **vec;
2418 		region_type *region = cfg_parser->opt->region;
2419 
2420 		for(cnt = 0; pat->verifier[cnt] != NULL; cnt++) ;
2421 		vec = region_alloc(region, (cnt + 1) * sizeof(char *));
2422 		for(cnt = 0; pat->verifier[cnt] != NULL; cnt++) {
2423 			vec[cnt] = region_strdup(region, pat->verifier[cnt]);
2424 		}
2425 		vec[cnt] = NULL;
2426 		if(dest->verifier != NULL) {
2427 			size_t size;
2428 			for(cnt = 0; dest->verifier[cnt] != NULL; cnt++) {
2429 				size = strlen(dest->verifier[cnt]) + 1;
2430 				region_recycle(
2431 					region, dest->verifier[cnt], size);
2432 			}
2433 			size = (cnt + 1) * sizeof(char *);
2434 			region_recycle(region, dest->verifier, size);
2435 		}
2436 		dest->verifier = vec;
2437 	}
2438 }
2439 
2440 void
nsd_options_destroy(struct nsd_options * opt)2441 nsd_options_destroy(struct nsd_options* opt)
2442 {
2443 	region_destroy(opt->region);
2444 #ifdef MEMCLEAN /* OS collects memory pages */
2445 	c_lex_destroy();
2446 #endif
2447 }
2448 
getzonestatid(struct nsd_options * opt,struct zone_options * zopt)2449 unsigned getzonestatid(struct nsd_options* opt, struct zone_options* zopt)
2450 {
2451 #ifdef USE_ZONE_STATS
2452 	const char* statname;
2453 	struct zonestatname* n;
2454 	rbnode_type* res;
2455 	/* try to find the instantiated zonestat name */
2456 	if(!zopt->pattern->zonestats || zopt->pattern->zonestats[0]==0)
2457 		return 0; /* no zone stats */
2458 	statname = config_cook_string(zopt, zopt->pattern->zonestats);
2459 	res = rbtree_search(opt->zonestatnames, statname);
2460 	if(res)
2461 		return ((struct zonestatname*)res)->id;
2462 	/* create it */
2463 	n = (struct zonestatname*)region_alloc_zero(opt->region, sizeof(*n));
2464 	n->node.key = region_strdup(opt->region, statname);
2465 	if(!n->node.key) {
2466 		log_msg(LOG_ERR, "malloc failed: %s", strerror(errno));
2467 		exit(1);
2468 	}
2469 	n->id = (unsigned)(opt->zonestatnames->count);
2470 	rbtree_insert(opt->zonestatnames, (rbnode_type*)n);
2471 	return n->id;
2472 #else /* USE_ZONE_STATS */
2473 	(void)opt; (void)zopt;
2474 	return 0;
2475 #endif /* USE_ZONE_STATS */
2476 }
2477 
2478 /** check if config turns on IP-address interface with certificates or a
2479  * named pipe without certificates. */
2480 int
options_remote_is_address(struct nsd_options * cfg)2481 options_remote_is_address(struct nsd_options* cfg)
2482 {
2483 	if(!cfg->control_enable) return 0;
2484 	if(!cfg->control_interface) return 1;
2485 	if(!cfg->control_interface->address) return 1;
2486 	if(cfg->control_interface->address[0] == 0) return 1;
2487 	return (cfg->control_interface->address[0] != '/');
2488 }
2489 
2490 #ifdef HAVE_GETIFADDRS
2491 static void
resolve_ifa_name(struct ifaddrs * ifas,const char * search_ifa,char *** ip_addresses,size_t * ip_addresses_size)2492 resolve_ifa_name(struct ifaddrs *ifas, const char *search_ifa, char ***ip_addresses, size_t *ip_addresses_size)
2493 {
2494 	struct ifaddrs *ifa;
2495 	size_t last_ip_addresses_size = *ip_addresses_size;
2496 
2497 	for(ifa = ifas; ifa != NULL; ifa = ifa->ifa_next) {
2498 		sa_family_t family;
2499 		const char* atsign;
2500 #ifdef INET6      /* |   address ip    | % |  ifa name  | @ |  port  | nul */
2501 		char addr_buf[INET6_ADDRSTRLEN + 1 + IF_NAMESIZE + 1 + 16 + 1];
2502 #else
2503 		char addr_buf[INET_ADDRSTRLEN + 1 + 16 + 1];
2504 #endif
2505 
2506 		if((atsign=strrchr(search_ifa, '@')) != NULL) {
2507 			if(strlen(ifa->ifa_name) != (size_t)(atsign-search_ifa)
2508 			   || strncmp(ifa->ifa_name, search_ifa,
2509 			   atsign-search_ifa) != 0)
2510 				continue;
2511 		} else {
2512 			if(strcmp(ifa->ifa_name, search_ifa) != 0)
2513 				continue;
2514 			atsign = "";
2515 		}
2516 
2517 		if(ifa->ifa_addr == NULL)
2518 			continue;
2519 
2520 		family = ifa->ifa_addr->sa_family;
2521 		if(family == AF_INET) {
2522 			char a4[INET_ADDRSTRLEN + 1];
2523 			struct sockaddr_in *in4 = (struct sockaddr_in *)
2524 				ifa->ifa_addr;
2525 			if(!inet_ntop(family, &in4->sin_addr, a4, sizeof(a4)))
2526 				error("inet_ntop");
2527 			snprintf(addr_buf, sizeof(addr_buf), "%s%s",
2528 				a4, atsign);
2529 		}
2530 #ifdef INET6
2531 		else if(family == AF_INET6) {
2532 			struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)
2533 				ifa->ifa_addr;
2534 			char a6[INET6_ADDRSTRLEN + 1];
2535 			char if_index_name[IF_NAMESIZE + 1];
2536 			if_index_name[0] = 0;
2537 			if(!inet_ntop(family, &in6->sin6_addr, a6, sizeof(a6)))
2538 				error("inet_ntop");
2539 			if_indextoname(in6->sin6_scope_id,
2540 				(char *)if_index_name);
2541 			if (strlen(if_index_name) != 0) {
2542 				snprintf(addr_buf, sizeof(addr_buf),
2543 					"%s%%%s%s", a6, if_index_name, atsign);
2544 			} else {
2545 				snprintf(addr_buf, sizeof(addr_buf), "%s%s",
2546 					a6, atsign);
2547 			}
2548 		}
2549 #endif
2550 		else {
2551 			continue;
2552 		}
2553 		VERBOSITY(4, (LOG_INFO, "interface %s has address %s",
2554 			search_ifa, addr_buf));
2555 
2556 		*ip_addresses = xrealloc(*ip_addresses, sizeof(char *) * (*ip_addresses_size + 1));
2557 		(*ip_addresses)[*ip_addresses_size] = xstrdup(addr_buf);
2558 		(*ip_addresses_size)++;
2559 	}
2560 
2561 	if (*ip_addresses_size == last_ip_addresses_size) {
2562 		*ip_addresses = xrealloc(*ip_addresses, sizeof(char *) * (*ip_addresses_size + 1));
2563 		(*ip_addresses)[*ip_addresses_size] = xstrdup(search_ifa);
2564 		(*ip_addresses_size)++;
2565 	}
2566 }
2567 
2568 static void
resolve_interface_names_for_ref(struct ip_address_option ** ip_addresses_ref,struct ifaddrs * addrs,region_type * region)2569 resolve_interface_names_for_ref(struct ip_address_option** ip_addresses_ref,
2570 		struct ifaddrs *addrs, region_type* region)
2571 {
2572 	struct ip_address_option *ip_addr;
2573 	struct ip_address_option *last = NULL;
2574 	struct ip_address_option *first = NULL;
2575 
2576 	/* replace the list of ip_adresses with a new list where the
2577 	 * interface names are replaced with their ip-address strings
2578 	 * from getifaddrs.  An interface can have several addresses. */
2579 	for(ip_addr = *ip_addresses_ref; ip_addr; ip_addr = ip_addr->next) {
2580 		char **ip_addresses = NULL;
2581 		size_t ip_addresses_size = 0, i;
2582 		resolve_ifa_name(addrs, ip_addr->address, &ip_addresses,
2583 			&ip_addresses_size);
2584 
2585 		for (i = 0; i < ip_addresses_size; i++) {
2586 			struct ip_address_option *current;
2587 			/* this copies the range_option, dev, and fib from
2588 			 * the original ip_address option to the new ones
2589 			 * with the addresses spelled out by resolve_ifa_name*/
2590 			current = region_alloc_init(region, ip_addr,
2591 				sizeof(*ip_addr));
2592 			current->address = region_strdup(region,
2593 				ip_addresses[i]);
2594 			current->next = NULL;
2595 			free(ip_addresses[i]);
2596 
2597 			if(first == NULL) {
2598 				first = current;
2599 			} else {
2600 				last->next = current;
2601 			}
2602 			last = current;
2603 		}
2604 		free(ip_addresses);
2605 	}
2606 	*ip_addresses_ref = first;
2607 
2608 }
2609 #endif /* HAVE_GETIFADDRS */
2610 
2611 void
resolve_interface_names(struct nsd_options * options)2612 resolve_interface_names(struct nsd_options* options)
2613 {
2614 #ifdef HAVE_GETIFADDRS
2615 	struct ifaddrs *addrs;
2616 
2617 	if(getifaddrs(&addrs) == -1)
2618 		  error("failed to list interfaces");
2619 
2620 	resolve_interface_names_for_ref(&options->ip_addresses,
2621 			addrs, options->region);
2622 	resolve_interface_names_for_ref(&options->control_interface,
2623 			addrs, options->region);
2624 
2625 	freeifaddrs(addrs);
2626 #else
2627 	(void)options;
2628 #endif /* HAVE_GETIFADDRS */
2629 }
2630 
2631 int
sockaddr_uses_proxy_protocol_port(struct nsd_options * options,struct sockaddr * addr)2632 sockaddr_uses_proxy_protocol_port(struct nsd_options* options,
2633 	struct sockaddr* addr)
2634 {
2635 	struct proxy_protocol_port_list* p;
2636 	int port;
2637 #ifdef INET6
2638 	struct sockaddr_storage* ss = (struct sockaddr_storage*)addr;
2639 	if(ss->ss_family == AF_INET6) {
2640 		struct sockaddr_in6* a6 = (struct sockaddr_in6*)addr;
2641 		port = ntohs(a6->sin6_port);
2642 	} else if(ss->ss_family == AF_INET) {
2643 #endif
2644 		struct sockaddr_in* a = (struct sockaddr_in*)addr;
2645 #ifndef INET6
2646 		if(a->sin_family != AF_INET)
2647 			return 0; /* unknown family */
2648 #endif
2649 		port = ntohs(a->sin_port);
2650 #ifdef INET6
2651 	} else {
2652 		return 0; /* unknown family */
2653 	}
2654 #endif
2655 	p = options->proxy_protocol_port;
2656 	while(p) {
2657 		if(p->port == port)
2658 			return 1;
2659 		p = p->next;
2660 	}
2661 	return 0;
2662 }
2663