Index | Thread | Search

From:
Rafael Sadowski <rafael@sizeofvoid.org>
Subject:
httpd: check return values in dispatch_parent
To:
tech@openbsd.org
Date:
Sat, 18 Jul 2026 10:47:20 +0200

Download raw body.

Thread
A lot can go wrong here, and we don't deal with it. OK?

diff --git a/server.c b/server.c
index a12d6f9..537314c 100644
--- a/server.c
+++ b/server.c
@@ -54,7 +54,7 @@ int		 server_dispatch_logger(int, struct privsep_proc *,
 void		 server_shutdown(void);
 
 void		 server_init(struct privsep *, struct privsep_proc *p, void *);
-void		 server_launch(void);
+int		 server_launch(void);
 int		 server_socket(struct sockaddr_storage *, in_port_t,
 		    struct server_config *, int, int);
 int		 server_socket_listen(struct sockaddr_storage *, in_port_t,
@@ -406,7 +406,7 @@ server_init(struct privsep *ps, struct privsep_proc *p, void *arg)
 #endif
 }
 
-void
+int
 server_launch(void)
 {
 	struct server		*srv;
@@ -415,7 +415,8 @@ server_launch(void)
 		log_debug("%s: configuring server %s", __func__,
 		    srv->srv_conf.name);
 
-		server_tls_init(srv);
+		if (server_tls_init(srv) != 0)
+			return (-1);
 
 		log_debug("%s: running server %s", __func__,
 		    srv->srv_conf.name);
@@ -425,6 +426,7 @@ server_launch(void)
 		event_add(&srv->srv_ev, NULL);
 		evtimer_set(&srv->srv_evt, server_accept, srv);
 	}
+	return (0);
 }
 
 void
@@ -1345,37 +1347,49 @@ server_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
 
 	switch (imsg->hdr.type) {
 	case IMSG_CFG_MEDIA:
-		config_getmedia(httpd_env, imsg);
+		if (config_getmedia(httpd_env, imsg) != 0)
+			return (-1);
 		break;
 	case IMSG_CFG_AUTH:
-		config_getauth(httpd_env, imsg);
+		if (config_getauth(httpd_env, imsg) != 0)
+			return (-1);
 		break;
 	case IMSG_CFG_SERVER:
-		config_getserver(httpd_env, imsg);
+		if (config_getserver(httpd_env, imsg) != 0)
+			return (-1);
 		break;
 	case IMSG_CFG_TLS:
-		config_getserver_tls(httpd_env, imsg);
+		if (config_getserver_tls(httpd_env, imsg) != 0)
+			return (-1);
 		break;
 	case IMSG_CFG_FCGI:
-		config_getserver_fcgiparams(httpd_env, imsg);
+		if (config_getserver_fcgiparams(httpd_env, imsg) != 0)
+			return (-1);
 		break;
 	case IMSG_CFG_DONE:
-		config_getcfg(httpd_env, imsg);
+		if (config_getcfg(httpd_env, imsg) != 0)
+			return (-1);
 		break;
 	case IMSG_CTL_START:
-		server_launch();
+		if (server_launch() != 0)
+			return (-1);
 		break;
 	case IMSG_CTL_RESET:
-		config_getreset(httpd_env, imsg);
+		if (config_getreset(httpd_env, imsg) != 0)
+			return (-1);
 		break;
 	case IMSG_TLSTICKET_REKEY:
 		IMSG_SIZE_CHECK(imsg, (&key));
 		memcpy(&key, imsg->data, sizeof(key));
 		/* apply to the right server */
-		srv = server_byid(key.tt_id);
-		if (srv) {
-			tls_config_add_ticket_key(srv->srv_tls_config,
-			    key.tt_keyrev, key.tt_key, sizeof(key.tt_key));
+		if ((srv = server_byid(key.tt_id)) == NULL) {
+			log_debug("%s: invalid sever id", __func__);
+			return (-1);
+		}
+		if (tls_config_add_ticket_key(srv->srv_tls_config,
+		    key.tt_keyrev, key.tt_key, sizeof(key.tt_key)) == -1) {
+			log_debug("%s: tls_config_add_ticket_key", __func__);
+			return (-1);
 		}
 		break;
 	default: