Index | Thread | Search

From:
Rafael Sadowski <rafael@sizeofvoid.org>
Subject:
[2/7] relayd: use imsg_get_data() and imsg_get_type()
To:
tech@openbsd.org
Date:
Sun, 7 Jun 2026 09:00:15 +0200

Download raw body.

Thread
  • Rafael Sadowski:

    [2/7] relayd: use imsg_get_data() and imsg_get_type()

This is a series of commits for an imsg APIv2 rework in relayd. These
were committed and tested individually. They can be reviewed in their
entirety here:

gothub: https://rsadowski.gothub.org/?action=summary&headref=imsg_v2&path=relayd.git
PR: https://codeberg.org/rsadowski/relayd/pulls/1/files

commit 07fa9bca99ee3449460e7fa3e7207622056e62a9
Author: Rafael Sadowski <rafael@sizeofvoid.org>
Date:   Sat Jun 6 09:31:27 2026 +0200

    relayd: use imsg_get_data() and imsg_get_type()
    
    Replace IMSG_SIZE_CHECK() + memcpy()/bcopy() with imsg_get_data(),
    which does the length check and copy in one call, and read the message
    type via imsg_get_type() instead of imsg->hdr.type.

diff --git a/ca.c b/ca.c
index c4f527f..9d4fc65 100644
--- a/ca.c
+++ b/ca.c
@@ -193,7 +193,7 @@ ca_launch(void)
 int
 ca_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
 {
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_CFG_RELAY:
 		config_getrelay(env, imsg);
 		break;
@@ -226,7 +226,7 @@ ca_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 	struct iovec		 iov[2];
 	int			 c = 0;
 
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_CA_PRIVENC:
 	case IMSG_CA_PRIVDEC:
 		IMSG_SIZE_CHECK(imsg, (&cko));
@@ -244,7 +244,7 @@ ca_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 			iov[c].iov_base = &cko;
 			iov[c++].iov_len = sizeof(cko);
 			if (proc_composev_imsg(env->sc_ps, PROC_RELAY,
-			    cko.cko_proc, imsg->hdr.type, -1, -1, iov,
+			    cko.cko_proc, imsg_get_type(imsg), -1, -1, iov,
 			     c) == -1)
 				log_warn("%s: proc_composev_imsg", __func__);
 			break;
@@ -260,7 +260,7 @@ ca_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 		if ((to = calloc(1, cko.cko_tlen)) == NULL)
 			fatalx("%s: calloc", __func__);
 
-		switch (imsg->hdr.type) {
+		switch (imsg_get_type(imsg)) {
 		case IMSG_CA_PRIVENC:
 			cko.cko_tlen = RSA_private_encrypt(cko.cko_flen,
 			    from, to, rsa, cko.cko_padding);
@@ -285,7 +285,7 @@ ca_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 		}
 
 		if (proc_composev_imsg(env->sc_ps, PROC_RELAY, cko.cko_proc,
-		    imsg->hdr.type, -1, -1, iov, c) == -1)
+		    imsg_get_type(imsg), -1, -1, iov, c) == -1)
 			log_warn("%s: proc_composev_imsg", __func__);
 
 		free(to);
diff --git a/hce.c b/hce.c
index 6598fea..4b82687 100644
--- a/hce.c
+++ b/hce.c
@@ -289,7 +289,7 @@ hce_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
 	struct host		*host;
 	struct table		*table;
 
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_HOST_DISABLE:
 		memcpy(&id, imsg->data, sizeof(id));
 		if ((host = host_find(env, id)) == NULL)
@@ -342,10 +342,10 @@ hce_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
 {
 	struct ctl_script	 scr;
 
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_SCRIPT:
-		IMSG_SIZE_CHECK(imsg, &scr);
-		bcopy(imsg->data, &scr, sizeof(scr));
+		if (imsg_get_data(imsg, &scr, sizeof(scr)) == -1)
+			return (-1);
 		script_done(env, &scr);
 		break;
 	case IMSG_CFG_TABLE:
@@ -373,7 +373,7 @@ hce_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
 int
 hce_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 {
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	default:
 		break;
 	}
diff --git a/pfe.c b/pfe.c
index 3d4b363..0f865b8 100644
--- a/pfe.c
+++ b/pfe.c
@@ -126,10 +126,10 @@ pfe_dispatch_hce(int fd, struct privsep_proc *p, struct imsg *imsg)
 
 	control_imsg_forward(p->p_ps, imsg);
 
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_HOST_STATUS:
-		IMSG_SIZE_CHECK(imsg, &st);
-		memcpy(&st, imsg->data, sizeof(st));
+		if (imsg_get_data(imsg, &st, sizeof(st)) == -1)
+			return (-1);
 		if ((host = host_find(env, st.id)) == NULL)
 			fatalx("%s: invalid host id", __func__);
 		host->he = st.he;
@@ -199,7 +199,7 @@ pfe_dispatch_hce(int fd, struct privsep_proc *p, struct imsg *imsg)
 int
 pfe_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
 {
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_CFG_TABLE:
 		config_gettable(env, imsg);
 		break;
@@ -260,10 +260,10 @@ pfe_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 	int			 cid;
 	objid_t			 sid;
 
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_NATLOOK:
-		IMSG_SIZE_CHECK(imsg, &cnl);
-		bcopy(imsg->data, &cnl, sizeof(cnl));
+		if (imsg_get_data(imsg, &cnl, sizeof(cnl)) == -1)
+			return (-1);
 		if (cnl.proc > env->sc_conf.prefork_relay)
 			fatalx("%s: invalid relay proc", __func__);
 		if (natlook(env, &cnl) != 0)
@@ -272,8 +272,8 @@ pfe_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 		    IMSG_NATLOOK, -1, -1, &cnl, sizeof(cnl));
 		break;
 	case IMSG_STATISTICS:
-		IMSG_SIZE_CHECK(imsg, &crs);
-		bcopy(imsg->data, &crs, sizeof(crs));
+		if (imsg_get_data(imsg, &crs, sizeof(crs)) == -1)
+			return (-1);
 		if (crs.proc > env->sc_conf.prefork_relay)
 			fatalx("%s: invalid relay proc", __func__);
 		if ((rlay = relay_find(env, crs.id)) == NULL)
@@ -283,8 +283,8 @@ pfe_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 		    env->sc_conf.statinterval.tv_sec;
 		break;
 	case IMSG_CTL_SESSION:
-		IMSG_SIZE_CHECK(imsg, &con);
-		memcpy(&con, imsg->data, sizeof(con));
+		if (imsg_get_data(imsg, &con, sizeof(con)) == -1)
+			return (-1);
 		if ((c = control_connbyfd(con.se_cid)) == NULL) {
 			log_debug("%s: control connection %d not found",
 			    __func__, con.se_cid);
@@ -295,8 +295,8 @@ pfe_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 		    &con, sizeof(con));
 		break;
 	case IMSG_CTL_END:
-		IMSG_SIZE_CHECK(imsg, &cid);
-		memcpy(&cid, imsg->data, sizeof(cid));
+		if (imsg_get_data(imsg, &cid, sizeof(cid)) == -1)
+			return (-1);
 		if ((c = control_connbyfd(cid)) == NULL) {
 			log_debug("%s: control connection %d not found",
 			    __func__, cid);
@@ -312,10 +312,10 @@ pfe_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 		}
 		break;
 	case IMSG_SESS_PUBLISH:
-		IMSG_SIZE_CHECK(imsg, s);
 		if ((s = calloc(1, sizeof(*s))) == NULL)
 			return (0);		/* XXX */
-		memcpy(s, imsg->data, sizeof(*s));
+		if (imsg_get_data(imsg, s, sizeof(*s)) == -1)
+			return (-1);
 		TAILQ_FOREACH(t, &env->sc_sessions, se_entry) {
 			/* duplicate registration */
 			if (t->se_id == s->se_id) {
@@ -331,8 +331,8 @@ pfe_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
 			TAILQ_INSERT_TAIL(&env->sc_sessions, s, se_entry);
 		break;
 	case IMSG_SESS_UNPUBLISH:
-		IMSG_SIZE_CHECK(imsg, &sid);
-		memcpy(&sid, imsg->data, sizeof(sid));
+		if (imsg_get_data(imsg, &sid, sizeof(sid)) == -1)
+			return (-1);
 		TAILQ_FOREACH(s, &env->sc_sessions, se_entry)
 			if (s->se_id == sid)
 				break;
diff --git a/relay.c b/relay.c
index a035f99..2d62607 100644
--- a/relay.c
+++ b/relay.c
@@ -1868,7 +1868,7 @@ relay_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
 	objid_t			 id;
 	int			 cid;
 
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_HOST_DISABLE:
 		memcpy(&id, imsg->data, sizeof(id));
 		if ((host = host_find(env, id)) == NULL)
@@ -1907,8 +1907,8 @@ relay_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
 			host->up = HOST_UNKNOWN;
 		break;
 	case IMSG_HOST_STATUS:
-		IMSG_SIZE_CHECK(imsg, &st);
-		memcpy(&st, imsg->data, sizeof(st));
+		if (imsg_get_data(imsg, &st, sizeof(st)) == -1)
+			return (-1);
 		if ((host = host_find(env, st.id)) == NULL)
 			fatalx("%s: invalid host id", __func__);
 		if (host->flags & F_DISABLE)
@@ -1953,8 +1953,8 @@ relay_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
 		evtimer_add(&con->se_ev, &tv);
 		break;
 	case IMSG_CTL_SESSION:
-		IMSG_SIZE_CHECK(imsg, &cid);
-		memcpy(&cid, imsg->data, sizeof(cid));
+		if (imsg_get_data(imsg, &cid, sizeof(cid)) == -1)
+			return (-1);
 		TAILQ_FOREACH(rlay, env->sc_relays, rl_entry) {
 			SPLAY_FOREACH(con, session_tree,
 			    &rlay->rl_sessions) {
@@ -1977,11 +1977,11 @@ relay_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
 int
 relay_dispatch_ca(int fd, struct privsep_proc *p, struct imsg *imsg)
 {
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_CA_PRIVENC:
 	case IMSG_CA_PRIVDEC:
 		log_warnx("%s: priv%s result after timeout", __func__,
-		    imsg->hdr.type == IMSG_CA_PRIVENC ? "enc" : "dec");
+		    imsg_get_type(imsg) == IMSG_CA_PRIVENC ? "enc" : "dec");
 		return (0);
 	}
 
@@ -1991,13 +1991,12 @@ relay_dispatch_ca(int fd, struct privsep_proc *p, struct imsg *imsg)
 int
 relay_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
 {
-	struct relay_ticket_key	 ticket;
 	struct relay		*rlay;
 	struct rsession		*con;
 	struct timeval		 tv;
 	objid_t			 id;
 
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	case IMSG_BINDANY:
 		bcopy(imsg->data, &id, sizeof(id));
 		if ((con = session_find(env, id)) == NULL) {
@@ -2045,8 +2044,9 @@ relay_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
 		config_getreset(env, imsg);
 		break;
 	case IMSG_TLSTICKET_REKEY:
-		IMSG_SIZE_CHECK(imsg, (&ticket));
-		memcpy(&env->sc_ticket, imsg->data, sizeof(env->sc_ticket));
+		if (imsg_get_data(imsg, &env->sc_ticket,
+		    sizeof(env->sc_ticket)) == -1)
+			return (-1);
 		TAILQ_FOREACH(rlay, env->sc_relays, rl_entry) {
 			if (rlay->rl_conf.flags & F_TLS)
 				tls_config_add_ticket_key(rlay->rl_tls_cfg,
@@ -2065,7 +2065,7 @@ relay_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
 int
 relay_dispatch_hce(int fd, struct privsep_proc *p, struct imsg *imsg)
 {
-	switch (imsg->hdr.type) {
+	switch (imsg_get_type(imsg)) {
 	default:
 		break;
 	}