Commit Diff


commit - b03e976aa26d100ec1bf976dfdd005868395b490
commit + 6dec2ad700aac233ab001f91b8fa05813180eaba
blob - 438a88d8a317f9dfaae711a8e8506913215122b2
blob + 14ef23d1f409e314958395b9eaedbc035d37f763
--- config.c
+++ config.c
@@ -530,10 +530,8 @@ config_recv(struct conf *conf, struct imsg *imsg)
 	struct proxy	*proxy;
 	struct address	*addr;
 	uint8_t		*d;
-	size_t		 len, datalen;
+	size_t		 len;
 	int		 fd;
-
-	datalen = IMSG_DATA_SIZE(imsg);
 
 	switch (imsg->hdr.type) {
 	case IMSG_RECONF_START:
@@ -543,13 +541,14 @@ config_recv(struct conf *conf, struct imsg *imsg)
 		break;
 
 	case IMSG_RECONF_LOG_FMT:
-		IMSG_SIZE_CHECK(imsg, &conf->log_format);
-		memcpy(&conf->log_format, imsg->data, datalen);
+		if (imsg_get_data(imsg, &conf->log_format,
+		    sizeof(conf->log_format)) == -1)
+			fatalx("bad length imsg LOG_FMT");
 		break;
 
 	case IMSG_RECONF_MIME:
-		IMSG_SIZE_CHECK(imsg, &m);
-		memcpy(&m, imsg->data, datalen);
+		if (imsg_get_data(imsg, &m, sizeof(m)) == -1)
+			fatalx("bad length imsg RECONF_MIME");
 		if (m.mime[sizeof(m.mime) - 1] != '\0' ||
 		    m.ext[sizeof(m.ext) - 1] != '\0')
 			fatal("received corrupted IMSG_RECONF_MIME");
@@ -559,14 +558,15 @@ config_recv(struct conf *conf, struct imsg *imsg)
 		break;
 
 	case IMSG_RECONF_PROTOS:
-		IMSG_SIZE_CHECK(imsg, &conf->protos);
-		memcpy(&conf->protos, imsg->data, datalen);
+		if (imsg_get_data(imsg, &conf->protos, sizeof(conf->protos))
+		    == -1)
+			fatalx("bad length imsg RECONF_PROTOS");
 		break;
 
 	case IMSG_RECONF_SOCK:
 		addr = xcalloc(1, sizeof(*addr));
-		IMSG_SIZE_CHECK(imsg, addr);
-		memcpy(addr, imsg->data, sizeof(*addr));
+		if (imsg_get_data(imsg, addr, sizeof(*addr)) == -1)
+			fatalx("bad length imsg RECONF_SOCK");
 		if ((fd = imsg_get_fd(imsg)) == -1)
 			fatalx("missing socket for IMSG_RECONF_SOCK");
 		addr->conf = conf;
@@ -579,16 +579,16 @@ config_recv(struct conf *conf, struct imsg *imsg)
 		break;
 
 	case IMSG_RECONF_FCGI:
-		IMSG_SIZE_CHECK(imsg, fcgi);
 		fcgi = xcalloc(1, sizeof(*fcgi));
-		memcpy(fcgi, imsg->data, datalen);
+		if (imsg_get_data(imsg, fcgi, sizeof(*fcgi)) == -1)
+			fatalx("bad length imsg RECONF_FCGI");
 		log_debug("received fcgi %s", fcgi->path);
 		TAILQ_INSERT_TAIL(&conf->fcgi, fcgi, fcgi);
 		break;
 
 	case IMSG_RECONF_HOST:
-		IMSG_SIZE_CHECK(imsg, &vht);
-		memcpy(&vht, imsg->data, datalen);
+		if (imsg_get_data(imsg, &vht, sizeof(vht)) == -1)
+			fatalx("bad length imsg RECONF_HOST");
 		vh = new_vhost();
 		strlcpy(vh->domain, vht.domain, sizeof(vh->domain));
 		h = vh;
@@ -646,18 +646,18 @@ config_recv(struct conf *conf, struct imsg *imsg)
 		log_debug("receiving host addr");
 		if (h == NULL)
 			fatalx("recv'd host address withouth host");
-		IMSG_SIZE_CHECK(imsg, addr);
 		addr = xcalloc(1, sizeof(*addr));
-		memcpy(addr, imsg->data, datalen);
+		if (imsg_get_data(imsg, addr, sizeof(*addr)) == -1)
+			fatalx("bad length imsg RECONF_HOST_ADDR");
 		TAILQ_INSERT_TAIL(&h->addrs, addr, addrs);
 		break;
 
 	case IMSG_RECONF_LOC:
 		if (h == NULL)
 			fatalx("recv'd location without host");
-		IMSG_SIZE_CHECK(imsg, loc);
 		loc = xcalloc(1, sizeof(*loc));
-		memcpy(loc, imsg->data, datalen);
+		if (imsg_get_data(imsg, loc, sizeof(*loc)) == -1)
+			fatalx("bad length imsg RECONF_LOC");
 		TAILQ_INIT(&loc->params);
 
 		if ((fd = imsg_get_fd(imsg)) != -1) {
@@ -676,18 +676,18 @@ config_recv(struct conf *conf, struct imsg *imsg)
 	case IMSG_RECONF_ENV:
 		if (l == NULL)
 			fatalx("recv'd env without location");
-		IMSG_SIZE_CHECK(imsg, env);
 		env = xcalloc(1, sizeof(*env));
-		memcpy(env, imsg->data, datalen);
+		if (imsg_get_data(imsg, env, sizeof(*env)) == -1)
+			fatalx("bad length imsg RECONF_ENV");
 		TAILQ_INSERT_TAIL(&l->params, env, envs);
 		break;
 
 	case IMSG_RECONF_ALIAS:
 		if (h == NULL)
 			fatalx("recv'd alias without host");
-		IMSG_SIZE_CHECK(imsg, alias);
 		alias = xcalloc(1, sizeof(*alias));
-		memcpy(alias, imsg->data, datalen);
+		if (imsg_get_data(imsg, alias, sizeof(*alias)) == -1)
+			fatalx("bad length imsg RECONF_ALIAS");
 		TAILQ_INSERT_TAIL(&h->aliases, alias, aliases);
 		break;
 
@@ -695,9 +695,9 @@ config_recv(struct conf *conf, struct imsg *imsg)
 		log_debug("receiving proxy");
 		if (h == NULL)
 			fatalx("recv'd proxy without host");
-		IMSG_SIZE_CHECK(imsg, proxy);
 		proxy = xcalloc(1, sizeof(*proxy));
-		memcpy(proxy, imsg->data, datalen);
+		if (imsg_get_data(imsg, proxy, sizeof(*proxy)) == -1)
+			fatalx("bad length imsg RECONF_PROXY");
 
 		if ((fd = imsg_get_fd(imsg)) != -1) {
 			if (load_file(fd, &d, &len) == -1)
blob - 799b94eae778aeb325ca978e8e655f53cc44f2b4
blob + 97adec686fa81ab468a6f1a025586c9226009d95
--- logger.c
+++ logger.c
@@ -81,14 +81,13 @@ logger_dispatch_parent(int fd, struct privsep_proc *p,
 {
 	switch (imsg->hdr.type) {
 	case IMSG_LOG_FACILITY:
-		if (IMSG_DATA_SIZE(imsg) != sizeof(facility))
+		if (imsg_get_data(imsg, &facility, sizeof(facility)) == -1)
 			fatal("corrupted IMSG_LOG_SYSLOG");
-		memcpy(&facility, imsg->data, sizeof(facility));
 		break;
 	case IMSG_LOG_SYSLOG:
-		if (IMSG_DATA_SIZE(imsg) != sizeof(log_to_syslog))
+		if (imsg_get_data(imsg, &log_to_syslog,
+		    sizeof(log_to_syslog)) == -1)
 			fatal("corrupted IMSG_LOG_SYSLOG");
-		memcpy(&log_to_syslog, imsg->data, sizeof(log_to_syslog));
 		break;
 	case IMSG_LOG_ACCESS:
 		if (logfd != -1)
@@ -107,13 +106,14 @@ logger_dispatch_server(int fd, struct privsep_proc *p,
 {
 	char *msg;
 	size_t datalen;
+	struct ibuf ibuf;
 
 	switch (imsg->hdr.type) {
 	case IMSG_LOG_REQUEST:
-		msg = imsg->data;
-		datalen = IMSG_DATA_SIZE(imsg);
-		if (datalen == 0)
+		if (imsg_get_ibuf(imsg, &ibuf) == -1 ||
+		    (datalen = ibuf_size(&ibuf)) == 0)
 			fatal("got invalid IMSG_LOG_REQUEST");
+		msg = ibuf_data(&ibuf);
 		msg[datalen - 1] = '\0';
 		if (logfd != -1)
 			dprintf(logfd, "%s\n", msg);
blob - 50cabc779f7deaf4a343874404d0821c62859769
blob + 7e160a8dbfec202e58b42ed819fa99585f1e280c
--- proc.c
+++ proc.c
@@ -671,8 +671,8 @@ proc_dispatch(int fd, short event, void *arg)
 		 */
 		switch (imsg.hdr.type) {
 		case IMSG_CTL_PROCFD:
-			IMSG_SIZE_CHECK(&imsg, &pf);
-			memcpy(&pf, imsg.data, sizeof(pf));
+			if (imsg_get_data(&imsg, &pf, sizeof(pf)))
+				fatalx("bad length imsg CTL_PROCFD");
 			proc_accept(ps, imsg_get_fd(&imsg), pf.pf_procid,
 			    pf.pf_instance);
 			break;