]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
privsep: Close BPF socket on ENXIO.
authorRoy Marples <roy@marples.name>
Sun, 25 Oct 2020 15:30:13 +0000 (15:30 +0000)
committerRoy Marples <roy@marples.name>
Sun, 25 Oct 2020 15:30:13 +0000 (15:30 +0000)
This stops log spam if RTM_IFANNOUNCE is delayed for the departing
interface.

src/privsep-bpf.c

index ddd3cd824c25adeb7f54a2ddc8e31281d3000dd5..23da9a074f25fcb66e44e84411ce7918317d92c4 100644 (file)
@@ -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);
 }