]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
privsep: Ensure we don't scribble garbage to BPF
authorRoy Marples <roy@marples.name>
Wed, 20 May 2020 15:44:19 +0000 (15:44 +0000)
committerRoy Marples <roy@marples.name>
Wed, 20 May 2020 15:44:19 +0000 (15:44 +0000)
Well, it's not garbage, it's a privsep IPC message telling us to
start BPF which the BPF process should not have recieved!
Add code to ensure this cannot happen.

src/privsep-bpf.c
src/privsep-root.c

index d8cb79738f588630e4b9d7483221f65075339c42..ee989cb9136136193552d6f45123f4cef60b0ee1 100644 (file)
@@ -92,11 +92,28 @@ ps_bpf_recvbpf(void *arg)
 }
 
 static ssize_t
-ps_bpf_recvmsgcb(void *arg, __unused struct ps_msghdr *psm, struct msghdr *msg)
+ps_bpf_recvmsgcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg)
 {
        struct ps_process *psp = arg;
        struct iovec *iov = msg->msg_iov;
 
+#ifdef PRIVSEP_DEBUG
+       logerrx("%s: IN cmd %x, psp %p", __func__, psm->ps_cmd, psp);
+#endif
+
+       switch(psm->ps_cmd) {
+#ifdef ARP
+       case PS_BPF_ARP:        /* FALLTHROUGH */
+#endif
+       case PS_BPF_BOOTP:
+               break;
+       default:
+               /* IPC failure, we should not be processing any commands
+                * at this point!/ */
+               errno = EINVAL;
+               return -1;
+       }
+
        return bpf_send(psp->psp_bpf, psp->psp_proto,
            iov->iov_base, iov->iov_len);
 }
@@ -106,13 +123,6 @@ ps_bpf_recvmsg(void *arg)
 {
        struct ps_process *psp = arg;
 
-       /*
-        * OpenBSD-6.6 at least will return EPERM here for every
-        * BOOTP sent except for the first one.
-        * However with wih EPERM, the BOOTP message is *still* sent.
-        * This means the BPF write filter isn't working as it should.
-        * On FreeBSD it works fine.
-        */
        if (ps_recvpsmsg(psp->psp_ctx, psp->psp_fd,
            ps_bpf_recvmsgcb, arg) == -1)
                logerr(__func__);
index 69b9e3716eb2bcdb18c9b275c376b739ea276e92..f511a43f3311c1dade7f4be9abbe948d77c35a9b 100644 (file)
@@ -409,8 +409,10 @@ ps_root_recvmsgcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg)
 
                        ps_freeprocess(psp);
                        return ret;
-               }
-               return ps_sendpsmmsg(ctx, psp->psp_fd, psm, msg);
+               } else if (!(psm->ps_cmd & PS_START))
+                       return ps_sendpsmmsg(ctx, psp->psp_fd, psm, msg);
+               /* Process has already started .... */
+               return 0;
        }
 
        if (psm->ps_cmd & PS_STOP && psp == NULL)