summaryrefslogtreecommitdiffstats
path: root/src/privsep-bpf.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-10-25 15:30:13 +0000
committerRoy Marples <roy@marples.name>2020-10-25 15:30:13 +0000
commitc5740a4825240847a5a19cd1a840e4f2b5051dfd (patch)
treeb66f23140afdb1e57d9efb7cd0d7138a3adf85e5 /src/privsep-bpf.c
parenta5ca9384877296a97f0bd87f5738529f641970a7 (diff)
downloaddhcpcd-c5740a4825240847a5a19cd1a840e4f2b5051dfd.tar.xz
privsep: Close BPF socket on ENXIO.
This stops log spam if RTM_IFANNOUNCE is delayed for the departing interface.
Diffstat (limited to 'src/privsep-bpf.c')
-rw-r--r--src/privsep-bpf.c24
1 files changed, 21 insertions, 3 deletions
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);
}