]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
privsep: Allow zero length messages through
authorRoy Marples <roy@marples.name>
Tue, 16 May 2023 16:16:26 +0000 (17:16 +0100)
committerRoy Marples <roy@marples.name>
Tue, 16 May 2023 16:18:07 +0000 (17:18 +0100)
They should be handled gracefully without privsep anyway.
Fix for #179.

src/privsep-inet.c
src/privsep.c
src/privsep.h

index ec239e86aec75ddb907e1c3b30343e49c7d438bf..e59c33538148212963e88ad481d672fbbc848e8b 100644 (file)
@@ -53,7 +53,7 @@ ps_inet_recvbootp(void *arg, unsigned short events)
 {
        struct dhcpcd_ctx *ctx = arg;
 
-       if (ps_recvmsg(ctx, ctx->udp_rfd, events,
+       if (ps_recvmsg(ctx->udp_rfd, events,
            PS_BOOTP, ctx->ps_inet->psp_fd) == -1)
                logerr(__func__);
 }
@@ -68,13 +68,13 @@ ps_inet_recvra(void *arg, unsigned short events)
        struct rs_state *state = RS_STATE(ifp);
        struct dhcpcd_ctx *ctx = ifp->ctx;
 
-       if (ps_recvmsg(ctx, state->nd_fd, events,
+       if (ps_recvmsg(state->nd_fd, events,
            PS_ND, ctx->ps_inet->psp_fd) == -1)
                logerr(__func__);
 #else
        struct dhcpcd_ctx *ctx = arg;
 
-       if (ps_recvmsg(ctx, ctx->nd_fd, events,
+       if (ps_recvmsg(ctx->nd_fd, events,
            PS_ND, ctx->ps_inet->psp_fd) == -1)
                logerr(__func__);
 #endif
@@ -87,7 +87,7 @@ ps_inet_recvdhcp6(void *arg, unsigned short events)
 {
        struct dhcpcd_ctx *ctx = arg;
 
-       if (ps_recvmsg(ctx, ctx->dhcp6_rfd, events,
+       if (ps_recvmsg(ctx->dhcp6_rfd, events,
            PS_DHCP6, ctx->ps_inet->psp_fd) == -1)
                logerr(__func__);
 }
@@ -387,7 +387,7 @@ ps_inet_recvinbootp(void *arg, unsigned short events)
 {
        struct ps_process *psp = arg;
 
-       if (ps_recvmsg(psp->psp_ctx, psp->psp_work_fd, events,
+       if (ps_recvmsg(psp->psp_work_fd, events,
            PS_BOOTP, psp->psp_ctx->ps_data_fd) == -1)
                logerr(__func__);
 }
@@ -430,7 +430,7 @@ ps_inet_recvin6nd(void *arg)
 {
        struct ps_process *psp = arg;
 
-       if (ps_recvmsg(psp->psp_ctx, psp->psp_work_fd,
+       if (ps_recvmsg(psp->psp_work_fd,
            PS_ND, psp->psp_ctx->ps_data_fd) == -1)
                logerr(__func__);
 }
@@ -470,7 +470,7 @@ ps_inet_recvin6dhcp6(void *arg, unsigned short events)
 {
        struct ps_process *psp = arg;
 
-       if (ps_recvmsg(psp->psp_ctx, psp->psp_work_fd, events,
+       if (ps_recvmsg(psp->psp_work_fd, events,
            PS_DHCP6, psp->psp_ctx->ps_data_fd) == -1)
                logerr(__func__);
 }
index 765756d7668801ec326c794d44db5a67847f9511..b11c0351c25e2189ff042bc7b5b5a923cc754e3c 100644 (file)
@@ -1069,8 +1069,7 @@ nobufs:
 }
 
 ssize_t
-ps_recvmsg(struct dhcpcd_ctx *ctx, int rfd, unsigned short events,
-    uint16_t cmd, int wfd)
+ps_recvmsg(int rfd, unsigned short events, uint16_t cmd, int wfd)
 {
        struct sockaddr_storage ss = { .ss_family = AF_UNSPEC };
        uint8_t controlbuf[sizeof(struct sockaddr_storage)] = { 0 };
@@ -1089,22 +1088,15 @@ ps_recvmsg(struct dhcpcd_ctx *ctx, int rfd, unsigned short events,
                logerrx("%s: unexpected event 0x%04x", __func__, events);
 
        len = recvmsg(rfd, &msg, 0);
-       if (len == -1)
+       if (len == -1) {
                logerr("%s: recvmsg", __func__);
-       if (len == -1 || len == 0) {
-               if (ctx->options & DHCPCD_FORKED)
-                       eloop_exit(ctx->eloop,
-                           len != -1 ? EXIT_SUCCESS : EXIT_FAILURE);
                return len;
        }
 
        iov[0].iov_len = (size_t)len;
        len = ps_sendcmdmsg(wfd, cmd, &msg);
-       if (len == -1) {
+       if (len == -1)
                logerr("%s: ps_sendcmdmsg", __func__);
-               if (ctx->options & DHCPCD_FORKED)
-                       eloop_exit(ctx->eloop, EXIT_FAILURE);
-       }
        return len;
 }
 
index a4289325ecfd83bfe32c800be4ba646b7bce5710..f03b2be76062d71fb02e4fcc9723299835e11a94 100644 (file)
@@ -211,7 +211,7 @@ ssize_t ps_sendmsg(struct dhcpcd_ctx *, int, uint16_t, unsigned long,
     const struct msghdr *);
 ssize_t ps_sendcmd(struct dhcpcd_ctx *, int, uint16_t, unsigned long,
     const void *data, size_t len);
-ssize_t ps_recvmsg(struct dhcpcd_ctx *, int, unsigned short, uint16_t, int);
+ssize_t ps_recvmsg(int, unsigned short, uint16_t, int);
 ssize_t ps_recvpsmsg(struct dhcpcd_ctx *, int, unsigned short,
     ssize_t (*callback)(void *, struct ps_msghdr *, struct msghdr *), void *);