From: Roy Marples Date: Sun, 25 Oct 2020 15:30:13 +0000 (+0000) Subject: privsep: Close BPF socket on ENXIO. X-Git-Tag: v9.3.2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c5740a4825240847a5a19cd1a840e4f2b5051dfd;p=thirdparty%2Fdhcpcd.git privsep: Close BPF socket on ENXIO. This stops log spam if RTM_IFANNOUNCE is delayed for the departing interface. --- diff --git a/src/privsep-bpf.c b/src/privsep-bpf.c index ddd3cd82..23da9a07 100644 --- a/src/privsep-bpf.c +++ b/src/privsep-bpf.c @@ -70,9 +70,21 @@ ps_bpf_recvbpf(void *arg) * This mechanism allows us to read each packet from the buffer. */ while (!(bpf->bpf_flags & BPF_EOF)) { len = bpf_read(bpf, buf, sizeof(buf)); - if (len == -1) - logerr(__func__); - if (len == -1 || len == 0) + if (len == -1) { + int error = errno; + + logerr("%s: %s", psp->psp_ifname, __func__); + if (error != ENXIO) + break; + /* If the interface has departed, close the BPF + * socket. This stops log spam if RTM_IFANNOUNCE is + * delayed in announcing the departing interface. */ + eloop_event_delete(psp->psp_ctx->eloop, bpf->bpf_fd); + bpf_close(bpf); + psp->psp_bpf = NULL; + break; + } + if (len == 0) break; psm.ps_flags = bpf->bpf_flags; len = ps_sendpsmdata(psp->psp_ctx, psp->psp_ctx->ps_data_fd, @@ -107,6 +119,12 @@ ps_bpf_recvmsgcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg) return -1; } + /* We might have had an earlier ENXIO error. */ + if (psp->psp_bpf == NULL) { + errno = ENXIO; + return -1; + } + return bpf_send(psp->psp_bpf, psp->psp_proto, iov->iov_base, iov->iov_len); }