From: Roy Marples Date: Tue, 16 May 2023 16:16:26 +0000 (+0100) Subject: privsep: Allow zero length messages through X-Git-Tag: v10.0.2~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8b29c0ddf026c1c5647c3b8c6cfe21699c4056ae;p=thirdparty%2Fdhcpcd.git privsep: Allow zero length messages through They should be handled gracefully without privsep anyway. Fix for #179. --- diff --git a/src/privsep-inet.c b/src/privsep-inet.c index ec239e86..e59c3353 100644 --- a/src/privsep-inet.c +++ b/src/privsep-inet.c @@ -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__); } diff --git a/src/privsep.c b/src/privsep.c index 765756d7..b11c0351 100644 --- a/src/privsep.c +++ b/src/privsep.c @@ -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; } diff --git a/src/privsep.h b/src/privsep.h index a4289325..f03b2be7 100644 --- a/src/privsep.h +++ b/src/privsep.h @@ -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 *);