1 /*	$OpenBSD: relayd.c,v 1.193 2025/01/30 17:00:31 martijn Exp $	*/
2 
3 /*
4  * Copyright (c) 2007 - 2016 Reyk Floeter <reyk@openbsd.org>
5  * Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include <sys/types.h>
21 #include <sys/queue.h>
22 #include <sys/socket.h>
23 #include <sys/stat.h>
24 #include <sys/wait.h>
25 #include <sys/resource.h>
26 
27 #include <netinet/in.h>
28 #include <arpa/inet.h>
29 
30 #include <agentx.h>
31 #include <signal.h>
32 #include <string.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <fcntl.h>
36 #include <getopt.h>
37 #include <fnmatch.h>
38 #include <syslog.h>
39 #include <err.h>
40 #include <errno.h>
41 #include <event.h>
42 #include <unistd.h>
43 #include <ctype.h>
44 #include <pwd.h>
45 #include <sha1.h>
46 #include <md5.h>
47 
48 #include <tls.h>
49 
50 #include "relayd.h"
51 
52 #define MAXIMUM(a, b)	(((a) > (b)) ? (a) : (b))
53 
54 __dead void	 usage(void);
55 
56 int		 parent_configure(struct relayd *);
57 void		 parent_configure_done(struct relayd *);
58 void		 parent_reload(struct relayd *, u_int, const char *);
59 void		 parent_sig_handler(int, short, void *);
60 void		 parent_shutdown(struct relayd *);
61 int		 parent_dispatch_pfe(int, struct privsep_proc *, struct imsg *);
62 int		 parent_dispatch_hce(int, struct privsep_proc *, struct imsg *);
63 int		 parent_dispatch_relay(int, struct privsep_proc *,
64 		    struct imsg *);
65 int		 parent_dispatch_ca(int, struct privsep_proc *,
66 		    struct imsg *);
67 int		 bindany(struct ctl_bindany *);
68 void		 parent_tls_ticket_rekey(int, short, void *);
69 
70 struct relayd			*relayd_env;
71 
72 static struct privsep_proc procs[] = {
73 	{ "pfe",	PROC_PFE, parent_dispatch_pfe, pfe },
74 	{ "hce",	PROC_HCE, parent_dispatch_hce, hce },
75 	{ "relay",	PROC_RELAY, parent_dispatch_relay, relay },
76 	{ "ca",		PROC_CA, parent_dispatch_ca, ca }
77 };
78 
79 enum privsep_procid privsep_process;
80 
81 void
parent_sig_handler(int sig,short event,void * arg)82 parent_sig_handler(int sig, short event, void *arg)
83 {
84 	struct privsep	*ps = arg;
85 
86 	switch (sig) {
87 	case SIGTERM:
88 	case SIGINT:
89 		parent_shutdown(ps->ps_env);
90 		break;
91 	case SIGHUP:
92 		log_info("%s: reload requested with SIGHUP", __func__);
93 
94 		/*
95 		 * This is safe because libevent uses async signal handlers
96 		 * that run in the event loop and not in signal context.
97 		 */
98 		parent_reload(ps->ps_env, CONFIG_RELOAD, NULL);
99 		break;
100 	case SIGPIPE:
101 	case SIGUSR1:
102 		/* ignore */
103 		break;
104 	default:
105 		fatalx("unexpected signal");
106 	}
107 }
108 
109 __dead void
usage(void)110 usage(void)
111 {
112 	extern char	*__progname;
113 
114 	fprintf(stderr, "usage: %s [-dnv] [-D macro=value] [-f file]\n",
115 	    __progname);
116 	exit(1);
117 }
118 
119 int
main(int argc,char * argv[])120 main(int argc, char *argv[])
121 {
122 	int			 c;
123 	int			 debug = 0, verbose = 0;
124 	u_int32_t		 opts = 0;
125 	struct relayd		*env;
126 	struct privsep		*ps;
127 	const char		*conffile = CONF_FILE;
128 	enum privsep_procid	 proc_id = PROC_PARENT;
129 	int			 proc_instance = 0;
130 	const char		*errp, *title = NULL;
131 	int			 argc0 = argc;
132 
133 	while ((c = getopt(argc, argv, "dD:nI:P:f:v")) != -1) {
134 		switch (c) {
135 		case 'd':
136 			debug = 2;
137 			break;
138 		case 'D':
139 			if (cmdline_symset(optarg) < 0)
140 				log_warnx("could not parse macro definition %s",
141 				    optarg);
142 			break;
143 		case 'n':
144 			debug = 2;
145 			opts |= RELAYD_OPT_NOACTION;
146 			break;
147 		case 'f':
148 			conffile = optarg;
149 			break;
150 		case 'v':
151 			verbose++;
152 			opts |= RELAYD_OPT_VERBOSE;
153 			break;
154 		case 'P':
155 			title = optarg;
156 			proc_id = proc_getid(procs, nitems(procs), title);
157 			if (proc_id == PROC_MAX)
158 				fatalx("invalid process name");
159 			break;
160 		case 'I':
161 			proc_instance = strtonum(optarg, 0,
162 			    PROC_MAX_INSTANCES, &errp);
163 			if (errp)
164 				fatalx("invalid process instance");
165 			break;
166 		default:
167 			usage();
168 		}
169 	}
170 
171 	/* log to stderr until daemonized */
172 	log_init(debug ? debug : 1, LOG_DAEMON);
173 
174 	argc -= optind;
175 	if (argc > 0)
176 		usage();
177 
178 	if ((env = calloc(1, sizeof(*env))) == NULL ||
179 	    (ps = calloc(1, sizeof(*ps))) == NULL)
180 		exit(1);
181 
182 	relayd_env = env;
183 	env->sc_ps = ps;
184 	ps->ps_env = env;
185 	TAILQ_INIT(&ps->ps_rcsocks);
186 	env->sc_conffile = conffile;
187 	env->sc_conf.opts = opts;
188 	TAILQ_INIT(&env->sc_hosts);
189 	TAILQ_INIT(&env->sc_sessions);
190 	env->sc_rtable = getrtable();
191 	/* initialize the TLS session id to a random key for all relay procs */
192 	arc4random_buf(env->sc_conf.tls_sid, sizeof(env->sc_conf.tls_sid));
193 
194 	if (parse_config(env->sc_conffile, env) == -1)
195 		exit(1);
196 
197 	if (debug)
198 		env->sc_conf.opts |= RELAYD_OPT_LOGUPDATE;
199 
200 	if (geteuid())
201 		errx(1, "need root privileges");
202 
203 	if ((ps->ps_pw =  getpwnam(RELAYD_USER)) == NULL)
204 		errx(1, "unknown user %s", RELAYD_USER);
205 
206 	log_init(debug, LOG_DAEMON);
207 	log_setverbose(verbose);
208 
209 	if (env->sc_conf.opts & RELAYD_OPT_NOACTION)
210 		ps->ps_noaction = 1;
211 
212 	ps->ps_instances[PROC_RELAY] = env->sc_conf.prefork_relay;
213 	ps->ps_instances[PROC_CA] = env->sc_conf.prefork_relay;
214 	ps->ps_instance = proc_instance;
215 	if (title != NULL)
216 		ps->ps_title[proc_id] = title;
217 
218 	/* only the parent returns */
219 	proc_init(ps, procs, nitems(procs), debug, argc0, argv, proc_id);
220 
221 	log_procinit("parent");
222 
223 	if (ps->ps_noaction == 0)
224 		log_info("startup");
225 
226 	if (unveil("/", "rx") == -1)
227 		err(1, "unveil /");
228 	if (env->sc_conf.flags & F_AGENTX) {
229 		if (unveil(env->sc_conf.agentx_path, "w") == -1)
230 			err(1, "unveil %s", env->sc_conf.agentx_path);
231 	} else {
232 		if (unveil(AGENTX_MASTER_PATH, "w") == -1)
233 			err(1, "unveil %s", env->sc_conf.agentx_path);
234 	}
235 	if (unveil(NULL, NULL) == -1)
236 		err(1, "unveil");
237 
238 	event_init();
239 
240 	signal_set(&ps->ps_evsigint, SIGINT, parent_sig_handler, ps);
241 	signal_set(&ps->ps_evsigterm, SIGTERM, parent_sig_handler, ps);
242 	signal_set(&ps->ps_evsighup, SIGHUP, parent_sig_handler, ps);
243 	signal_set(&ps->ps_evsigpipe, SIGPIPE, parent_sig_handler, ps);
244 	signal_set(&ps->ps_evsigusr1, SIGUSR1, parent_sig_handler, ps);
245 
246 	signal_add(&ps->ps_evsigint, NULL);
247 	signal_add(&ps->ps_evsigterm, NULL);
248 	signal_add(&ps->ps_evsighup, NULL);
249 	signal_add(&ps->ps_evsigpipe, NULL);
250 	signal_add(&ps->ps_evsigusr1, NULL);
251 
252 	proc_connect(ps);
253 
254 	relay_http(NULL);
255 	if (load_config(env->sc_conffile, env) == -1) {
256 		proc_kill(env->sc_ps);
257 		exit(1);
258 	}
259 
260 	if (env->sc_conf.opts & RELAYD_OPT_NOACTION) {
261 		fprintf(stderr, "configuration OK\n");
262 		proc_kill(env->sc_ps);
263 		exit(0);
264 	}
265 
266 	/* rekey the TLS tickets before pushing the config */
267 	parent_tls_ticket_rekey(0, 0, env);
268 	if (parent_configure(env) == -1)
269 		fatalx("configuration failed");
270 
271 	init_routes(env);
272 
273 	event_dispatch();
274 
275 	parent_shutdown(env);
276 	/* NOTREACHED */
277 
278 	return (0);
279 }
280 
281 int
parent_configure(struct relayd * env)282 parent_configure(struct relayd *env)
283 {
284 	struct table		*tb;
285 	struct rdr		*rdr;
286 	struct router		*rt;
287 	struct protocol		*proto;
288 	struct relay		*rlay;
289 	int			 id;
290 	int			 ret = -1;
291 
292 	TAILQ_FOREACH(tb, env->sc_tables, entry)
293 		config_settable(env, tb);
294 	TAILQ_FOREACH(rdr, env->sc_rdrs, entry)
295 		config_setrdr(env, rdr);
296 	TAILQ_FOREACH(rt, env->sc_rts, rt_entry)
297 		config_setrt(env, rt);
298 	TAILQ_FOREACH(proto, env->sc_protos, entry)
299 		config_setproto(env, proto);
300 	TAILQ_FOREACH(proto, env->sc_protos, entry)
301 		config_setrule(env, proto);
302 	TAILQ_FOREACH(rlay, env->sc_relays, rl_entry) {
303 		/* Check for TLS Inspection */
304 		if ((rlay->rl_conf.flags & (F_TLS|F_TLSCLIENT)) ==
305 		    (F_TLS|F_TLSCLIENT) && rlay->rl_tls_cacert_fd != -1)
306 			rlay->rl_conf.flags |= F_TLSINSPECT;
307 
308 		config_setrelay(env, rlay);
309 	}
310 
311 	/* HCE, PFE, CA and the relays need to reload their config. */
312 	env->sc_reload = 2 + (2 * env->sc_conf.prefork_relay);
313 
314 	for (id = 0; id < PROC_MAX; id++) {
315 		if (id == privsep_process)
316 			continue;
317 		proc_compose_imsg(env->sc_ps, id, -1, IMSG_CFG_DONE, -1,
318 		    -1, &env->sc_conf, sizeof(env->sc_conf));
319 	}
320 
321 	ret = 0;
322 
323 	config_purge(env, CONFIG_ALL & ~CONFIG_RELAYS);
324 	return (ret);
325 }
326 
327 void
parent_reload(struct relayd * env,u_int reset,const char * filename)328 parent_reload(struct relayd *env, u_int reset, const char *filename)
329 {
330 	if (env->sc_reload) {
331 		log_debug("%s: already in progress: %d pending",
332 		    __func__, env->sc_reload);
333 		return;
334 	}
335 
336 	/* Switch back to the default config file */
337 	if (filename == NULL || *filename == '\0')
338 		filename = env->sc_conffile;
339 
340 	log_debug("%s: level %d config file %s", __func__, reset, filename);
341 
342 	config_purge(env, CONFIG_ALL);
343 
344 	if (reset == CONFIG_RELOAD) {
345 		if (load_config(filename, env) == -1) {
346 			log_debug("%s: failed to load config file %s",
347 			    __func__, filename);
348 		}
349 
350 		config_setreset(env, CONFIG_ALL);
351 
352 		if (parent_configure(env) == -1) {
353 			log_debug("%s: failed to commit config from %s",
354 			    __func__, filename);
355 		}
356 	} else
357 		config_setreset(env, reset);
358 }
359 
360 void
parent_configure_done(struct relayd * env)361 parent_configure_done(struct relayd *env)
362 {
363 	int	 id;
364 
365 	if (env->sc_reload == 0) {
366 		log_warnx("%s: configuration already finished", __func__);
367 		return;
368 	}
369 
370 	env->sc_reload--;
371 	if (env->sc_reload == 0) {
372 		for (id = 0; id < PROC_MAX; id++) {
373 			if (id == privsep_process)
374 				continue;
375 
376 			proc_compose(env->sc_ps, id, IMSG_CTL_START, NULL, 0);
377 		}
378 	}
379 }
380 
381 void
parent_shutdown(struct relayd * env)382 parent_shutdown(struct relayd *env)
383 {
384 	config_purge(env, CONFIG_ALL);
385 
386 	proc_kill(env->sc_ps);
387 	control_cleanup(&env->sc_ps->ps_csock);
388 	carp_demote_shutdown();
389 
390 	free(env->sc_ps);
391 	free(env);
392 
393 	log_info("parent terminating, pid %d", getpid());
394 
395 	exit(0);
396 }
397 
398 int
parent_dispatch_pfe(int fd,struct privsep_proc * p,struct imsg * imsg)399 parent_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
400 {
401 	struct privsep		*ps = p->p_ps;
402 	struct relayd		*env = ps->ps_env;
403 	struct ctl_demote	 demote;
404 	struct ctl_netroute	 crt;
405 	u_int			 v;
406 	char			*str = NULL;
407 
408 	switch (imsg->hdr.type) {
409 	case IMSG_DEMOTE:
410 		IMSG_SIZE_CHECK(imsg, &demote);
411 		memcpy(&demote, imsg->data, sizeof(demote));
412 		carp_demote_set(demote.group, demote.level);
413 		break;
414 	case IMSG_RTMSG:
415 		IMSG_SIZE_CHECK(imsg, &crt);
416 		memcpy(&crt, imsg->data, sizeof(crt));
417 		pfe_route(env, &crt);
418 		break;
419 	case IMSG_CTL_RESET:
420 		IMSG_SIZE_CHECK(imsg, &v);
421 		memcpy(&v, imsg->data, sizeof(v));
422 		parent_reload(env, v, NULL);
423 		break;
424 	case IMSG_CTL_RELOAD:
425 		if (IMSG_DATA_SIZE(imsg) > 0)
426 			str = get_string(imsg->data, IMSG_DATA_SIZE(imsg));
427 		parent_reload(env, CONFIG_RELOAD, str);
428 		free(str);
429 		break;
430 	case IMSG_CTL_SHUTDOWN:
431 		parent_shutdown(env);
432 		break;
433 	case IMSG_CFG_DONE:
434 		parent_configure_done(env);
435 		break;
436 	case IMSG_AGENTXSOCK:
437 		agentx_setsock(env, p->p_id);
438 		break;
439 	default:
440 		return (-1);
441 	}
442 
443 	return (0);
444 }
445 
446 int
parent_dispatch_hce(int fd,struct privsep_proc * p,struct imsg * imsg)447 parent_dispatch_hce(int fd, struct privsep_proc *p, struct imsg *imsg)
448 {
449 	struct privsep		*ps = p->p_ps;
450 	struct relayd		*env = ps->ps_env;
451 	struct ctl_script	 scr;
452 
453 	switch (imsg->hdr.type) {
454 	case IMSG_SCRIPT:
455 		IMSG_SIZE_CHECK(imsg, &scr);
456 		bcopy(imsg->data, &scr, sizeof(scr));
457 		scr.retval = script_exec(env, &scr);
458 		proc_compose(ps, PROC_HCE, IMSG_SCRIPT, &scr, sizeof(scr));
459 		break;
460 	case IMSG_CFG_DONE:
461 		parent_configure_done(env);
462 		break;
463 	default:
464 		return (-1);
465 	}
466 
467 	return (0);
468 }
469 
470 int
parent_dispatch_relay(int fd,struct privsep_proc * p,struct imsg * imsg)471 parent_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
472 {
473 	struct privsep		*ps = p->p_ps;
474 	struct relayd		*env = ps->ps_env;
475 	struct ctl_bindany	 bnd;
476 	int			 s;
477 
478 	switch (imsg->hdr.type) {
479 	case IMSG_BINDANY:
480 		IMSG_SIZE_CHECK(imsg, &bnd);
481 		bcopy(imsg->data, &bnd, sizeof(bnd));
482 		if (bnd.bnd_proc > env->sc_conf.prefork_relay)
483 			fatalx("%s: invalid relay proc", __func__);
484 		switch (bnd.bnd_proto) {
485 		case IPPROTO_TCP:
486 		case IPPROTO_UDP:
487 			break;
488 		default:
489 			fatalx("%s: requested socket "
490 			    "for invalid protocol", __func__);
491 			/* NOTREACHED */
492 		}
493 		s = bindany(&bnd);
494 		proc_compose_imsg(ps, PROC_RELAY, bnd.bnd_proc,
495 		    IMSG_BINDANY, -1, s, &bnd.bnd_id, sizeof(bnd.bnd_id));
496 		break;
497 	case IMSG_CFG_DONE:
498 		parent_configure_done(env);
499 		break;
500 	default:
501 		return (-1);
502 	}
503 
504 	return (0);
505 }
506 
507 int
parent_dispatch_ca(int fd,struct privsep_proc * p,struct imsg * imsg)508 parent_dispatch_ca(int fd, struct privsep_proc *p, struct imsg *imsg)
509 {
510 	struct privsep		*ps = p->p_ps;
511 	struct relayd		*env = ps->ps_env;
512 
513 	switch (imsg->hdr.type) {
514 	case IMSG_CFG_DONE:
515 		parent_configure_done(env);
516 		break;
517 	default:
518 		return (-1);
519 	}
520 
521 	return (0);
522 }
523 
524 void
purge_table(struct relayd * env,struct tablelist * head,struct table * table)525 purge_table(struct relayd *env, struct tablelist *head, struct table *table)
526 {
527 	struct host		*host;
528 
529 	while ((host = TAILQ_FIRST(&table->hosts)) != NULL) {
530 		TAILQ_REMOVE(&table->hosts, host, entry);
531 		TAILQ_REMOVE(&env->sc_hosts, host, globalentry);
532 		if (event_initialized(&host->cte.ev)) {
533 			event_del(&host->cte.ev);
534 			close(host->cte.s);
535 		}
536 		ibuf_free(host->cte.buf);
537 		tls_free(host->cte.tls);
538 		free(host);
539 	}
540 	free(table->sendbuf);
541 	ibuf_free(table->sendbinbuf);
542 	tls_config_free(table->tls_cfg);
543 
544 	if (head != NULL)
545 		TAILQ_REMOVE(head, table, entry);
546 	free(table);
547 }
548 
549 void
purge_key(char ** key,off_t len)550 purge_key(char **key, off_t len)
551 {
552 	freezero(*key, len);
553 
554 	*key = NULL;
555 }
556 
557 void
purge_relay(struct relayd * env,struct relay * rlay)558 purge_relay(struct relayd *env, struct relay *rlay)
559 {
560 	struct rsession		*con;
561 	struct relay_table	*rlt;
562 	struct relay_cert	*cert, *tmpcert;
563 
564 	/* shutdown and remove relay */
565 	if (event_initialized(&rlay->rl_ev))
566 		event_del(&rlay->rl_ev);
567 	close(rlay->rl_s);
568 	TAILQ_REMOVE(env->sc_relays, rlay, rl_entry);
569 
570 	/* cleanup sessions */
571 	while ((con =
572 	    SPLAY_ROOT(&rlay->rl_sessions)) != NULL)
573 		relay_close(con, NULL, 0);
574 
575 	/* cleanup relay */
576 	if (rlay->rl_bev != NULL)
577 		bufferevent_free(rlay->rl_bev);
578 	if (rlay->rl_dstbev != NULL)
579 		bufferevent_free(rlay->rl_dstbev);
580 
581 	purge_key(&rlay->rl_tls_cakey, rlay->rl_conf.tls_cakey_len);
582 
583 	if (rlay->rl_tls_pkey != NULL) {
584 		EVP_PKEY_free(rlay->rl_tls_pkey);
585 		rlay->rl_tls_pkey = NULL;
586 	}
587 	if (rlay->rl_tls_cacertx509 != NULL) {
588 		X509_free(rlay->rl_tls_cacertx509);
589 		rlay->rl_tls_cacertx509 = NULL;
590 	}
591 	if (rlay->rl_tls_capkey != NULL) {
592 		EVP_PKEY_free(rlay->rl_tls_capkey);
593 		rlay->rl_tls_capkey = NULL;
594 	}
595 
596 	tls_free(rlay->rl_tls_ctx);
597 	tls_config_free(rlay->rl_tls_cfg);
598 	tls_config_free(rlay->rl_tls_client_cfg);
599 
600 	while ((rlt = TAILQ_FIRST(&rlay->rl_tables))) {
601 		TAILQ_REMOVE(&rlay->rl_tables, rlt, rlt_entry);
602 		free(rlt);
603 	}
604 
605 	TAILQ_FOREACH_SAFE(cert, env->sc_certs, cert_entry, tmpcert) {
606 		if (rlay->rl_conf.id != cert->cert_relayid)
607 			continue;
608 		if (cert->cert_fd != -1)
609 			close(cert->cert_fd);
610 		if (cert->cert_key_fd != -1)
611 			close(cert->cert_key_fd);
612 		if (cert->cert_ocsp_fd != -1)
613 			close(cert->cert_ocsp_fd);
614 		if (cert->cert_pkey != NULL)
615 			EVP_PKEY_free(cert->cert_pkey);
616 		TAILQ_REMOVE(env->sc_certs, cert, cert_entry);
617 		free(cert);
618 	}
619 
620 	free(rlay);
621 }
622 
623 struct kv *
kv_add(struct kvtree * keys,char * key,char * value,int unique)624 kv_add(struct kvtree *keys, char *key, char *value, int unique)
625 {
626 	struct kv	*kv, *oldkv;
627 
628 	if (key == NULL)
629 		return (NULL);
630 	if ((kv = calloc(1, sizeof(*kv))) == NULL)
631 		return (NULL);
632 	if ((kv->kv_key = strdup(key)) == NULL)
633 		goto fail;
634 	if (value != NULL &&
635 	    (kv->kv_value = strdup(value)) == NULL)
636 		goto fail;
637 	TAILQ_INIT(&kv->kv_children);
638 
639 	if ((oldkv = RB_INSERT(kvtree, keys, kv)) != NULL) {
640 		/*
641 		 * return error if the key should occur only once,
642 		 * or add it to a list attached to the key's node.
643 		 */
644 		if (unique)
645 			goto fail;
646 		TAILQ_INSERT_TAIL(&oldkv->kv_children, kv, kv_entry);
647 		kv->kv_parent = oldkv;
648 	}
649 
650 	return (kv);
651  fail:
652 	free(kv->kv_key);
653 	free(kv->kv_value);
654 	free(kv);
655 	return (NULL);
656 }
657 
658 int
kv_set(struct kv * kv,char * fmt,...)659 kv_set(struct kv *kv, char *fmt, ...)
660 {
661 	va_list		  ap;
662 	char		*value = NULL;
663 	struct kv	*ckv;
664 	int		 ret;
665 
666 	va_start(ap, fmt);
667 	ret = vasprintf(&value, fmt, ap);
668 	va_end(ap);
669  	if (ret == -1)
670 		return (-1);
671 
672 	/* Remove all children */
673 	while ((ckv = TAILQ_FIRST(&kv->kv_children)) != NULL) {
674 		TAILQ_REMOVE(&kv->kv_children, ckv, kv_entry);
675 		kv_free(ckv);
676 		free(ckv);
677 	}
678 
679 	/* Set the new value */
680 	free(kv->kv_value);
681 	kv->kv_value = value;
682 
683 	return (0);
684 }
685 
686 int
kv_setkey(struct kv * kv,char * fmt,...)687 kv_setkey(struct kv *kv, char *fmt, ...)
688 {
689 	va_list  ap;
690 	char	*key = NULL;
691 	int	 ret;
692 
693 	va_start(ap, fmt);
694 	ret = vasprintf(&key, fmt, ap);
695 	va_end(ap);
696 	if (ret == -1)
697 		return (-1);
698 
699 	free(kv->kv_key);
700 	kv->kv_key = key;
701 
702 	return (0);
703 }
704 
705 void
kv_delete(struct kvtree * keys,struct kv * kv)706 kv_delete(struct kvtree *keys, struct kv *kv)
707 {
708 	struct kv	*ckv;
709 
710 	RB_REMOVE(kvtree, keys, kv);
711 
712 	/* Remove all children */
713 	while ((ckv = TAILQ_FIRST(&kv->kv_children)) != NULL) {
714 		TAILQ_REMOVE(&kv->kv_children, ckv, kv_entry);
715 		kv_free(ckv);
716 		free(ckv);
717 	}
718 
719 	kv_free(kv);
720 	free(kv);
721 }
722 
723 struct kv *
kv_extend(struct kvtree * keys,struct kv * kv,char * value)724 kv_extend(struct kvtree *keys, struct kv *kv, char *value)
725 {
726 	char		*newvalue;
727 
728 	if (kv == NULL) {
729 		return (NULL);
730 	} else if (kv->kv_value != NULL) {
731 		if (asprintf(&newvalue, "%s%s", kv->kv_value, value) == -1)
732 			return (NULL);
733 
734 		free(kv->kv_value);
735 		kv->kv_value = newvalue;
736 	} else if ((kv->kv_value = strdup(value)) == NULL)
737 		return (NULL);
738 
739 	return (kv);
740 }
741 
742 void
kv_purge(struct kvtree * keys)743 kv_purge(struct kvtree *keys)
744 {
745 	struct kv	*kv;
746 
747 	while ((kv = RB_MIN(kvtree, keys)) != NULL)
748 		kv_delete(keys, kv);
749 }
750 
751 void
kv_free(struct kv * kv)752 kv_free(struct kv *kv)
753 {
754 	/*
755 	 * This function does not clear memory referenced by
756 	 * kv_children or stuff on the tailqs. Use kv_delete() instead.
757 	 */
758 
759 	free(kv->kv_key);
760 	free(kv->kv_value);
761 	memset(kv, 0, sizeof(*kv));
762 }
763 
764 struct kv *
kv_inherit(struct kv * dst,struct kv * src)765 kv_inherit(struct kv *dst, struct kv *src)
766 {
767 	memset(dst, 0, sizeof(*dst));
768 	memcpy(dst, src, sizeof(*dst));
769 	TAILQ_INIT(&dst->kv_children);
770 
771 	if (src->kv_key != NULL) {
772 		if ((dst->kv_key = strdup(src->kv_key)) == NULL) {
773 			kv_free(dst);
774 			return (NULL);
775 		}
776 	}
777 	if (src->kv_value != NULL) {
778 		if ((dst->kv_value = strdup(src->kv_value)) == NULL) {
779 			kv_free(dst);
780 			return (NULL);
781 		}
782 	}
783 
784 	if (src->kv_match != NULL)
785 		dst->kv_match = src->kv_match;
786 	if (src->kv_matchtree != NULL)
787 		dst->kv_matchtree = src->kv_matchtree;
788 
789 	return (dst);
790 }
791 
792 int
kv_log(struct rsession * con,struct kv * kv,u_int16_t labelid,enum direction dir)793 kv_log(struct rsession *con, struct kv *kv, u_int16_t labelid,
794     enum direction dir)
795 {
796 	char	*msg;
797 
798 	if (con->se_log == NULL)
799 		return (0);
800 	if (asprintf(&msg, " %s%s%s%s%s%s%s",
801 	    dir == RELAY_DIR_REQUEST ? "[" : "{",
802 	    labelid == 0 ? "" : label_id2name(labelid),
803 	    labelid == 0 ? "" : ", ",
804 	    kv->kv_key == NULL ? "(unknown)" : kv->kv_key,
805 	    kv->kv_value == NULL ? "" : ": ",
806 	    kv->kv_value == NULL ? "" : kv->kv_value,
807 	    dir == RELAY_DIR_REQUEST ? "]" : "}") == -1)
808 		return (-1);
809 	if (evbuffer_add(con->se_log, msg, strlen(msg)) == -1) {
810 		free(msg);
811 		return (-1);
812 	}
813 	free(msg);
814 	con->se_haslog = 1;
815 	return (0);
816 }
817 
818 struct kv *
kv_find(struct kvtree * keys,struct kv * kv)819 kv_find(struct kvtree *keys, struct kv *kv)
820 {
821 	struct kv	*match;
822 	const char	*key;
823 
824 	if (kv->kv_flags & KV_FLAG_GLOBBING) {
825 		/* Test header key using shell globbing rules */
826 		key = kv->kv_key == NULL ? "" : kv->kv_key;
827 		RB_FOREACH(match, kvtree, keys) {
828 			if (fnmatch(key, match->kv_key, FNM_CASEFOLD) == 0)
829 				break;
830 		}
831 	} else {
832 		/* Fast tree-based lookup only works without globbing */
833 		match = RB_FIND(kvtree, keys, kv);
834 	}
835 
836 	return (match);
837 }
838 
839 struct kv *
kv_find_value(struct kvtree * keys,char * key,const char * value,const char * delim)840 kv_find_value(struct kvtree *keys, char *key, const char *value,
841     const char *delim)
842 {
843 	struct kv	*match, kv;
844 	char		*val = NULL, *next, *ptr;
845 	size_t		 len;
846 
847 	kv.kv_key = key;
848 	if ((match = RB_FIND(kvtree, keys, &kv)) == NULL)
849 		return (NULL);
850 
851 	if (match->kv_value == NULL)
852 		return (NULL);
853 
854 	if (delim == NULL) {
855 		if (strcasecmp(match->kv_value, value) == 0)
856 			goto done;
857 	} else {
858 		if ((val = strdup(match->kv_value)) == NULL)
859 			return (NULL);
860 		for (next = ptr = val; ptr != NULL;
861 		    ptr = strsep(&next, delim)) {
862 			/* strip whitespace */
863 			ptr += strspn(ptr, " \t");
864 			len = strcspn(ptr, " \t");
865 			if (strncasecmp(ptr, value, len) == 0)
866 				goto done;
867 		}
868 	}
869 
870 	/* not matched */
871 	match = NULL;
872  done:
873 #ifdef DEBUG
874 	if (match != NULL)
875 		DPRINTF("%s: matched %s: %s", __func__, key, value);
876 #endif
877 	free(val);
878 	return (match);
879 }
880 
881 int
kv_cmp(struct kv * a,struct kv * b)882 kv_cmp(struct kv *a, struct kv *b)
883 {
884 	return (strcasecmp(a->kv_key, b->kv_key));
885 }
886 
887 RB_GENERATE(kvtree, kv, kv_node, kv_cmp);
888 
889 int
rule_add(struct protocol * proto,struct relay_rule * rule,const char * rulefile)890 rule_add(struct protocol *proto, struct relay_rule *rule, const char *rulefile)
891 {
892 	struct relay_rule	*r = NULL;
893 	struct kv		*kv = NULL;
894 	FILE			*fp = NULL;
895 	char			 buf[BUFSIZ];
896 	int			 ret = -1;
897 	u_int			 i;
898 
899 	for (i = 0; i < KEY_TYPE_MAX; i++) {
900 		kv = &rule->rule_kv[i];
901 		if (kv->kv_type != i)
902 			continue;
903 
904 		switch (kv->kv_option) {
905 		case KEY_OPTION_LOG:
906 			/* log action needs a key or a file to be specified */
907 			if (kv->kv_key == NULL && rulefile == NULL &&
908 			    (kv->kv_key = strdup("*")) == NULL)
909 				goto fail;
910 			break;
911 		default:
912 			break;
913 		}
914 
915 		switch (kv->kv_type) {
916 		case KEY_TYPE_QUERY:
917 		case KEY_TYPE_PATH:
918 		case KEY_TYPE_URL:
919 			if (rule->rule_dir != RELAY_DIR_REQUEST)
920 				goto fail;
921 			break;
922 		default:
923 			break;
924 		}
925 
926 		if (kv->kv_value != NULL && strchr(kv->kv_value, '$') != NULL)
927 			kv->kv_flags |= KV_FLAG_MACRO;
928 		if (kv->kv_key != NULL && strpbrk(kv->kv_key, "*?[") != NULL)
929 			kv->kv_flags |= KV_FLAG_GLOBBING;
930 	}
931 
932 	if (rulefile == NULL) {
933 		TAILQ_INSERT_TAIL(&proto->rules, rule, rule_entry);
934 		return (0);
935 	}
936 
937 	if ((fp = fopen(rulefile, "r")) == NULL)
938 		goto fail;
939 
940 	while (fgets(buf, sizeof(buf), fp) != NULL) {
941 		/* strip whitespace and newline characters */
942 		buf[strcspn(buf, "\r\n\t ")] = '\0';
943 		if (!strlen(buf) || buf[0] == '#')
944 			continue;
945 
946 		if ((r = rule_inherit(rule)) == NULL)
947 			goto fail;
948 
949 		for (i = 0; i < KEY_TYPE_MAX; i++) {
950 			kv = &r->rule_kv[i];
951 			if (kv->kv_type != i)
952 				continue;
953 			free(kv->kv_key);
954 			if ((kv->kv_key = strdup(buf)) == NULL) {
955 				rule_free(r);
956 				free(r);
957 				goto fail;
958 			}
959 		}
960 
961 		TAILQ_INSERT_TAIL(&proto->rules, r, rule_entry);
962 	}
963 
964 	ret = 0;
965 	rule_free(rule);
966 	free(rule);
967 
968  fail:
969 	if (fp != NULL)
970 		fclose(fp);
971 	return (ret);
972 }
973 
974 struct relay_rule *
rule_inherit(struct relay_rule * rule)975 rule_inherit(struct relay_rule *rule)
976 {
977 	struct relay_rule	*r;
978 	u_int			 i;
979 	struct kv		*kv;
980 
981 	if ((r = calloc(1, sizeof(*r))) == NULL)
982 		return (NULL);
983 	memcpy(r, rule, sizeof(*r));
984 
985 	for (i = 0; i < KEY_TYPE_MAX; i++) {
986 		kv = &rule->rule_kv[i];
987 		if (kv->kv_type != i)
988 			continue;
989 		if (kv_inherit(&r->rule_kv[i], kv) == NULL) {
990 			free(r);
991 			return (NULL);
992 		}
993 	}
994 
995 	if (r->rule_label > 0)
996 		label_ref(r->rule_label);
997 	if (r->rule_tag > 0)
998 		tag_ref(r->rule_tag);
999 	if (r->rule_tagged > 0)
1000 		tag_ref(r->rule_tagged);
1001 
1002 	return (r);
1003 }
1004 
1005 void
rule_free(struct relay_rule * rule)1006 rule_free(struct relay_rule *rule)
1007 {
1008 	u_int	i;
1009 
1010 	for (i = 0; i < KEY_TYPE_MAX; i++)
1011 		kv_free(&rule->rule_kv[i]);
1012 	if (rule->rule_label > 0)
1013 		label_unref(rule->rule_label);
1014 	if (rule->rule_tag > 0)
1015 		tag_unref(rule->rule_tag);
1016 	if (rule->rule_tagged > 0)
1017 		tag_unref(rule->rule_tagged);
1018 }
1019 
1020 void
rule_delete(struct relay_rules * rules,struct relay_rule * rule)1021 rule_delete(struct relay_rules *rules, struct relay_rule *rule)
1022 {
1023 	TAILQ_REMOVE(rules, rule, rule_entry);
1024 	rule_free(rule);
1025 	free(rule);
1026 }
1027 
1028 void
rule_settable(struct relay_rules * rules,struct relay_table * rlt)1029 rule_settable(struct relay_rules *rules, struct relay_table *rlt)
1030 {
1031 	struct relay_rule	*r;
1032 	char			 pname[TABLE_NAME_SIZE];
1033 
1034 	if (rlt->rlt_table == NULL || strlcpy(pname, rlt->rlt_table->conf.name,
1035 	    sizeof(pname)) >= sizeof(pname))
1036 		return;
1037 
1038 	pname[strcspn(pname, ":")] = '\0';
1039 
1040 	TAILQ_FOREACH(r, rules, rule_entry) {
1041 		if (r->rule_tablename[0] &&
1042 		    strcmp(pname, r->rule_tablename) == 0)
1043 			r->rule_table = rlt;
1044 	}
1045 }
1046 
1047 /*
1048  * Utility functions
1049  */
1050 
1051 struct host *
host_find(struct relayd * env,objid_t id)1052 host_find(struct relayd *env, objid_t id)
1053 {
1054 	struct table	*table;
1055 	struct host	*host;
1056 
1057 	TAILQ_FOREACH(table, env->sc_tables, entry)
1058 		TAILQ_FOREACH(host, &table->hosts, entry)
1059 			if (host->conf.id == id)
1060 				return (host);
1061 	return (NULL);
1062 }
1063 
1064 struct table *
table_find(struct relayd * env,objid_t id)1065 table_find(struct relayd *env, objid_t id)
1066 {
1067 	struct table	*table;
1068 
1069 	TAILQ_FOREACH(table, env->sc_tables, entry)
1070 		if (table->conf.id == id)
1071 			return (table);
1072 	return (NULL);
1073 }
1074 
1075 struct rdr *
rdr_find(struct relayd * env,objid_t id)1076 rdr_find(struct relayd *env, objid_t id)
1077 {
1078 	struct rdr	*rdr;
1079 
1080 	TAILQ_FOREACH(rdr, env->sc_rdrs, entry)
1081 		if (rdr->conf.id == id)
1082 			return (rdr);
1083 	return (NULL);
1084 }
1085 
1086 struct relay *
relay_find(struct relayd * env,objid_t id)1087 relay_find(struct relayd *env, objid_t id)
1088 {
1089 	struct relay	*rlay;
1090 
1091 	TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
1092 		if (rlay->rl_conf.id == id)
1093 			return (rlay);
1094 	return (NULL);
1095 }
1096 
1097 struct protocol *
proto_find(struct relayd * env,objid_t id)1098 proto_find(struct relayd *env, objid_t id)
1099 {
1100 	struct protocol	*p;
1101 
1102 	TAILQ_FOREACH(p, env->sc_protos, entry)
1103 		if (p->id == id)
1104 			return (p);
1105 	return (NULL);
1106 }
1107 
1108 struct rsession *
session_find(struct relayd * env,objid_t id)1109 session_find(struct relayd *env, objid_t id)
1110 {
1111 	struct relay		*rlay;
1112 	struct rsession		*con;
1113 
1114 	TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
1115 		SPLAY_FOREACH(con, session_tree, &rlay->rl_sessions)
1116 			if (con->se_id == id)
1117 				return (con);
1118 	return (NULL);
1119 }
1120 
1121 struct netroute *
route_find(struct relayd * env,objid_t id)1122 route_find(struct relayd *env, objid_t id)
1123 {
1124 	struct netroute	*nr;
1125 
1126 	TAILQ_FOREACH(nr, env->sc_routes, nr_route)
1127 		if (nr->nr_conf.id == id)
1128 			return (nr);
1129 	return (NULL);
1130 }
1131 
1132 struct router *
router_find(struct relayd * env,objid_t id)1133 router_find(struct relayd *env, objid_t id)
1134 {
1135 	struct router	*rt;
1136 
1137 	TAILQ_FOREACH(rt, env->sc_rts, rt_entry)
1138 		if (rt->rt_conf.id == id)
1139 			return (rt);
1140 	return (NULL);
1141 }
1142 
1143 struct host *
host_findbyname(struct relayd * env,const char * name)1144 host_findbyname(struct relayd *env, const char *name)
1145 {
1146 	struct table	*table;
1147 	struct host	*host;
1148 
1149 	TAILQ_FOREACH(table, env->sc_tables, entry)
1150 		TAILQ_FOREACH(host, &table->hosts, entry)
1151 			if (strcmp(host->conf.name, name) == 0)
1152 				return (host);
1153 	return (NULL);
1154 }
1155 
1156 struct table *
table_findbyname(struct relayd * env,const char * name)1157 table_findbyname(struct relayd *env, const char *name)
1158 {
1159 	struct table	*table;
1160 
1161 	TAILQ_FOREACH(table, env->sc_tables, entry)
1162 		if (strcmp(table->conf.name, name) == 0)
1163 			return (table);
1164 	return (NULL);
1165 }
1166 
1167 struct table *
table_findbyconf(struct relayd * env,struct table * tb)1168 table_findbyconf(struct relayd *env, struct table *tb)
1169 {
1170 	struct table		*table;
1171 	struct table_config	 a, b;
1172 
1173 	bcopy(&tb->conf, &a, sizeof(a));
1174 	a.id = a.rdrid = 0;
1175 	a.flags &= ~(F_USED|F_BACKUP);
1176 
1177 	TAILQ_FOREACH(table, env->sc_tables, entry) {
1178 		bcopy(&table->conf, &b, sizeof(b));
1179 		b.id = b.rdrid = 0;
1180 		b.flags &= ~(F_USED|F_BACKUP);
1181 
1182 		/*
1183 		 * Compare two tables and return the existing table if
1184 		 * the configuration seems to be the same.
1185 		 */
1186 		if (bcmp(&a, &b, sizeof(b)) == 0 &&
1187 		    ((tb->sendbuf == NULL && table->sendbuf == NULL) ||
1188 		    (tb->sendbuf != NULL && table->sendbuf != NULL &&
1189 		    strcmp(tb->sendbuf, table->sendbuf) == 0)))
1190 			return (table);
1191 	}
1192 	return (NULL);
1193 }
1194 
1195 struct rdr *
rdr_findbyname(struct relayd * env,const char * name)1196 rdr_findbyname(struct relayd *env, const char *name)
1197 {
1198 	struct rdr	*rdr;
1199 
1200 	TAILQ_FOREACH(rdr, env->sc_rdrs, entry)
1201 		if (strcmp(rdr->conf.name, name) == 0)
1202 			return (rdr);
1203 	return (NULL);
1204 }
1205 
1206 struct relay *
relay_findbyname(struct relayd * env,const char * name)1207 relay_findbyname(struct relayd *env, const char *name)
1208 {
1209 	struct relay	*rlay;
1210 
1211 	TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
1212 		if (strcmp(rlay->rl_conf.name, name) == 0)
1213 			return (rlay);
1214 	return (NULL);
1215 }
1216 
1217 struct relay *
relay_findbyaddr(struct relayd * env,struct relay_config * rc)1218 relay_findbyaddr(struct relayd *env, struct relay_config *rc)
1219 {
1220 	struct relay	*rlay;
1221 
1222 	TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
1223 		if (bcmp(&rlay->rl_conf.ss, &rc->ss, sizeof(rc->ss)) == 0 &&
1224 		    rlay->rl_conf.port == rc->port)
1225 			return (rlay);
1226 	return (NULL);
1227 }
1228 
1229 EVP_PKEY *
pkey_find(struct relayd * env,char * hash)1230 pkey_find(struct relayd *env, char * hash)
1231 {
1232 	struct ca_pkey	*pkey;
1233 
1234 	TAILQ_FOREACH(pkey, env->sc_pkeys, pkey_entry)
1235 		if (strcmp(hash, pkey->pkey_hash) == 0)
1236 			return (pkey->pkey);
1237 	return (NULL);
1238 }
1239 
1240 struct ca_pkey *
pkey_add(struct relayd * env,EVP_PKEY * pkey,char * hash)1241 pkey_add(struct relayd *env, EVP_PKEY *pkey, char *hash)
1242 {
1243 	struct ca_pkey	*ca_pkey;
1244 
1245 	if (env->sc_pkeys == NULL)
1246 		fatalx("pkeys");
1247 
1248 	if ((ca_pkey = calloc(1, sizeof(*ca_pkey))) == NULL)
1249 		return (NULL);
1250 
1251 	ca_pkey->pkey = pkey;
1252 	if (strlcpy(ca_pkey->pkey_hash, hash, sizeof(ca_pkey->pkey_hash)) >=
1253 	    sizeof(ca_pkey->pkey_hash)) {
1254 		free(ca_pkey);
1255 		return (NULL);
1256 	}
1257 
1258 	TAILQ_INSERT_TAIL(env->sc_pkeys, ca_pkey, pkey_entry);
1259 
1260 	return (ca_pkey);
1261 }
1262 
1263 struct relay_cert *
cert_add(struct relayd * env,objid_t id)1264 cert_add(struct relayd *env, objid_t id)
1265 {
1266 	static objid_t		 last_cert_id = 0;
1267 	struct relay_cert	*cert;
1268 
1269 	if ((cert = calloc(1, sizeof(*cert))) == NULL)
1270 		return (NULL);
1271 
1272 	if (id == 0)
1273 		id = ++last_cert_id;
1274 	if (id == INT_MAX) {
1275 		log_warnx("too many tls keypairs defined");
1276 		free(cert);
1277 		return (NULL);
1278 	}
1279 
1280 	cert->cert_id = id;
1281 	cert->cert_fd = -1;
1282 	cert->cert_key_fd = -1;
1283 	cert->cert_ocsp_fd = -1;
1284 
1285 	TAILQ_INSERT_TAIL(env->sc_certs, cert, cert_entry);
1286 
1287 	return (cert);
1288 }
1289 
1290 struct relay_cert *
cert_find(struct relayd * env,objid_t id)1291 cert_find(struct relayd *env, objid_t id)
1292 {
1293 	struct relay_cert	*cert;
1294 
1295 	TAILQ_FOREACH(cert, env->sc_certs, cert_entry)
1296 		if (cert->cert_id == id)
1297 			return (cert);
1298 	return (NULL);
1299 }
1300 
1301 char *
relay_load_fd(int fd,off_t * len)1302 relay_load_fd(int fd, off_t *len)
1303 {
1304 	char		*buf = NULL;
1305 	struct stat	 st;
1306 	off_t		 size;
1307 	ssize_t		 rv;
1308 	int		 err;
1309 
1310 	if (fstat(fd, &st) != 0)
1311 		goto fail;
1312 	size = st.st_size;
1313 	if ((buf = calloc(1, size + 1)) == NULL)
1314 		goto fail;
1315 	if ((rv = pread(fd, buf, size, 0)) != size)
1316 		goto fail;
1317 
1318 	close(fd);
1319 
1320 	*len = size;
1321 	return (buf);
1322 
1323  fail:
1324 	err = errno;
1325 	free(buf);
1326 	close(fd);
1327 	errno = err;
1328 	return (NULL);
1329 }
1330 
1331 int
relay_load_certfiles(struct relayd * env,struct relay * rlay,const char * name)1332 relay_load_certfiles(struct relayd *env, struct relay *rlay, const char *name)
1333 {
1334 	char	 certfile[PATH_MAX];
1335 	char	 hbuf[PATH_MAX];
1336 	struct protocol *proto = rlay->rl_proto;
1337 	struct relay_cert *cert;
1338 	int	 useport = htons(rlay->rl_conf.port);
1339 	int	 cert_fd = -1, key_fd = -1, ocsp_fd = -1;
1340 
1341 	if (rlay->rl_conf.flags & F_TLSCLIENT) {
1342 		if (strlen(proto->tlsca) && rlay->rl_tls_ca_fd == -1) {
1343 			if ((rlay->rl_tls_ca_fd =
1344 			    open(proto->tlsca, O_RDONLY)) == -1)
1345 				return (-1);
1346 			log_debug("%s: using ca %s", __func__, proto->tlsca);
1347 		}
1348 		if (strlen(proto->tlscacert) && rlay->rl_tls_cacert_fd == -1) {
1349 			if ((rlay->rl_tls_cacert_fd =
1350 			    open(proto->tlscacert, O_RDONLY)) == -1)
1351 				return (-1);
1352 			log_debug("%s: using ca certificate %s", __func__,
1353 			    proto->tlscacert);
1354 		}
1355 		if (strlen(proto->tlscakey) && !rlay->rl_conf.tls_cakey_len &&
1356 		    proto->tlscapass != NULL) {
1357 			if ((rlay->rl_tls_cakey =
1358 			    ssl_load_key(env, proto->tlscakey,
1359 			    &rlay->rl_conf.tls_cakey_len,
1360 			    proto->tlscapass)) == NULL)
1361 				return (-1);
1362 			log_debug("%s: using ca key %s", __func__,
1363 			    proto->tlscakey);
1364 		}
1365 	}
1366 
1367 	if ((rlay->rl_conf.flags & F_TLS) == 0)
1368 		return (0);
1369 
1370 	if (strlen(proto->tlsclientca) && rlay->rl_tls_client_ca_fd == -1) {
1371 		if ((rlay->rl_tls_client_ca_fd =
1372 		    open(proto->tlsclientca, O_RDONLY)) == -1)
1373 			return (-1);
1374 		log_debug("%s: using client ca %s", __func__,
1375 		    proto->tlsclientca);
1376 	}
1377 
1378 	if (name == NULL &&
1379 	    print_host(&rlay->rl_conf.ss, hbuf, sizeof(hbuf)) == NULL)
1380 		goto fail;
1381 	else if (name != NULL &&
1382 	    strlcpy(hbuf, name, sizeof(hbuf)) >= sizeof(hbuf))
1383 		goto fail;
1384 
1385 	if (snprintf(certfile, sizeof(certfile),
1386 	    "/etc/ssl/%s:%u.crt", hbuf, useport) == -1)
1387 		goto fail;
1388 	if ((cert_fd = open(certfile, O_RDONLY)) == -1) {
1389 		if (snprintf(certfile, sizeof(certfile),
1390 		    "/etc/ssl/%s.crt", hbuf) == -1)
1391 			goto fail;
1392 		if ((cert_fd = open(certfile, O_RDONLY)) == -1)
1393 			goto fail;
1394 		useport = 0;
1395 	}
1396 	log_debug("%s: using certificate %s", __func__, certfile);
1397 
1398 	if (useport) {
1399 		if (snprintf(certfile, sizeof(certfile),
1400 		    "/etc/ssl/private/%s:%u.key", hbuf, useport) == -1)
1401 			goto fail;
1402 	} else {
1403 		if (snprintf(certfile, sizeof(certfile),
1404 		    "/etc/ssl/private/%s.key", hbuf) == -1)
1405 			goto fail;
1406 	}
1407 	if ((key_fd = open(certfile, O_RDONLY)) == -1)
1408 		goto fail;
1409 	log_debug("%s: using private key %s", __func__, certfile);
1410 
1411 	if (useport) {
1412 		if (snprintf(certfile, sizeof(certfile),
1413 		    "/etc/ssl/%s:%u.ocsp", hbuf, useport) == -1)
1414 			goto fail;
1415 	} else {
1416 		if (snprintf(certfile, sizeof(certfile),
1417 		    "/etc/ssl/%s.ocsp", hbuf) == -1)
1418 			goto fail;
1419 	}
1420 	if ((ocsp_fd = open(certfile, O_RDONLY)) != -1)
1421 		log_debug("%s: using OCSP staple file %s", __func__, certfile);
1422 
1423 	if ((cert = cert_add(env, 0)) == NULL)
1424 		goto fail;
1425 
1426 	cert->cert_relayid = rlay->rl_conf.id;
1427 	cert->cert_fd = cert_fd;
1428 	cert->cert_key_fd = key_fd;
1429 	cert->cert_ocsp_fd = ocsp_fd;
1430 
1431 	return (0);
1432 
1433  fail:
1434 	if (cert_fd != -1)
1435 		close(cert_fd);
1436 	if (key_fd != -1)
1437 		close(key_fd);
1438 	if (ocsp_fd != -1)
1439 		close(ocsp_fd);
1440 
1441 	return (-1);
1442 }
1443 
1444 void
event_again(struct event * ev,int fd,short event,void (* fn)(int,short,void *),struct timeval * start,struct timeval * end,void * arg)1445 event_again(struct event *ev, int fd, short event,
1446     void (*fn)(int, short, void *),
1447     struct timeval *start, struct timeval *end, void *arg)
1448 {
1449 	struct timeval tv_next, tv_now, tv;
1450 
1451 	getmonotime(&tv_now);
1452 	bcopy(end, &tv_next, sizeof(tv_next));
1453 	timersub(&tv_now, start, &tv_now);
1454 	timersub(&tv_next, &tv_now, &tv_next);
1455 
1456 	bzero(&tv, sizeof(tv));
1457 	if (timercmp(&tv_next, &tv, >))
1458 		bcopy(&tv_next, &tv, sizeof(tv));
1459 
1460 	event_del(ev);
1461 	event_set(ev, fd, event, fn, arg);
1462 	event_add(ev, &tv);
1463 }
1464 
1465 int
expand_string(char * label,size_t len,const char * srch,const char * repl)1466 expand_string(char *label, size_t len, const char *srch, const char *repl)
1467 {
1468 	char *tmp;
1469 	char *p, *q;
1470 
1471 	if ((tmp = calloc(1, len)) == NULL) {
1472 		log_debug("%s: calloc", __func__);
1473 		return (-1);
1474 	}
1475 	p = q = label;
1476 	while ((q = strstr(p, srch)) != NULL) {
1477 		*q = '\0';
1478 		if ((strlcat(tmp, p, len) >= len) ||
1479 		    (strlcat(tmp, repl, len) >= len)) {
1480 			log_debug("%s: string too long", __func__);
1481 			free(tmp);
1482 			return (-1);
1483 		}
1484 		q += strlen(srch);
1485 		p = q;
1486 	}
1487 	if (strlcat(tmp, p, len) >= len) {
1488 		log_debug("%s: string too long", __func__);
1489 		free(tmp);
1490 		return (-1);
1491 	}
1492 	(void)strlcpy(label, tmp, len);	/* always fits */
1493 	free(tmp);
1494 
1495 	return (0);
1496 }
1497 
1498 void
translate_string(char * str)1499 translate_string(char *str)
1500 {
1501 	char	*reader;
1502 	char	*writer;
1503 
1504 	reader = writer = str;
1505 
1506 	while (*reader) {
1507 		if (*reader == '\\') {
1508 			reader++;
1509 			switch (*reader) {
1510 			case 'n':
1511 				*writer++ = '\n';
1512 				break;
1513 			case 'r':
1514 				*writer++ = '\r';
1515 				break;
1516 			default:
1517 				*writer++ = *reader;
1518 			}
1519 		} else
1520 			*writer++ = *reader;
1521 		reader++;
1522 	}
1523 	*writer = '\0';
1524 }
1525 
1526 char *
digeststr(enum digest_type type,const u_int8_t * data,size_t len,char * buf)1527 digeststr(enum digest_type type, const u_int8_t *data, size_t len, char *buf)
1528 {
1529 	switch (type) {
1530 	case DIGEST_SHA1:
1531 		return (SHA1Data(data, len, buf));
1532 		break;
1533 	case DIGEST_MD5:
1534 		return (MD5Data(data, len, buf));
1535 		break;
1536 	default:
1537 		break;
1538 	}
1539 	return (NULL);
1540 }
1541 
1542 const char *
canonicalize_host(const char * host,char * name,size_t len)1543 canonicalize_host(const char *host, char *name, size_t len)
1544 {
1545 	struct sockaddr_in	 sin4;
1546 	struct sockaddr_in6	 sin6;
1547 	size_t			 i, j;
1548 	size_t			 plen;
1549 	char			 c;
1550 
1551 	if (len < 2)
1552 		goto fail;
1553 
1554 	/*
1555 	 * Canonicalize an IPv4/6 address
1556 	 */
1557 	if (inet_pton(AF_INET, host, &sin4) == 1)
1558 		return (inet_ntop(AF_INET, &sin4, name, len));
1559 	if (inet_pton(AF_INET6, host, &sin6) == 1)
1560 		return (inet_ntop(AF_INET6, &sin6, name, len));
1561 
1562 	/*
1563 	 * Canonicalize a hostname
1564 	 */
1565 
1566 	/* 1. remove repeated dots and convert upper case to lower case */
1567 	plen = strlen(host);
1568 	bzero(name, len);
1569 	for (i = j = 0; i < plen; i++) {
1570 		if (j >= (len - 1))
1571 			goto fail;
1572 		c = tolower((unsigned char)host[i]);
1573 		if ((c == '.') && (j == 0 || name[j - 1] == '.'))
1574 			continue;
1575 		name[j++] = c;
1576 	}
1577 
1578 	/* 2. remove trailing dots */
1579 	for (i = j; i > 0; i--) {
1580 		if (name[i - 1] != '.')
1581 			break;
1582 		name[i - 1] = '\0';
1583 		j--;
1584 	}
1585 	if (j <= 0)
1586 		goto fail;
1587 
1588 	return (name);
1589 
1590  fail:
1591 	errno = EINVAL;
1592 	return (NULL);
1593 }
1594 
1595 int
parse_url(const char * url,char ** protoptr,char ** hostptr,char ** pathptr)1596 parse_url(const char *url, char **protoptr, char **hostptr, char **pathptr)
1597 {
1598 	char	*p, *proto = NULL, *host = NULL, *path = NULL;
1599 
1600 	/* return error if it is not a URL */
1601 	if ((p = strstr(url, ":/")) == NULL ||
1602 	    (strcspn(url, ":/") != (size_t)(p - url)))
1603 		return (-1);
1604 
1605 	/* get protocol */
1606 	if ((proto = strdup(url)) == NULL)
1607 		goto fail;
1608 	p = proto + (p - url);
1609 
1610 	/* get host */
1611 	p += strspn(p, ":/");
1612 	if (*p == '\0' || (host = strdup(p)) == NULL)
1613 		goto fail;
1614 	*p = '\0';
1615 
1616 	/* find and copy path or default to "/" */
1617 	if ((p = strchr(host, '/')) == NULL)
1618 		p = "/";
1619 	if ((path = strdup(p)) == NULL)
1620 		goto fail;
1621 
1622 	/* strip path after host */
1623 	host[strcspn(host, "/")] = '\0';
1624 
1625 	DPRINTF("%s: %s proto %s, host %s, path %s", __func__,
1626 	    url, proto, host, path);
1627 
1628 	*protoptr = proto;
1629 	*hostptr = host;
1630 	*pathptr = path;
1631 
1632 	return (0);
1633 
1634  fail:
1635 	free(proto);
1636 	free(host);
1637 	free(path);
1638 	return (-1);
1639 }
1640 
1641 int
bindany(struct ctl_bindany * bnd)1642 bindany(struct ctl_bindany *bnd)
1643 {
1644 	int	s, v;
1645 
1646 	s = -1;
1647 	v = 1;
1648 
1649 	if (relay_socket_af(&bnd->bnd_ss, bnd->bnd_port) == -1)
1650 		goto fail;
1651 	if ((s = socket(bnd->bnd_ss.ss_family,
1652 	    bnd->bnd_proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM,
1653 	    bnd->bnd_proto)) == -1)
1654 		goto fail;
1655 	if (setsockopt(s, SOL_SOCKET, SO_BINDANY,
1656 	    &v, sizeof(v)) == -1)
1657 		goto fail;
1658 	if (bind(s, (struct sockaddr *)&bnd->bnd_ss,
1659 	    bnd->bnd_ss.ss_len) == -1)
1660 		goto fail;
1661 
1662 	return (s);
1663 
1664  fail:
1665 	if (s != -1)
1666 		close(s);
1667 	return (-1);
1668 }
1669 
1670 int
map6to4(struct sockaddr_storage * in6)1671 map6to4(struct sockaddr_storage *in6)
1672 {
1673 	struct sockaddr_storage	 out4;
1674 	struct sockaddr_in	*sin4 = (struct sockaddr_in *)&out4;
1675 	struct sockaddr_in6	*sin6 = (struct sockaddr_in6 *)in6;
1676 
1677 	bzero(sin4, sizeof(*sin4));
1678 	sin4->sin_len = sizeof(*sin4);
1679 	sin4->sin_family = AF_INET;
1680 	sin4->sin_port = sin6->sin6_port;
1681 
1682 	bcopy(&sin6->sin6_addr.s6_addr[12], &sin4->sin_addr.s_addr,
1683 	    sizeof(sin4->sin_addr));
1684 
1685 	if (sin4->sin_addr.s_addr == INADDR_ANY ||
1686 	    sin4->sin_addr.s_addr == INADDR_BROADCAST ||
1687 	    IN_MULTICAST(ntohl(sin4->sin_addr.s_addr)))
1688 		return (-1);
1689 
1690 	bcopy(&out4, in6, sizeof(*in6));
1691 
1692 	return (0);
1693 }
1694 
1695 int
map4to6(struct sockaddr_storage * in4,struct sockaddr_storage * map)1696 map4to6(struct sockaddr_storage *in4, struct sockaddr_storage *map)
1697 {
1698 	struct sockaddr_storage	 out6;
1699 	struct sockaddr_in	*sin4 = (struct sockaddr_in *)in4;
1700 	struct sockaddr_in6	*sin6 = (struct sockaddr_in6 *)&out6;
1701 	struct sockaddr_in6	*map6 = (struct sockaddr_in6 *)map;
1702 
1703 	if (sin4->sin_addr.s_addr == INADDR_ANY ||
1704 	    sin4->sin_addr.s_addr == INADDR_BROADCAST ||
1705 	    IN_MULTICAST(ntohl(sin4->sin_addr.s_addr)))
1706 		return (-1);
1707 
1708 	bcopy(map6, sin6, sizeof(*sin6));
1709 	sin6->sin6_len = sizeof(*sin6);
1710 	sin6->sin6_family = AF_INET6;
1711 	sin6->sin6_port = sin4->sin_port;
1712 
1713 	bcopy(&sin4->sin_addr.s_addr, &sin6->sin6_addr.s6_addr[12],
1714 	    sizeof(sin4->sin_addr));
1715 
1716 	bcopy(&out6, in4, sizeof(*in4));
1717 
1718 	return (0);
1719 }
1720 
1721 void
socket_rlimit(int maxfd)1722 socket_rlimit(int maxfd)
1723 {
1724 	struct rlimit	 rl;
1725 
1726 	if (getrlimit(RLIMIT_NOFILE, &rl) == -1)
1727 		fatal("%s: failed to get resource limit", __func__);
1728 	log_debug("%s: max open files %llu", __func__, rl.rlim_max);
1729 
1730 	/*
1731 	 * Allow the maximum number of open file descriptors for this
1732 	 * login class (which should be the class "daemon" by default).
1733 	 */
1734 	if (maxfd == -1)
1735 		rl.rlim_cur = rl.rlim_max;
1736 	else
1737 		rl.rlim_cur = MAXIMUM(rl.rlim_max, (rlim_t)maxfd);
1738 	if (setrlimit(RLIMIT_NOFILE, &rl) == -1)
1739 		fatal("%s: failed to set resource limit", __func__);
1740 }
1741 
1742 char *
get_string(u_int8_t * ptr,size_t len)1743 get_string(u_int8_t *ptr, size_t len)
1744 {
1745 	size_t	 i;
1746 
1747 	for (i = 0; i < len; i++)
1748 		if (!(isprint((unsigned char)ptr[i]) ||
1749 		    isspace((unsigned char)ptr[i])))
1750 			break;
1751 
1752 	return strndup(ptr, i);
1753 }
1754 
1755 void *
get_data(u_int8_t * ptr,size_t len)1756 get_data(u_int8_t *ptr, size_t len)
1757 {
1758 	u_int8_t	*data;
1759 
1760 	if ((data = malloc(len)) == NULL)
1761 		return (NULL);
1762 	memcpy(data, ptr, len);
1763 
1764 	return (data);
1765 }
1766 
1767 int
sockaddr_cmp(struct sockaddr * a,struct sockaddr * b,int prefixlen)1768 sockaddr_cmp(struct sockaddr *a, struct sockaddr *b, int prefixlen)
1769 {
1770 	struct sockaddr_in	*a4, *b4;
1771 	struct sockaddr_in6	*a6, *b6;
1772 	u_int32_t		 av[4], bv[4], mv[4];
1773 
1774 	if (a->sa_family == AF_UNSPEC || b->sa_family == AF_UNSPEC)
1775 		return (0);
1776 	else if (a->sa_family > b->sa_family)
1777 		return (1);
1778 	else if (a->sa_family < b->sa_family)
1779 		return (-1);
1780 
1781 	if (prefixlen == -1)
1782 		memset(&mv, 0xff, sizeof(mv));
1783 
1784 	switch (a->sa_family) {
1785 	case AF_INET:
1786 		a4 = (struct sockaddr_in *)a;
1787 		b4 = (struct sockaddr_in *)b;
1788 
1789 		av[0] = a4->sin_addr.s_addr;
1790 		bv[0] = b4->sin_addr.s_addr;
1791 		if (prefixlen != -1)
1792 			mv[0] = prefixlen2mask(prefixlen);
1793 
1794 		if ((av[0] & mv[0]) > (bv[0] & mv[0]))
1795 			return (1);
1796 		if ((av[0] & mv[0]) < (bv[0] & mv[0]))
1797 			return (-1);
1798 		break;
1799 	case AF_INET6:
1800 		a6 = (struct sockaddr_in6 *)a;
1801 		b6 = (struct sockaddr_in6 *)b;
1802 
1803 		memcpy(&av, &a6->sin6_addr.s6_addr, 16);
1804 		memcpy(&bv, &b6->sin6_addr.s6_addr, 16);
1805 		if (prefixlen != -1)
1806 			prefixlen2mask6(prefixlen, mv);
1807 
1808 		if ((av[3] & mv[3]) > (bv[3] & mv[3]))
1809 			return (1);
1810 		if ((av[3] & mv[3]) < (bv[3] & mv[3]))
1811 			return (-1);
1812 		if ((av[2] & mv[2]) > (bv[2] & mv[2]))
1813 			return (1);
1814 		if ((av[2] & mv[2]) < (bv[2] & mv[2]))
1815 			return (-1);
1816 		if ((av[1] & mv[1]) > (bv[1] & mv[1]))
1817 			return (1);
1818 		if ((av[1] & mv[1]) < (bv[1] & mv[1]))
1819 			return (-1);
1820 		if ((av[0] & mv[0]) > (bv[0] & mv[0]))
1821 			return (1);
1822 		if ((av[0] & mv[0]) < (bv[0] & mv[0]))
1823 			return (-1);
1824 		break;
1825 	}
1826 
1827 	return (0);
1828 }
1829 
1830 u_int32_t
prefixlen2mask(u_int8_t prefixlen)1831 prefixlen2mask(u_int8_t prefixlen)
1832 {
1833 	if (prefixlen == 0)
1834 		return (0);
1835 
1836 	if (prefixlen > 32)
1837 		prefixlen = 32;
1838 
1839 	return (htonl(0xffffffff << (32 - prefixlen)));
1840 }
1841 
1842 struct in6_addr *
prefixlen2mask6(u_int8_t prefixlen,u_int32_t * mask)1843 prefixlen2mask6(u_int8_t prefixlen, u_int32_t *mask)
1844 {
1845 	static struct in6_addr  s6;
1846 	int			i;
1847 
1848 	if (prefixlen > 128)
1849 		prefixlen = 128;
1850 
1851 	bzero(&s6, sizeof(s6));
1852 	for (i = 0; i < prefixlen / 8; i++)
1853 		s6.s6_addr[i] = 0xff;
1854 	i = prefixlen % 8;
1855 	if (i)
1856 		s6.s6_addr[prefixlen / 8] = 0xff00 >> i;
1857 
1858 	memcpy(mask, &s6, sizeof(s6));
1859 
1860 	return (&s6);
1861 }
1862 
1863 int
accept_reserve(int sockfd,struct sockaddr * addr,socklen_t * addrlen,int reserve,volatile int * counter)1864 accept_reserve(int sockfd, struct sockaddr *addr, socklen_t *addrlen,
1865     int reserve, volatile int *counter)
1866 {
1867 	int ret;
1868 	if (getdtablecount() + reserve +
1869 	    *counter >= getdtablesize()) {
1870 		errno = EMFILE;
1871 		return (-1);
1872 	}
1873 
1874 	if ((ret = accept4(sockfd, addr, addrlen, SOCK_NONBLOCK)) > -1) {
1875 		(*counter)++;
1876 		DPRINTF("%s: inflight incremented, now %d",__func__, *counter);
1877 	}
1878 	return (ret);
1879 }
1880 
1881 void
parent_tls_ticket_rekey(int fd,short events,void * arg)1882 parent_tls_ticket_rekey(int fd, short events, void *arg)
1883 {
1884 	static struct event	 rekeyev;
1885 	struct relayd		*env = arg;
1886 	struct timeval		 tv;
1887 	struct relay_ticket_key	 key;
1888 
1889 	log_debug("%s: rekeying tickets", __func__);
1890 
1891 	key.tt_keyrev = arc4random();
1892 	arc4random_buf(key.tt_key, sizeof(key.tt_key));
1893 
1894 	proc_compose_imsg(env->sc_ps, PROC_RELAY, -1, IMSG_TLSTICKET_REKEY,
1895 	    -1, -1, &key, sizeof(key));
1896 
1897 	evtimer_set(&rekeyev, parent_tls_ticket_rekey, env);
1898 	timerclear(&tv);
1899 	tv.tv_sec = TLS_SESSION_LIFETIME / 4;
1900 	evtimer_add(&rekeyev, &tv);
1901 }
1902