Blame


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