changeset 5202:318cd9e48312 draft

privsep: Copy back ioctl data
author Roy Marples <roy@marples.name>
date Sun, 10 May 2020 11:05:23 +0100
parents 4f064bf74840
children 9d2d76abda6a
files src/privsep-bsd.c src/privsep-linux.c src/privsep-root.c src/privsep-root.h src/privsep-sun.c src/privsep.c
diffstat 6 files changed, 31 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/privsep-bsd.c	Sun May 10 10:11:46 2020 +0100
+++ b/src/privsep-bsd.c	Sun May 10 11:05:23 2020 +0100
@@ -94,7 +94,7 @@
 	if (ps_sendcmd(ctx, ctx->ps_root_fd, domain,
 	    request, data, len) == -1)
 		return -1;
-	return ps_root_readerror(ctx);
+	return ps_root_readerror(ctx, data, len);
 }
 
 ssize_t
@@ -119,5 +119,5 @@
 
 	if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_ROUTE, 0, data, len) == -1)
 		return -1;
-	return ps_root_readerror(ctx);
+	return ps_root_readerror(ctx, data, len);
 }
--- a/src/privsep-linux.c	Sun May 10 10:11:46 2020 +0100
+++ b/src/privsep-linux.c	Sun May 10 11:05:23 2020 +0100
@@ -121,7 +121,7 @@
 	if (ps_sendmsg(ctx, ctx->ps_root_fd, PS_ROUTE,
 	    (unsigned long)protocol, msg) == -1)
 		return -1;
-	return ps_root_readerror(ctx);
+	return ps_root_readerror(ctx, NULL, 0);
 }
 
 ssize_t
@@ -146,5 +146,5 @@
 	if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_WRITEPATHUINT,
 	    0, buf, len) == -1)
 		return -1;
-	return ps_root_readerror(ctx);
+	return ps_root_readerror(ctx, NULL, 0);
 }
--- a/src/privsep-root.c	Sun May 10 10:11:46 2020 +0100
+++ b/src/privsep-root.c	Sun May 10 11:05:23 2020 +0100
@@ -62,6 +62,8 @@
 struct psr_ctx {
 	struct dhcpcd_ctx *psr_ctx;
 	struct psr_error psr_error;
+	size_t psr_datalen;
+	void *psr_data;
 };
 
 static void
@@ -78,10 +80,15 @@
 	struct psr_ctx *psr_ctx = arg;
 	struct dhcpcd_ctx *ctx = psr_ctx->psr_ctx;
 	struct psr_error *psr_error = &psr_ctx->psr_error;
+	struct iovec iov[] = {
+		{ .iov_base = psr_error, .iov_len = sizeof(*psr_error) },
+		{ .iov_base = psr_ctx->psr_data,
+		  .iov_len = psr_ctx->psr_datalen },
+	};
 	ssize_t len;
 	int exit_code = EXIT_FAILURE;
 
-	len = read(ctx->ps_root_fd, psr_error, sizeof(*psr_error));
+	len = readv(ctx->ps_root_fd, iov, __arraycount(iov));
 	if (len == 0 || len == -1) {
 		logerr(__func__);
 		psr_error->psr_result = -1;
@@ -97,9 +104,12 @@
 }
 
 ssize_t
-ps_root_readerror(struct dhcpcd_ctx *ctx)
+ps_root_readerror(struct dhcpcd_ctx *ctx, void *data, size_t len)
 {
-	struct psr_ctx psr_ctx = { .psr_ctx = ctx };
+	struct psr_ctx psr_ctx = {
+	    .psr_ctx = ctx,
+	    .psr_data = data, .psr_datalen = len,
+	};
 
 	if (eloop_event_add(ctx->ps_eloop, ctx->ps_root_fd,
 	    ps_root_readerrorcb, &psr_ctx) == -1)
@@ -115,18 +125,23 @@
 }
 
 static ssize_t
-ps_root_writeerror(struct dhcpcd_ctx *ctx, ssize_t result)
+ps_root_writeerror(struct dhcpcd_ctx *ctx, ssize_t result,
+    void *data, size_t len)
 {
 	struct psr_error psr = {
 		.psr_result = result,
 		.psr_errno = errno,
 	};
+	struct iovec iov[] = {
+		{ .iov_base = &psr, .iov_len = sizeof(psr) },
+		{ .iov_base = data, .iov_len = len },
+	};
 
 #ifdef PRIVSEP_DEBUG
 	logdebugx("%s: result %zd errno %d", __func__, result, errno);
 #endif
 
-	return write(ctx->ps_root_fd, &psr, sizeof(psr));
+	return writev(ctx->ps_root_fd, iov, __arraycount(iov));
 }
 
 static ssize_t
@@ -386,7 +401,7 @@
 		break;
 	}
 
-	return ps_root_writeerror(ctx, err);
+	return ps_root_writeerror(ctx, err, data, len);
 }
 
 /* Receive from state engine, do an action. */
@@ -539,7 +554,7 @@
 	    buf, slen + len) == -1)
 		return -1;
 
-	return ps_root_readerror(ifp->ctx);
+	return ps_root_readerror(ifp->ctx, NULL, 0);
 }
 
 ssize_t
@@ -556,7 +571,7 @@
 	if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_IOCTL, req, data, len) == -1)
 		return -1;
 #endif
-	return ps_root_readerror(ctx);
+	return ps_root_readerror(ctx, data, len);
 }
 
 static ssize_t
@@ -577,7 +592,7 @@
 
 	if (ps_sendcmd(ctx, ctx->ps_root_fd, op, 0, buf, len) == -1)
 		return -1;
-	return ps_root_readerror(ctx);
+	return ps_root_readerror(ctx, NULL, 0);
 }
 
 
--- a/src/privsep-root.h	Sun May 10 10:11:46 2020 +0100
+++ b/src/privsep-root.h	Sun May 10 11:05:23 2020 +0100
@@ -34,7 +34,7 @@
 pid_t ps_root_start(struct dhcpcd_ctx *ctx);
 int ps_root_stop(struct dhcpcd_ctx *ctx);
 
-ssize_t ps_root_readerror(struct dhcpcd_ctx *);
+ssize_t ps_root_readerror(struct dhcpcd_ctx *, void *, size_t);
 ssize_t ps_root_docopychroot(struct dhcpcd_ctx *, const char *);
 ssize_t ps_root_copychroot(struct dhcpcd_ctx *, const char *);
 ssize_t ps_root_ioctl(struct dhcpcd_ctx *, ioctl_request_t, void *, size_t);
--- a/src/privsep-sun.c	Sun May 10 10:11:46 2020 +0100
+++ b/src/privsep-sun.c	Sun May 10 11:05:23 2020 +0100
@@ -98,7 +98,7 @@
 	if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_IOCTL6,
 	    request, data, len) == -1)
 		return -1;
-	return ps_root_readerror(ctx);
+	return ps_root_readerror(ctx, data, len);
 }
 
 ssize_t
@@ -107,5 +107,5 @@
 
 	if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_ROUTE, 0, data, len) == -1)
 		return -1;
-	return ps_root_readerror(ctx);
+	return ps_root_readerror(ctx, data, len);
 }
--- a/src/privsep.c	Sun May 10 10:11:46 2020 +0100
+++ b/src/privsep.c	Sun May 10 11:05:23 2020 +0100
@@ -490,7 +490,6 @@
 	return 0;
 }
 
-
 ssize_t
 ps_sendpsmmsg(struct dhcpcd_ctx *ctx, int fd,
     struct ps_msghdr *psm, const struct msghdr *msg)