annotate src/privsep-bpf.c @ 5523:357fddea9365 draft

privsep: Close BPF socket on ENXIO. This stops log spam if RTM_IFANNOUNCE is delayed for the departing interface.
author Roy Marples <roy@marples.name>
date Sun, 25 Oct 2020 15:30:13 +0000
parents 5aedb51585b6
children 99bfd2eb77ab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
1 /* SPDX-License-Identifier: BSD-2-Clause */
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
2 /*
5060
4539ffcdd656 spelling: Correct both privilege and separation
Roy Marples <roy@marples.name>
parents: 5028
diff changeset
3 * Privilege Separation BPF Initiator
4922
555d7d1a4939 Welcome to 2020!
Roy Marples <roy@marples.name>
parents: 4873
diff changeset
4 * Copyright (c) 2006-2020 Roy Marples <roy@marples.name>
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
5 * All rights reserved
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
6
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
7 * Redistribution and use in source and binary forms, with or without
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
8 * modification, are permitted provided that the following conditions
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
9 * are met:
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
10 * 1. Redistributions of source code must retain the above copyright
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
11 * notice, this list of conditions and the following disclaimer.
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
15 *
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
26 * SUCH DAMAGE.
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
27 */
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
28
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
29 #include <sys/socket.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
30 #include <sys/types.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
31
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
32 /* Need these headers just for if_ether on some OS. */
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
33 #ifndef __NetBSD__
4842
efc22a0dde81 Solaris: start privsep support
Roy Marples <roy@marples.name>
parents: 4840
diff changeset
34 #include <net/if.h>
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
35 #include <net/if_arp.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
36 #include <netinet/in.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
37 #endif
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
38 #include <netinet/if_ether.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
39
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
40 #include <assert.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
41 #include <pwd.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
42 #include <errno.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
43 #include <stdlib.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
44 #include <string.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
45 #include <unistd.h>
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
46
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
47 #include "arp.h"
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
48 #include "bpf.h"
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
49 #include "dhcp.h"
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
50 #include "dhcp6.h"
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
51 #include "eloop.h"
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
52 #include "ipv6nd.h"
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
53 #include "logerr.h"
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
54 #include "privsep.h"
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
55
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
56 static void
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
57 ps_bpf_recvbpf(void *arg)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
58 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
59 struct ps_process *psp = arg;
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
60 struct bpf *bpf = psp->psp_bpf;
5261
33324d44a2e8 privsep: Pass BPF flags via ps_flags
Roy Marples <roy@marples.name>
parents: 5242
diff changeset
61 uint8_t buf[FRAMELEN_MAX];
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
62 ssize_t len;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
63 struct ps_msghdr psm = {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
64 .ps_id = psp->psp_id,
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
65 .ps_cmd = psp->psp_id.psi_cmd,
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
66 };
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
67
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
68 bpf->bpf_flags &= ~BPF_EOF;
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
69 /* A BPF read can read more than one filtered packet at time.
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
70 * This mechanism allows us to read each packet from the buffer. */
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
71 while (!(bpf->bpf_flags & BPF_EOF)) {
5261
33324d44a2e8 privsep: Pass BPF flags via ps_flags
Roy Marples <roy@marples.name>
parents: 5242
diff changeset
72 len = bpf_read(bpf, buf, sizeof(buf));
5523
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
73 if (len == -1) {
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
74 int error = errno;
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
75
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
76 logerr("%s: %s", psp->psp_ifname, __func__);
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
77 if (error != ENXIO)
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
78 break;
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
79 /* If the interface has departed, close the BPF
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
80 * socket. This stops log spam if RTM_IFANNOUNCE is
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
81 * delayed in announcing the departing interface. */
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
82 eloop_event_delete(psp->psp_ctx->eloop, bpf->bpf_fd);
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
83 bpf_close(bpf);
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
84 psp->psp_bpf = NULL;
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
85 break;
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
86 }
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
87 if (len == 0)
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
88 break;
5261
33324d44a2e8 privsep: Pass BPF flags via ps_flags
Roy Marples <roy@marples.name>
parents: 5242
diff changeset
89 psm.ps_flags = bpf->bpf_flags;
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
90 len = ps_sendpsmdata(psp->psp_ctx, psp->psp_ctx->ps_data_fd,
5264
868ac20cdbad Fix some memory issues with prior
Roy Marples <roy@marples.name>
parents: 5261
diff changeset
91 &psm, buf, (size_t)len);
5306
d10b3ad73215 privsep: Log ECONNRESET errors again
Roy Marples <roy@marples.name>
parents: 5264
diff changeset
92 if (len == -1)
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
93 logerr(__func__);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
94 if (len == -1 || len == 0)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
95 break;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
96 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
97 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
98
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
99 static ssize_t
5242
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
100 ps_bpf_recvmsgcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg)
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
101 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
102 struct ps_process *psp = arg;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
103 struct iovec *iov = msg->msg_iov;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
104
5242
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
105 #ifdef PRIVSEP_DEBUG
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
106 logerrx("%s: IN cmd %x, psp %p", __func__, psm->ps_cmd, psp);
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
107 #endif
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
108
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
109 switch(psm->ps_cmd) {
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
110 #ifdef ARP
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
111 case PS_BPF_ARP: /* FALLTHROUGH */
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
112 #endif
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
113 case PS_BPF_BOOTP:
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
114 break;
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
115 default:
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
116 /* IPC failure, we should not be processing any commands
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
117 * at this point!/ */
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
118 errno = EINVAL;
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
119 return -1;
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
120 }
0dd9b7f7cf6b privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents: 5240
diff changeset
121
5523
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
122 /* We might have had an earlier ENXIO error. */
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
123 if (psp->psp_bpf == NULL) {
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
124 errno = ENXIO;
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
125 return -1;
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
126 }
357fddea9365 privsep: Close BPF socket on ENXIO.
Roy Marples <roy@marples.name>
parents: 5505
diff changeset
127
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
128 return bpf_send(psp->psp_bpf, psp->psp_proto,
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
129 iov->iov_base, iov->iov_len);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
130 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
131
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
132 static void
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
133 ps_bpf_recvmsg(void *arg)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
134 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
135 struct ps_process *psp = arg;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
136
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
137 if (ps_recvpsmsg(psp->psp_ctx, psp->psp_fd,
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
138 ps_bpf_recvmsgcb, arg) == -1)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
139 logerr(__func__);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
140 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
141
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
142 static int
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
143 ps_bpf_start_bpf(void *arg)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
144 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
145 struct ps_process *psp = arg;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
146 struct dhcpcd_ctx *ctx = psp->psp_ctx;
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
147 char *addr;
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
148 struct in_addr *ia = &psp->psp_id.psi_addr.psa_in_addr;
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
149
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
150 if (ia->s_addr == INADDR_ANY) {
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
151 ia = NULL;
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
152 addr = NULL;
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
153 } else
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
154 addr = inet_ntoa(*ia);
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
155 setproctitle("[BPF %s] %s%s%s", psp->psp_protostr, psp->psp_ifname,
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
156 addr != NULL ? " " : "", addr != NULL ? addr : "");
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
157 ps_freeprocesses(ctx, psp);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
158
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
159 psp->psp_bpf = bpf_open(&psp->psp_ifp, psp->psp_filter, ia);
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
160 if (psp->psp_bpf == NULL)
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
161 logerr("%s: bpf_open",__func__);
5495
3332f8a99658 privsep: Remove capsicum specific hooks from BPF
Roy Marples <roy@marples.name>
parents: 5487
diff changeset
162 #ifdef PRIVSEP_RIGHTS
3332f8a99658 privsep: Remove capsicum specific hooks from BPF
Roy Marples <roy@marples.name>
parents: 5487
diff changeset
163 else if (ps_rights_limit_fd(psp->psp_bpf->bpf_fd) == -1)
3332f8a99658 privsep: Remove capsicum specific hooks from BPF
Roy Marples <roy@marples.name>
parents: 5487
diff changeset
164 logerr("%s: ps_rights_limit_fd", __func__);
5197
b02566d71169 privsep: Enable capsicum for network facing processes
Roy Marples <roy@marples.name>
parents: 5073
diff changeset
165 #endif
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
166 else if (eloop_event_add(ctx->eloop,
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
167 psp->psp_bpf->bpf_fd, ps_bpf_recvbpf, psp) == -1)
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
168 logerr("%s: eloop_event_add", __func__);
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
169 else {
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
170 psp->psp_work_fd = psp->psp_bpf->bpf_fd;
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
171 return 0;
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
172 }
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
173
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
174 eloop_exit(ctx->eloop, EXIT_FAILURE);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
175 return -1;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
176 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
177
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
178 ssize_t
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
179 ps_bpf_cmd(struct dhcpcd_ctx *ctx, struct ps_msghdr *psm, struct msghdr *msg)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
180 {
5207
84b63f09c8a4 privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents: 5204
diff changeset
181 uint16_t cmd;
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
182 struct ps_process *psp;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
183 pid_t start;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
184 struct iovec *iov = msg->msg_iov;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
185 struct interface *ifp;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
186
5207
84b63f09c8a4 privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents: 5204
diff changeset
187 cmd = (uint16_t)(psm->ps_cmd & ~(PS_START | PS_STOP));
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
188 psp = ps_findprocess(ctx, &psm->ps_id);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
189
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
190 #ifdef PRIVSEP_DEBUG
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
191 logerrx("%s: IN cmd %x, psp %p", __func__, psm->ps_cmd, psp);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
192 #endif
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
193
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
194 switch (cmd) {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
195 #ifdef ARP
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
196 case PS_BPF_ARP: /* FALLTHROUGH */
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
197 #endif
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
198 case PS_BPF_BOOTP:
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
199 break;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
200 default:
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
201 logerrx("%s: unknown command %x", __func__, psm->ps_cmd);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
202 errno = ENOTSUP;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
203 return -1;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
204 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
205
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
206 if (!(psm->ps_cmd & PS_START)) {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
207 errno = EINVAL;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
208 return -1;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
209 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
210
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
211 if (psp != NULL)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
212 return 1;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
213
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
214 psp = ps_newprocess(ctx, &psm->ps_id);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
215 if (psp == NULL)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
216 return -1;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
217
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
218 ifp = &psp->psp_ifp;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
219 assert(msg->msg_iovlen == 1);
4865
a9f942033a87 privsep: Fix an assertation
Roy Marples <roy@marples.name>
parents: 4854
diff changeset
220 assert(iov->iov_len == sizeof(*ifp));
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
221 memcpy(ifp, iov->iov_base, sizeof(*ifp));
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
222 ifp->ctx = psp->psp_ctx;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
223 ifp->options = NULL;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
224 memset(ifp->if_data, 0, sizeof(ifp->if_data));
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
225
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
226 memcpy(psp->psp_ifname, ifp->name, sizeof(psp->psp_ifname));
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
227
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
228 switch (cmd) {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
229 #ifdef ARP
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
230 case PS_BPF_ARP:
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
231 psp->psp_proto = ETHERTYPE_ARP;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
232 psp->psp_protostr = "ARP";
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
233 psp->psp_filter = bpf_arp;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
234 break;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
235 #endif
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
236 case PS_BPF_BOOTP:
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
237 psp->psp_proto = ETHERTYPE_IP;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
238 psp->psp_protostr = "BOOTP";
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
239 psp->psp_filter = bpf_bootp;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
240 break;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
241 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
242
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
243 start = ps_dostart(ctx,
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
244 &psp->psp_pid, &psp->psp_fd,
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
245 ps_bpf_recvmsg, NULL, psp,
5425
9edfc000a89b privsep: Only the master process accepts signals
Roy Marples <roy@marples.name>
parents: 5371
diff changeset
246 ps_bpf_start_bpf, NULL,
5228
82c7e8204e9b BPF: Set write filters where supported
Roy Marples <roy@marples.name>
parents: 5207
diff changeset
247 PSF_DROPPRIVS);
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
248 switch (start) {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
249 case -1:
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
250 ps_freeprocess(psp);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
251 return -1;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
252 case 0:
5462
6e80b8c6f70c privsep: Log if the platform sandbox is unavailable or available
Roy Marples <roy@marples.name>
parents: 5459
diff changeset
253 ps_entersandbox("stdio", NULL);
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
254 break;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
255 default:
4854
def5c1de1e16 privsep: guard spawn debug messages behind PRIVSEP_DEBUG
Roy Marples <roy@marples.name>
parents: 4842
diff changeset
256 #ifdef PRIVSEP_DEBUG
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
257 logdebugx("%s: spawned BPF %s on PID %d",
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
258 psp->psp_ifname, psp->psp_protostr, start);
4854
def5c1de1e16 privsep: guard spawn debug messages behind PRIVSEP_DEBUG
Roy Marples <roy@marples.name>
parents: 4842
diff changeset
259 #endif
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
260 break;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
261 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
262 return start;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
263 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
264
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
265 ssize_t
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
266 ps_bpf_dispatch(struct dhcpcd_ctx *ctx,
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
267 struct ps_msghdr *psm, struct msghdr *msg)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
268 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
269 struct iovec *iov = msg->msg_iov;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
270 struct interface *ifp;
5234
bcd021398c1d Fix compile on Linux
Roy Marples <roy@marples.name>
parents: 5231
diff changeset
271 uint8_t *bpf;
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
272 size_t bpf_len;
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
273
5505
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
274 switch (psm->ps_cmd) {
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
275 #ifdef ARP
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
276 case PS_BPF_ARP:
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
277 #endif
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
278 case PS_BPF_BOOTP:
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
279 break;
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
280 default:
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
281 errno = ENOTSUP;
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
282 return -1;
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
283 }
5aedb51585b6 privsep: Ensure command is for BPF first and interface valid second
Roy Marples <roy@marples.name>
parents: 5495
diff changeset
284
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
285 ifp = if_findindex(ctx->ifaces, psm->ps_id.psi_ifindex);
5487
23f35ea1a34a privsep: fix crash when interface departs before bpf returns for it
Roy Marples <roy@marples.name>
parents: 5465
diff changeset
286 /* interface may have departed .... */
23f35ea1a34a privsep: fix crash when interface departs before bpf returns for it
Roy Marples <roy@marples.name>
parents: 5465
diff changeset
287 if (ifp == NULL)
23f35ea1a34a privsep: fix crash when interface departs before bpf returns for it
Roy Marples <roy@marples.name>
parents: 5465
diff changeset
288 return -1;
23f35ea1a34a privsep: fix crash when interface departs before bpf returns for it
Roy Marples <roy@marples.name>
parents: 5465
diff changeset
289
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
290 bpf = iov->iov_base;
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
291 bpf_len = iov->iov_len;
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
292
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
293 switch (psm->ps_cmd) {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
294 #ifdef ARP
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
295 case PS_BPF_ARP:
5261
33324d44a2e8 privsep: Pass BPF flags via ps_flags
Roy Marples <roy@marples.name>
parents: 5242
diff changeset
296 arp_packet(ifp, bpf, bpf_len, (unsigned int)psm->ps_flags);
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
297 break;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
298 #endif
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
299 case PS_BPF_BOOTP:
5261
33324d44a2e8 privsep: Pass BPF flags via ps_flags
Roy Marples <roy@marples.name>
parents: 5242
diff changeset
300 dhcp_packet(ifp, bpf, bpf_len, (unsigned int)psm->ps_flags);
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
301 break;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
302 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
303
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
304 return 1;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
305 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
306
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
307 static ssize_t
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
308 ps_bpf_send(const struct interface *ifp, const struct in_addr *ia,
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
309 uint16_t cmd, const void *data, size_t len)
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
310 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
311 struct dhcpcd_ctx *ctx = ifp->ctx;
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
312 struct ps_msghdr psm = {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
313 .ps_cmd = cmd,
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
314 .ps_id = {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
315 .psi_ifindex = ifp->index,
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
316 .psi_cmd = (uint8_t)(cmd & ~(PS_START | PS_STOP)),
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
317 },
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
318 };
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
319
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
320 if (ia != NULL)
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
321 psm.ps_id.psi_addr.psa_in_addr = *ia;
4868
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
322
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
323 return ps_sendpsmdata(ctx, ctx->ps_root_fd, &psm, data, len);
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
324 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
325
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
326 #ifdef ARP
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
327 ssize_t
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
328 ps_bpf_openarp(const struct interface *ifp, const struct in_addr *ia)
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
329 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
330
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
331 assert(ia != NULL);
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
332 return ps_bpf_send(ifp, ia, PS_BPF_ARP | PS_START,
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
333 ifp, sizeof(*ifp));
4868
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
334 }
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
335
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
336 ssize_t
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
337 ps_bpf_closearp(const struct interface *ifp, const struct in_addr *ia)
4868
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
338 {
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
339
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
340 return ps_bpf_send(ifp, ia, PS_BPF_ARP | PS_STOP, NULL, 0);
4868
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
341 }
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
342
119c8986dfc8 privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents: 4865
diff changeset
343 ssize_t
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
344 ps_bpf_sendarp(const struct interface *ifp, const struct in_addr *ia,
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
345 const void *data, size_t len)
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
346 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
347
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
348 assert(ia != NULL);
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
349 return ps_bpf_send(ifp, ia, PS_BPF_ARP, data, len);
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
350 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
351 #endif
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
352
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
353 ssize_t
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
354 ps_bpf_openbootp(const struct interface *ifp)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
355 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
356
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
357 return ps_bpf_send(ifp, NULL, PS_BPF_BOOTP | PS_START,
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
358 ifp, sizeof(*ifp));
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
359 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
360
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
361 ssize_t
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
362 ps_bpf_closebootp(const struct interface *ifp)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
363 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
364
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
365 return ps_bpf_send(ifp, NULL, PS_BPF_BOOTP | PS_STOP, NULL, 0);
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
366 }
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
367
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
368 ssize_t
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
369 ps_bpf_sendbootp(const struct interface *ifp, const void *data, size_t len)
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
370 {
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
371
5231
a2c342295221 privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents: 5229
diff changeset
372 return ps_bpf_send(ifp, NULL, PS_BPF_BOOTP, data, len);
4840
073fcd86db9b privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff changeset
373 }