From a4156c64cb79cb5d587300c5fbfb6fbb59cb6796 Mon Sep 17 00:00:00 2001 From: rsadowski Date: Sun, 14 Jun 2026 08:51:11 +0000 Subject: [PATCH] relayd: read parent_dispatch_pfe() payloads via the imsg getters Use imsg_get_data() for the fixed-size messages and imsg_get_ibuf() for the variable-length IMSG_CTL_RELOAD path, taking the config name from the ibuf via ibuf_data()/ibuf_size(). Remove IMSG_SIZE_CHECK and IMSG_DATA_SIZE, no consumer left. OK claudio --- usr.sbin/relayd/relayd.c | 44 ++++++++++++++++++++++++++++------------ usr.sbin/relayd/relayd.h | 8 +------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/usr.sbin/relayd/relayd.c b/usr.sbin/relayd/relayd.c index 331c9114491..5fa2b7f50fd 100644 --- a/usr.sbin/relayd/relayd.c +++ b/usr.sbin/relayd/relayd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: relayd.c,v 1.199 2026/06/03 19:26:56 rsadowski Exp $ */ +/* $OpenBSD: relayd.c,v 1.200 2026/06/14 08:51:11 rsadowski Exp $ */ /* * Copyright (c) 2007 - 2016 Reyk Floeter @@ -399,36 +399,49 @@ parent_shutdown(struct relayd *env) int parent_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg) { + struct ibuf ibuf; struct privsep *ps = p->p_ps; struct relayd *env = ps->ps_env; struct ctl_demote demote; struct ctl_netroute crt; u_int v; char *str = NULL; + size_t s; switch (imsg->hdr.type) { case IMSG_DEMOTE: - IMSG_SIZE_CHECK(imsg, &demote); - memcpy(&demote, imsg->data, sizeof(demote)); + if (imsg_get_data(imsg, &demote, sizeof(demote)) == -1) { + log_warn("%s: imsg_get_data", __func__); + return (-1); + } demote.group[sizeof(demote.group) - 1] = '\0'; carp_demote_set(demote.group, demote.level); break; case IMSG_RTMSG: - IMSG_SIZE_CHECK(imsg, &crt); - memcpy(&crt, imsg->data, sizeof(crt)); + if (imsg_get_data(imsg, &crt, sizeof(crt)) == -1) { + log_warn("%s: imsg_get_data", __func__); + return (-1); + } crt.host.name[sizeof(crt.host.name) - 1] = '\0'; crt.rt.name[sizeof(crt.rt.name) - 1] = '\0'; crt.rt.label[sizeof(crt.rt.label) - 1] = '\0'; pfe_route(env, &crt); break; case IMSG_CTL_RESET: - IMSG_SIZE_CHECK(imsg, &v); - memcpy(&v, imsg->data, sizeof(v)); + if (imsg_get_data(imsg, &v, sizeof(v)) == -1) { + log_warn("%s: imsg_get_data", __func__); + return (-1); + } parent_reload(env, v, NULL); break; case IMSG_CTL_RELOAD: - if (IMSG_DATA_SIZE(imsg) > 0) - str = get_string(imsg->data, IMSG_DATA_SIZE(imsg)); + if (imsg_get_ibuf(imsg, &ibuf) != -1 && + (s = ibuf_size(&ibuf)) > 0) { + if ((str = get_string(ibuf_data(&ibuf), s)) == NULL) { + log_warn("%s: get_string", __func__); + return (-1); + } + } parent_reload(env, CONFIG_RELOAD, str); free(str); break; @@ -457,8 +470,10 @@ parent_dispatch_hce(int fd, struct privsep_proc *p, struct imsg *imsg) switch (imsg->hdr.type) { case IMSG_SCRIPT: - IMSG_SIZE_CHECK(imsg, &scr); - bcopy(imsg->data, &scr, sizeof(scr)); + if (imsg_get_data(imsg, &scr, sizeof(scr)) == -1) { + log_warn("%s: imsg_get_data", __func__); + return (-1); + } scr.name[sizeof(scr.name) - 1] = '\0'; scr.path[sizeof(scr.path) - 1] = '\0'; scr.retval = script_exec(env, &scr); @@ -484,8 +499,11 @@ parent_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg) switch (imsg->hdr.type) { case IMSG_BINDANY: - IMSG_SIZE_CHECK(imsg, &bnd); - bcopy(imsg->data, &bnd, sizeof(bnd)); + if (imsg_get_data(imsg, &bnd, sizeof(bnd)) == -1) { + log_warn("%s: imsg_get_data", __func__); + return (-1); + } + if (bnd.bnd_proc < 0 || bnd.bnd_proc > env->sc_conf.prefork_relay) fatalx("%s: invalid relay proc", __func__); switch (bnd.bnd_proto) { diff --git a/usr.sbin/relayd/relayd.h b/usr.sbin/relayd/relayd.h index ad4bd772611..f3c33938c0b 100644 --- a/usr.sbin/relayd/relayd.h +++ b/usr.sbin/relayd/relayd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: relayd.h,v 1.282 2026/06/14 08:45:02 rsadowski Exp $ */ +/* $OpenBSD: relayd.h,v 1.283 2026/06/14 08:51:11 rsadowski Exp $ */ /* * Copyright (c) 2006 - 2016 Reyk Floeter @@ -930,12 +930,6 @@ struct imsgev { short events; }; -#define IMSG_SIZE_CHECK(imsg, p) do { \ - if (IMSG_DATA_SIZE(imsg) < sizeof(*p)) \ - fatalx("bad length imsg received"); \ -} while (0) -#define IMSG_DATA_SIZE(imsg) ((imsg)->hdr.len - IMSG_HEADER_SIZE) - struct ctl_conn { TAILQ_ENTRY(ctl_conn) entry; u_int8_t flags;