]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
privsep: Copy back ioctl data
authorRoy Marples <roy@marples.name>
Sun, 10 May 2020 10:05:23 +0000 (11:05 +0100)
committerRoy Marples <roy@marples.name>
Sun, 10 May 2020 10:05:23 +0000 (11:05 +0100)
src/privsep-bsd.c
src/privsep-linux.c
src/privsep-root.c
src/privsep-root.h
src/privsep-sun.c
src/privsep.c

index 1cd91c8fd4364cc1f876ad6941e0e6389341624f..b64040d6d27ec02f813b37d4362fa62b68a4a43b 100644 (file)
@@ -94,7 +94,7 @@ ps_root_ioctldom(struct dhcpcd_ctx *ctx, uint8_t domain, unsigned long request,
        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 @@ ps_root_route(struct dhcpcd_ctx *ctx, void *data, size_t len)
 
        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);
 }
index 4321f3612d4296894cdda0c3f932e7c2b4c839b6..98403f5c63b902598e9417a69cb21d433f8aae42 100644 (file)
@@ -121,7 +121,7 @@ ps_root_sendnetlink(struct dhcpcd_ctx *ctx, int protocol, struct msghdr *msg)
        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 @@ ps_root_writepathuint(struct dhcpcd_ctx *ctx, const char *path,
        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);
 }
index c3b95e24357ac08f05f60d1020b6d3af49c07f43..dcfe309122384c72b2ea6da4d3edd686e285fb3a 100644 (file)
@@ -62,6 +62,8 @@ struct psr_error
 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 @@ ps_root_readerrorcb(void *arg)
        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 @@ ps_root_readerrorcb(void *arg)
 }
 
 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 @@ ps_root_readerror(struct dhcpcd_ctx *ctx)
 }
 
 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 @@ ps_root_recvmsgcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg)
                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 @@ ps_root_script(const struct interface *ifp, const void *data, size_t len)
            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 @@ ps_root_ioctl(struct dhcpcd_ctx *ctx, ioctl_request_t req, void *data,
        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 @@ ps_root_fileop(struct dhcpcd_ctx *ctx, const char *path, uint8_t op)
 
        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);
 }
 
 
index 43727593a873006c3c44e955cd44efe8b6378a82..466087929a4a866b3c6d7caa8b2c6cc0c7570167 100644 (file)
@@ -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);
index aa5e0e93503f7ed6911e4153edafc8f024644356..ed6e5d3a95f8168ef39b7c0c026d0768e57f4a3a 100644 (file)
@@ -98,7 +98,7 @@ ps_root_ioctl6(struct dhcpcd_ctx *ctx, unsigned long request, void *data, size_t
        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 @@ ps_root_route(struct dhcpcd_ctx *ctx, void *data, size_t len)
 
        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);
 }
index bfc8860d19bf3946439f8bf04e4a321fd4d673b4..51fdf7b7a760c8ebc130b9689aeae793a1af6350 100644 (file)
@@ -490,7 +490,6 @@ ps_unrollmsg(struct msghdr *msg, struct ps_msghdr *psm,
        return 0;
 }
 
-
 ssize_t
 ps_sendpsmmsg(struct dhcpcd_ctx *ctx, int fd,
     struct ps_msghdr *psm, const struct msghdr *msg)