diff options
| author | Roy Marples <roy@marples.name> | 2020-10-25 15:30:13 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2020-10-25 15:30:13 +0000 |
| commit | c5740a4825240847a5a19cd1a840e4f2b5051dfd (patch) | |
| tree | b66f23140afdb1e57d9efb7cd0d7138a3adf85e5 /src/privsep-bpf.c | |
| parent | a5ca9384877296a97f0bd87f5738529f641970a7 (diff) | |
| download | dhcpcd-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.c | 24 |
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); } |
