Mercurial > hg > dhcpcd
annotate src/privsep-root.c @ 5525:26b5d9bc2985 draft
privsep: Send all log messages to the privileged actioneer
If dhcpcd starts and no syslogd implementation is running then
various syscall filters could be triggered when dhcpcd wants to syslog
and it's already in a chroot.
Not all libc openlog implementations support LOG_NDELAY and
openlog does not return an error code and can also mask errno back to 0.
So we have no way of knowing if we have a syslog connection or not.
This means we cannot cache the connection at startup because syslog itself
will try and open if no connection.
As such, all logging is now directed to the dhcpcd privileged actioneer
process which will handle all the syslog and log file writing actions.
The only downside of this approach (other than an extra fd per process)
is that we no longer know which PID raised the message. While we could
put the correct PID in the logfile as we control the API, we cannot
put it into syslog as we cannot control that API.
As all privsep errors should log which function they came from this
will hopefully not be an issue as on the happy path only the master
process will log stuff.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Fri, 30 Oct 2020 03:43:51 +0000 |
| parents | 6cd47402148f |
| children | b1a3d9055662 |
| 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:
4997
diff
changeset
|
3 * Privilege Separation for dhcpcd, privileged actioneer |
| 4922 | 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/ioctl.h> |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
30 #include <sys/socket.h> |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
31 #include <sys/stat.h> |
|
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
32 #include <sys/time.h> |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
33 #include <sys/types.h> |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
34 #include <sys/wait.h> |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
35 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
36 #include <assert.h> |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
37 #include <errno.h> |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
38 #include <fcntl.h> |
|
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
39 #include <pwd.h> |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
40 #include <signal.h> |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
41 #include <stddef.h> |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
42 #include <stdlib.h> |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
43 #include <string.h> |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
44 #include <unistd.h> |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
45 |
|
5299
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
46 #include "auth.h" |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
47 #include "common.h" |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
48 #include "dev.h" |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
49 #include "dhcpcd.h" |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
50 #include "dhcp6.h" |
|
4840
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 "if.h" |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
53 #include "ipv6nd.h" |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
54 #include "logerr.h" |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
55 #include "privsep.h" |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
56 #include "sa.h" |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
57 #include "script.h" |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
58 |
|
4948
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
59 __CTASSERT(sizeof(ioctl_request_t) <= sizeof(unsigned long)); |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
60 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
61 struct psr_error |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
62 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
63 ssize_t psr_result; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
64 int psr_errno; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
65 char psr_pad[sizeof(ssize_t) - sizeof(int)]; |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
66 size_t psr_datalen; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
67 }; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
68 |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
69 struct psr_ctx { |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
70 struct dhcpcd_ctx *psr_ctx; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
71 struct psr_error psr_error; |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
72 size_t psr_datalen; |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
73 void *psr_data; |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
74 }; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
75 |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
76 static void |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
77 ps_root_readerrorcb(void *arg) |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
78 { |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
79 struct psr_ctx *psr_ctx = arg; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
80 struct dhcpcd_ctx *ctx = psr_ctx->psr_ctx; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
81 struct psr_error *psr_error = &psr_ctx->psr_error; |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
82 struct iovec iov[] = { |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
83 { .iov_base = psr_error, .iov_len = sizeof(*psr_error) }, |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
84 { .iov_base = psr_ctx->psr_data, |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
85 .iov_len = psr_ctx->psr_datalen }, |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
86 }; |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
87 ssize_t len; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
88 int exit_code = EXIT_FAILURE; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
89 |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
90 #define PSR_ERROR(e) \ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
91 do { \ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
92 psr_error->psr_result = -1; \ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
93 psr_error->psr_errno = (e); \ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
94 goto out; \ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
95 } while (0 /* CONSTCOND */) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
96 |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
97 len = readv(ctx->ps_root_fd, iov, __arraycount(iov)); |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
98 if (len == -1) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
99 PSR_ERROR(errno); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
100 else if ((size_t)len < sizeof(*psr_error)) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
101 PSR_ERROR(EINVAL); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
102 exit_code = EXIT_SUCCESS; |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
103 |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
104 out: |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
105 eloop_exit(ctx->ps_eloop, exit_code); |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
106 } |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
107 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
108 ssize_t |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
109 ps_root_readerror(struct dhcpcd_ctx *ctx, void *data, size_t len) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
110 { |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
111 struct psr_ctx psr_ctx = { |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
112 .psr_ctx = ctx, |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
113 .psr_data = data, .psr_datalen = len, |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
114 }; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
115 |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
116 if (eloop_event_add(ctx->ps_eloop, ctx->ps_root_fd, |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
117 ps_root_readerrorcb, &psr_ctx) == -1) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
118 return -1; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
119 |
|
5297
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
120 eloop_enter(ctx->ps_eloop); |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
121 eloop_start(ctx->ps_eloop, &ctx->sigset); |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
122 |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
123 errno = psr_ctx.psr_error.psr_errno; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
124 return psr_ctx.psr_error.psr_result; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
125 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
126 |
|
5316
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
127 #ifdef PRIVSEP_GETIFADDRS |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
128 static void |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
129 ps_root_mreaderrorcb(void *arg) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
130 { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
131 struct psr_ctx *psr_ctx = arg; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
132 struct dhcpcd_ctx *ctx = psr_ctx->psr_ctx; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
133 struct psr_error *psr_error = &psr_ctx->psr_error; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
134 struct iovec iov[] = { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
135 { .iov_base = psr_error, .iov_len = sizeof(*psr_error) }, |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
136 { .iov_base = NULL, .iov_len = 0 }, |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
137 }; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
138 ssize_t len; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
139 int exit_code = EXIT_FAILURE; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
140 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
141 len = recv(ctx->ps_root_fd, psr_error, sizeof(*psr_error), MSG_PEEK); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
142 if (len == -1) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
143 PSR_ERROR(errno); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
144 else if ((size_t)len < sizeof(*psr_error)) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
145 PSR_ERROR(EINVAL); |
|
5345
f6051f78e441
Try and guard against impossibly large data.
Roy Marples <roy@marples.name>
parents:
5330
diff
changeset
|
146 |
|
f6051f78e441
Try and guard against impossibly large data.
Roy Marples <roy@marples.name>
parents:
5330
diff
changeset
|
147 if (psr_error->psr_datalen > SSIZE_MAX) |
|
5329
cc6b3545c52c
privsep: limit psr_datalen to SSIZE_MAX
Roy Marples <roy@marples.name>
parents:
5321
diff
changeset
|
148 PSR_ERROR(ENOBUFS); |
|
5345
f6051f78e441
Try and guard against impossibly large data.
Roy Marples <roy@marples.name>
parents:
5330
diff
changeset
|
149 else if (psr_error->psr_datalen != 0) { |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
150 psr_ctx->psr_data = malloc(psr_error->psr_datalen); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
151 if (psr_ctx->psr_data == NULL) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
152 PSR_ERROR(errno); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
153 psr_ctx->psr_datalen = psr_error->psr_datalen; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
154 iov[1].iov_base = psr_ctx->psr_data; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
155 iov[1].iov_len = psr_ctx->psr_datalen; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
156 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
157 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
158 len = readv(ctx->ps_root_fd, iov, __arraycount(iov)); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
159 if (len == -1) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
160 PSR_ERROR(errno); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
161 else if ((size_t)len != sizeof(*psr_error) + psr_ctx->psr_datalen) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
162 PSR_ERROR(EINVAL); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
163 exit_code = EXIT_SUCCESS; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
164 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
165 out: |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
166 eloop_exit(ctx->ps_eloop, exit_code); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
167 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
168 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
169 ssize_t |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
170 ps_root_mreaderror(struct dhcpcd_ctx *ctx, void **data, size_t *len) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
171 { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
172 struct psr_ctx psr_ctx = { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
173 .psr_ctx = ctx, |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
174 }; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
175 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
176 if (eloop_event_add(ctx->ps_eloop, ctx->ps_root_fd, |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
177 ps_root_mreaderrorcb, &psr_ctx) == -1) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
178 return -1; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
179 |
|
5297
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
180 eloop_enter(ctx->ps_eloop); |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
181 eloop_start(ctx->ps_eloop, &ctx->sigset); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
182 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
183 errno = psr_ctx.psr_error.psr_errno; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
184 *data = psr_ctx.psr_data; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
185 *len = psr_ctx.psr_datalen; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
186 return psr_ctx.psr_error.psr_result; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
187 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
188 #endif |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
189 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
190 static ssize_t |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
191 ps_root_writeerror(struct dhcpcd_ctx *ctx, ssize_t result, |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
192 void *data, size_t len) |
|
4840
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 struct psr_error psr = { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
195 .psr_result = result, |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
196 .psr_errno = errno, |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
197 .psr_datalen = len, |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
198 }; |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
199 struct iovec iov[] = { |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
200 { .iov_base = &psr, .iov_len = sizeof(psr) }, |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
201 { .iov_base = data, .iov_len = len }, |
|
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
202 }; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
203 |
|
4868
119c8986dfc8
privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents:
4851
diff
changeset
|
204 #ifdef PRIVSEP_DEBUG |
|
119c8986dfc8
privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents:
4851
diff
changeset
|
205 logdebugx("%s: result %zd errno %d", __func__, result, errno); |
|
119c8986dfc8
privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents:
4851
diff
changeset
|
206 #endif |
|
119c8986dfc8
privsep: Enable ARP BPF filtering for interesting addresses
Roy Marples <roy@marples.name>
parents:
4851
diff
changeset
|
207 |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
208 return writev(ctx->ps_root_fd, iov, __arraycount(iov)); |
|
4840
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 static ssize_t |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
212 ps_root_doioctl(unsigned long req, void *data, size_t len) |
|
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 int s, err; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
215 |
|
5246
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
216 /* Only allow these ioctls */ |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
217 switch(req) { |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
218 #ifdef SIOCAIFADDR |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
219 case SIOCAIFADDR: /* FALLTHROUGH */ |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
220 case SIOCDIFADDR: /* FALLTHROUGH */ |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
221 #endif |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
222 #ifdef SIOCSIFHWADDR |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
223 case SIOCSIFHWADDR: /* FALLTHROUGH */ |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
224 #endif |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
225 #ifdef SIOCGIFPRIORITY |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
226 case SIOCGIFPRIORITY: /* FALLTHROUGH */ |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
227 #endif |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
228 case SIOCSIFFLAGS: /* FALLTHROUGH */ |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
229 case SIOCGIFMTU: /* FALLTHROUGH */ |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
230 case SIOCSIFMTU: |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
231 break; |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
232 default: |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
233 errno = EPERM; |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
234 return -1; |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
235 } |
|
52a4070231c6
privsep: Filter ioctls to a known list.
Roy Marples <roy@marples.name>
parents:
5242
diff
changeset
|
236 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
237 s = socket(PF_INET, SOCK_DGRAM, 0); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
238 if (s != -1) |
|
4948
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
239 #ifdef IOCTL_REQUEST_TYPE |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
240 { |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
241 ioctl_request_t reqt; |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
242 |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
243 memcpy(&reqt, &req, sizeof(reqt)); |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
244 err = ioctl(s, reqt, data, len); |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
245 } |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
246 #else |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
247 err = ioctl(s, req, data, len); |
|
4948
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
248 #endif |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
249 else |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
250 err = -1; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
251 if (s != -1) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
252 close(s); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
253 return err; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
254 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
255 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
256 static ssize_t |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
257 ps_root_run_script(struct dhcpcd_ctx *ctx, const void *data, size_t len) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
258 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
259 const char *envbuf = data; |
|
5255
ee23398a68db
dhcpcd: Move the script file from per interface to global context
Roy Marples <roy@marples.name>
parents:
5253
diff
changeset
|
260 char * const argv[] = { ctx->script, NULL }; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
261 pid_t pid; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
262 int status; |
|
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 if (len == 0) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
265 return 0; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
266 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
267 if (script_buftoenv(ctx, UNCONST(envbuf), len) == NULL) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
268 return -1; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
269 |
|
5123
9422e8c904d5
scripts: Run with an empty sigmask
Christos Zoulas <christos@zoulas.com>
parents:
5112
diff
changeset
|
270 pid = script_exec(argv, ctx->script_env); |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
271 if (pid == -1) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
272 return -1; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
273 /* Wait for the script to finish */ |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
274 while (waitpid(pid, &status, 0) == -1) { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
275 if (errno != EINTR) { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
276 logerr(__func__); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
277 status = 0; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
278 break; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
279 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
280 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
281 return status; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
282 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
283 |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
284 static bool |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
285 ps_root_validpath(const struct dhcpcd_ctx *ctx, uint16_t cmd, const char *path) |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
286 { |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
287 |
|
5267
95976721c27d
privsep: Avoid the /proc/../ escape
Roy Marples <roy@marples.name>
parents:
5263
diff
changeset
|
288 /* Avoid a previous directory attack to avoid /proc/../ |
|
95976721c27d
privsep: Avoid the /proc/../ escape
Roy Marples <roy@marples.name>
parents:
5263
diff
changeset
|
289 * dhcpcd should never use a path with double dots. */ |
|
95976721c27d
privsep: Avoid the /proc/../ escape
Roy Marples <roy@marples.name>
parents:
5263
diff
changeset
|
290 if (strstr(path, "..") != NULL) |
|
95976721c27d
privsep: Avoid the /proc/../ escape
Roy Marples <roy@marples.name>
parents:
5263
diff
changeset
|
291 return false; |
|
95976721c27d
privsep: Avoid the /proc/../ escape
Roy Marples <roy@marples.name>
parents:
5263
diff
changeset
|
292 |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
293 if (cmd == PS_READFILE) { |
|
5309
700fa2afe696
Fix installing the embedded config as a file.
Roy Marples <roy@marples.name>
parents:
5306
diff
changeset
|
294 #ifdef EMBEDDED_CONFIG |
|
700fa2afe696
Fix installing the embedded config as a file.
Roy Marples <roy@marples.name>
parents:
5306
diff
changeset
|
295 if (strcmp(ctx->cffile, EMBEDDED_CONFIG) == 0) |
|
700fa2afe696
Fix installing the embedded config as a file.
Roy Marples <roy@marples.name>
parents:
5306
diff
changeset
|
296 return true; |
|
700fa2afe696
Fix installing the embedded config as a file.
Roy Marples <roy@marples.name>
parents:
5306
diff
changeset
|
297 #endif |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
298 if (strcmp(ctx->cffile, path) == 0) |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
299 return true; |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
300 } |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
301 if (strncmp(DBDIR, path, strlen(DBDIR)) == 0) |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
302 return true; |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
303 if (strncmp(RUNDIR, path, strlen(RUNDIR)) == 0) |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
304 return true; |
|
5258
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
305 |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
306 #ifdef __linux__ |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
307 if (strncmp("/proc/net/", path, strlen("/proc/net/")) == 0 || |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
308 strncmp("/proc/sys/net/", path, strlen("/proc/sys/net/")) == 0 || |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
309 strncmp("/sys/class/net/", path, strlen("/sys/class/net/")) == 0) |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
310 return true; |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
311 #endif |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
312 |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
313 errno = EPERM; |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
314 return false; |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
315 } |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
316 |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
317 static ssize_t |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
318 ps_root_dowritefile(const struct dhcpcd_ctx *ctx, |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
319 mode_t mode, void *data, size_t len) |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
320 { |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
321 char *file = data, *nc; |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
322 |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
323 nc = memchr(file, '\0', len); |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
324 if (nc == NULL) { |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
325 errno = EINVAL; |
|
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
326 return -1; |
|
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
327 } |
|
5258
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
328 |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
329 if (!ps_root_validpath(ctx, PS_WRITEFILE, file)) |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
330 return -1; |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
331 nc++; |
|
5208
6e53055c9989
Fix compile warnings with prior.
Roy Marples <roy@marples.name>
parents:
5207
diff
changeset
|
332 return writefile(file, mode, nc, len - (size_t)(nc - file)); |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
333 } |
|
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
334 |
|
5299
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
335 #ifdef AUTH |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
336 static ssize_t |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
337 ps_root_monordm(uint64_t *rdm, size_t len) |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
338 { |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
339 |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
340 if (len != sizeof(*rdm)) { |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
341 errno = EINVAL; |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
342 return -1; |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
343 } |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
344 return auth_get_rdm_monotonic(rdm); |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
345 } |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
346 #endif |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
347 |
|
5316
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
348 #ifdef PRIVSEP_GETIFADDRS |
|
5491
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
349 #define IFA_NADDRS 4 |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
350 static ssize_t |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
351 ps_root_dogetifaddrs(void **rdata, size_t *rlen) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
352 { |
|
5491
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
353 struct ifaddrs *ifaddrs, *ifa; |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
354 size_t len; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
355 uint8_t *buf, *sap; |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
356 socklen_t salen; |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
357 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
358 if (getifaddrs(&ifaddrs) == -1) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
359 return -1; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
360 if (ifaddrs == NULL) { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
361 *rdata = NULL; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
362 *rlen = 0; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
363 return 0; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
364 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
365 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
366 /* Work out the buffer length required. |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
367 * Ensure everything is aligned correctly, which does |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
368 * create a larger buffer than what is needed to send, |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
369 * but makes creating the same structure in the client |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
370 * much easier. */ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
371 len = 0; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
372 for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
373 len += ALIGN(sizeof(*ifa)); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
374 len += ALIGN(IFNAMSIZ); |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
375 len += ALIGN(sizeof(salen) * IFA_NADDRS); |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
376 if (ifa->ifa_addr != NULL) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
377 len += ALIGN(sa_len(ifa->ifa_addr)); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
378 if (ifa->ifa_netmask != NULL) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
379 len += ALIGN(sa_len(ifa->ifa_netmask)); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
380 if (ifa->ifa_broadaddr != NULL) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
381 len += ALIGN(sa_len(ifa->ifa_broadaddr)); |
|
5491
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
382 #ifdef BSD |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
383 /* |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
384 * On BSD we need to carry ifa_data so we can access |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
385 * if_data->ifi_link_state |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
386 */ |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
387 if (ifa->ifa_addr != NULL && |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
388 ifa->ifa_addr->sa_family == AF_LINK) |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
389 len += ALIGN(sizeof(struct if_data)); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
390 #endif |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
391 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
392 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
393 /* Use calloc to set everything to zero. |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
394 * This satisfies memory sanitizers because don't write |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
395 * where we don't need to. */ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
396 buf = calloc(1, len); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
397 if (buf == NULL) { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
398 freeifaddrs(ifaddrs); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
399 return -1; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
400 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
401 *rdata = buf; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
402 *rlen = len; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
403 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
404 for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
405 memcpy(buf, ifa, sizeof(*ifa)); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
406 buf += ALIGN(sizeof(*ifa)); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
407 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
408 strlcpy((char *)buf, ifa->ifa_name, IFNAMSIZ); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
409 buf += ALIGN(IFNAMSIZ); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
410 sap = buf; |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
411 buf += ALIGN(sizeof(salen) * IFA_NADDRS); |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
412 |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
413 #define COPYINSA(addr) \ |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
414 do { \ |
|
5491
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
415 if ((addr) != NULL) \ |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
416 salen = sa_len((addr)); \ |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
417 else \ |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
418 salen = 0; \ |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
419 if (salen != 0) { \ |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
420 memcpy(sap, &salen, sizeof(salen)); \ |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
421 memcpy(buf, (addr), salen); \ |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
422 buf += ALIGN(salen); \ |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
423 } \ |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
424 sap += sizeof(salen); \ |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
425 } while (0 /*CONSTCOND */) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
426 |
|
5491
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
427 COPYINSA(ifa->ifa_addr); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
428 COPYINSA(ifa->ifa_netmask); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
429 COPYINSA(ifa->ifa_broadaddr); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
430 |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
431 #ifdef BSD |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
432 if (ifa->ifa_addr != NULL && |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
433 ifa->ifa_addr->sa_family == AF_LINK) |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
434 { |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
435 salen = (socklen_t)sizeof(struct if_data); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
436 memcpy(buf, ifa->ifa_data, salen); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
437 buf += ALIGN(salen); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
438 } else |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
439 #endif |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
440 salen = 0; |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
441 memcpy(sap, &salen, sizeof(salen)); |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
442 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
443 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
444 freeifaddrs(ifaddrs); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
445 return 0; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
446 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
447 #endif |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
448 |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
449 static ssize_t |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
450 ps_root_recvmsgcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
451 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
452 struct dhcpcd_ctx *ctx = arg; |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
453 uint16_t cmd; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
454 struct ps_process *psp; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
455 struct iovec *iov = msg->msg_iov; |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
456 void *data = iov->iov_base, *rdata = NULL; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
457 size_t len = iov->iov_len, rlen = 0; |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
458 uint8_t buf[PS_BUFLEN]; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
459 time_t mtime; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
460 ssize_t err; |
|
5253
7a0d53acbb06
privsep: Validate UDP ports
Roy Marples <roy@marples.name>
parents:
5249
diff
changeset
|
461 bool free_rdata = false; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
462 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
463 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
|
464 psp = ps_findprocess(ctx, &psm->ps_id); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
465 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
466 #ifdef PRIVSEP_DEBUG |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
467 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
|
468 #endif |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
469 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
470 if (psp != NULL) { |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
471 if (psm->ps_cmd & PS_STOP) { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
472 int ret = ps_dostop(ctx, &psp->psp_pid, &psp->psp_fd); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
473 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
474 ps_freeprocess(psp); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
475 return ret; |
|
5297
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
476 } else if (psm->ps_cmd & PS_START) { |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
477 /* Process has already started .... */ |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
478 return 0; |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
479 } |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
480 |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
481 err = ps_sendpsmmsg(ctx, psp->psp_fd, psm, msg); |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
482 if (err == -1) { |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
483 logerr("%s: failed to send message to pid %d", |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
484 __func__, psp->psp_pid); |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
485 shutdown(psp->psp_fd, SHUT_RDWR); |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
486 close(psp->psp_fd); |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
487 psp->psp_fd = -1; |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
488 ps_freeprocess(psp); |
|
477edd06fea7
privsep: harden process handling
Roy Marples <roy@marples.name>
parents:
5293
diff
changeset
|
489 } |
|
5242
0dd9b7f7cf6b
privsep: Ensure we don't scribble garbage to BPF
Roy Marples <roy@marples.name>
parents:
5231
diff
changeset
|
490 return 0; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
491 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
492 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
493 if (psm->ps_cmd & PS_STOP && psp == NULL) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
494 return 0; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
495 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
496 switch (cmd) { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
497 #ifdef INET |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
498 #ifdef ARP |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
499 case PS_BPF_ARP: /* FALLTHROUGH */ |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
500 #endif |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
501 case PS_BPF_BOOTP: |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
502 return ps_bpf_cmd(ctx, psm, msg); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
503 #endif |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
504 #ifdef INET |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
505 case PS_BOOTP: |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
506 return ps_inet_cmd(ctx, psm, msg); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
507 #endif |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
508 #ifdef INET6 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
509 #ifdef DHCP6 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
510 case PS_DHCP6: /* FALLTHROUGH */ |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
511 #endif |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
512 case PS_ND: |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
513 return ps_inet_cmd(ctx, psm, msg); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
514 #endif |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
515 default: |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
516 break; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
517 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
518 |
|
5204
47f18579daae
privsep: Implement pledge(2) support as found on OpenBSD
Roy Marples <roy@marples.name>
parents:
5202
diff
changeset
|
519 assert(msg->msg_iovlen == 0 || msg->msg_iovlen == 1); |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
520 |
|
4844
2281307b0ef5
privsep: Expect errors from ioctl so dont log them.
Roy Marples <roy@marples.name>
parents:
4840
diff
changeset
|
521 /* Reset errno */ |
|
2281307b0ef5
privsep: Expect errors from ioctl so dont log them.
Roy Marples <roy@marples.name>
parents:
4840
diff
changeset
|
522 errno = 0; |
|
2281307b0ef5
privsep: Expect errors from ioctl so dont log them.
Roy Marples <roy@marples.name>
parents:
4840
diff
changeset
|
523 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
524 switch (psm->ps_cmd) { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
525 case PS_IOCTL: |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
526 err = ps_root_doioctl(psm->ps_flags, data, len); |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
527 if (err != -1) { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
528 rdata = data; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
529 rlen = len; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
530 } |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
531 break; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
532 case PS_SCRIPT: |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
533 err = ps_root_run_script(ctx, data, len); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
534 break; |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
535 case PS_UNLINK: |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
536 if (!ps_root_validpath(ctx, psm->ps_cmd, data)) { |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
537 err = -1; |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
538 break; |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
539 } |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
540 err = unlink(data); |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
541 break; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
542 case PS_READFILE: |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
543 if (!ps_root_validpath(ctx, psm->ps_cmd, data)) { |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
544 err = -1; |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
545 break; |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
546 } |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
547 err = readfile(data, buf, sizeof(buf)); |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
548 if (err != -1) { |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
549 rdata = buf; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
550 rlen = (size_t)err; |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
551 } |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
552 break; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
553 case PS_WRITEFILE: |
|
5249
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
554 err = ps_root_dowritefile(ctx, (mode_t)psm->ps_flags, |
|
a8c2969955f9
privsep: Only allow file IO to specific paths
Roy Marples <roy@marples.name>
parents:
5246
diff
changeset
|
555 data, len); |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
556 break; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
557 case PS_FILEMTIME: |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
558 err = filemtime(data, &mtime); |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
559 if (err != -1) { |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
560 rdata = &mtime; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
561 rlen = sizeof(mtime); |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
562 } |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
563 break; |
|
5299
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
564 #ifdef AUTH |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
565 case PS_AUTH_MONORDM: |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
566 err = ps_root_monordm(data, len); |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
567 if (err != -1) { |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
568 rdata = data; |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
569 rlen = len; |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
570 } |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
571 break; |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
572 #endif |
|
5316
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
573 #ifdef PRIVSEP_GETIFADDRS |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
574 case PS_GETIFADDRS: |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
575 err = ps_root_dogetifaddrs(&rdata, &rlen); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
576 free_rdata = true; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
577 break; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
578 #endif |
|
5286
b820f26385b7
Fix compile with inet or inet6 disabled
Roy Marples <roy@marples.name>
parents:
5267
diff
changeset
|
579 #if defined(INET6) && (defined(__linux__) || defined(HAVE_PLEDGE)) |
|
5258
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
580 case PS_IP6FORWARDING: |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
581 err = ip6_forwarding(data); |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
582 break; |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
583 #endif |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
584 #ifdef PLUGIN_DEV |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
585 case PS_DEV_INITTED: |
|
5457
7fb0274b9127
Linux: detect network namespace and deny udev in one
Roy Marples <roy@marples.name>
parents:
5425
diff
changeset
|
586 err = dev_initialised(ctx, data); |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
587 break; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
588 case PS_DEV_LISTENING: |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
589 err = dev_listening(ctx); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
590 break; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
591 #endif |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
592 default: |
|
5302
ef799c0ff5cb
privsep: Fix returning indirect ioctl data
Roy Marples <roy@marples.name>
parents:
5301
diff
changeset
|
593 err = ps_root_os(psm, msg, &rdata, &rlen); |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
594 break; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
595 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
596 |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
597 err = ps_root_writeerror(ctx, err, rlen != 0 ? rdata : 0, rlen); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
598 if (free_rdata) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
599 free(rdata); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
600 return err; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
601 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
602 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
603 /* Receive from state engine, do an action. */ |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
604 static void |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
605 ps_root_recvmsg(void *arg) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
606 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
607 struct dhcpcd_ctx *ctx = arg; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
608 |
|
5306
d10b3ad73215
privsep: Log ECONNRESET errors again
Roy Marples <roy@marples.name>
parents:
5304
diff
changeset
|
609 if (ps_recvpsmsg(ctx, ctx->ps_root_fd, ps_root_recvmsgcb, ctx) == -1) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
610 logerr(__func__); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
611 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
612 |
|
5262
f168a25dd330
privsep: Fix compile for prior without dev plugins
Roy Marples <roy@marples.name>
parents:
5260
diff
changeset
|
613 #ifdef PLUGIN_DEV |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
614 static int |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
615 ps_root_handleinterface(void *arg, int action, const char *ifname) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
616 { |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
617 struct dhcpcd_ctx *ctx = arg; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
618 unsigned long flag; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
619 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
620 if (action == 1) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
621 flag = PS_DEV_IFADDED; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
622 else if (action == -1) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
623 flag = PS_DEV_IFREMOVED; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
624 else if (action == 0) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
625 flag = PS_DEV_IFUPDATED; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
626 else { |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
627 errno = EINVAL; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
628 return -1; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
629 } |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
630 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
631 return (int)ps_sendcmd(ctx, ctx->ps_data_fd, PS_DEV_IFCMD, flag, |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
632 ifname, strlen(ifname) + 1); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
633 } |
|
5262
f168a25dd330
privsep: Fix compile for prior without dev plugins
Roy Marples <roy@marples.name>
parents:
5260
diff
changeset
|
634 #endif |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
635 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
636 static int |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
637 ps_root_startcb(void *arg) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
638 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
639 struct dhcpcd_ctx *ctx = arg; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
640 |
|
5169
f1a2ce25a64b
dhcpcd: Fix separation of per interface and per family
Roy Marples <roy@marples.name>
parents:
5123
diff
changeset
|
641 if (ctx->options & DHCPCD_MASTER) |
|
f1a2ce25a64b
dhcpcd: Fix separation of per interface and per family
Roy Marples <roy@marples.name>
parents:
5123
diff
changeset
|
642 setproctitle("[privileged actioneer]"); |
|
f1a2ce25a64b
dhcpcd: Fix separation of per interface and per family
Roy Marples <roy@marples.name>
parents:
5123
diff
changeset
|
643 else |
|
f1a2ce25a64b
dhcpcd: Fix separation of per interface and per family
Roy Marples <roy@marples.name>
parents:
5123
diff
changeset
|
644 setproctitle("[privileged actioneer] %s%s%s", |
|
f1a2ce25a64b
dhcpcd: Fix separation of per interface and per family
Roy Marples <roy@marples.name>
parents:
5123
diff
changeset
|
645 ctx->ifv[0], |
|
f1a2ce25a64b
dhcpcd: Fix separation of per interface and per family
Roy Marples <roy@marples.name>
parents:
5123
diff
changeset
|
646 ctx->options & DHCPCD_IPV4 ? " [ip4]" : "", |
|
f1a2ce25a64b
dhcpcd: Fix separation of per interface and per family
Roy Marples <roy@marples.name>
parents:
5123
diff
changeset
|
647 ctx->options & DHCPCD_IPV6 ? " [ip6]" : ""); |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
648 ctx->ps_root_pid = getpid(); |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
649 ctx->options |= DHCPCD_PRIVSEPROOT; |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
650 |
|
5417
96a086beb655
Revert "privsep: shutdown read end of the write only sockets"
Roy Marples <roy@marples.name>
parents:
5408
diff
changeset
|
651 /* Open network sockets for sending. |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
652 * This is a small bit wasteful for non sandboxed OS's |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
653 * but makes life very easy for unicasting DHCPv6 in non master |
|
5421
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
654 * mode as we no longer care about address selection. |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
655 * We can't call shutdown SHUT_RD on the socket because it's |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
656 * not connectd. All we can do is try and set a zero sized |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
657 * receive buffer and just let it overflow. |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
658 * Reading from it just to drain it is a waste of CPU time. */ |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
659 #ifdef INET |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
660 if (ctx->options & DHCPCD_IPV4) { |
|
5422
66a1c1c34366
Use a minimum bufsize of 1 as 0 doesn't work on some OS.
Roy Marples <roy@marples.name>
parents:
5421
diff
changeset
|
661 int buflen = 1; |
|
5421
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
662 |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
663 ctx->udp_wfd = xsocket(PF_INET, |
|
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
664 SOCK_RAW | SOCK_CXNB, IPPROTO_UDP); |
|
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
665 if (ctx->udp_wfd == -1) |
|
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
666 logerr("%s: dhcp_openraw", __func__); |
|
5421
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
667 else if (setsockopt(ctx->udp_wfd, SOL_SOCKET, SO_RCVBUF, |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
668 &buflen, sizeof(buflen)) == -1) |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
669 logerr("%s: setsockopt SO_RCVBUF DHCP", __func__); |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
670 } |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
671 #endif |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
672 #ifdef INET6 |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
673 if (ctx->options & DHCPCD_IPV6) { |
|
5422
66a1c1c34366
Use a minimum bufsize of 1 as 0 doesn't work on some OS.
Roy Marples <roy@marples.name>
parents:
5421
diff
changeset
|
674 int buflen = 1; |
|
5421
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
675 |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
676 ctx->nd_fd = ipv6nd_open(false); |
|
5330
7b6f2daea002
privsep: Fix bogus warnings without inet.
Roy Marples <roy@marples.name>
parents:
5329
diff
changeset
|
677 if (ctx->nd_fd == -1) |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
678 logerr("%s: ipv6nd_open", __func__); |
|
5421
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
679 else if (setsockopt(ctx->nd_fd, SOL_SOCKET, SO_RCVBUF, |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
680 &buflen, sizeof(buflen)) == -1) |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
681 logerr("%s: setsockopt SO_RCVBUF ND", __func__); |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
682 } |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
683 #endif |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
684 #ifdef DHCP6 |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
685 if (ctx->options & DHCPCD_IPV6) { |
|
5422
66a1c1c34366
Use a minimum bufsize of 1 as 0 doesn't work on some OS.
Roy Marples <roy@marples.name>
parents:
5421
diff
changeset
|
686 int buflen = 1; |
|
5421
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
687 |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
688 ctx->dhcp6_wfd = dhcp6_openraw(); |
|
5330
7b6f2daea002
privsep: Fix bogus warnings without inet.
Roy Marples <roy@marples.name>
parents:
5329
diff
changeset
|
689 if (ctx->dhcp6_wfd == -1) |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
690 logerr("%s: dhcp6_openraw", __func__); |
|
5421
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
691 else if (setsockopt(ctx->dhcp6_wfd, SOL_SOCKET, SO_RCVBUF, |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
692 &buflen, sizeof(buflen)) == -1) |
|
0229b76cea16
privsep: Set a zero length receive buffer for write only sockets
Roy Marples <roy@marples.name>
parents:
5417
diff
changeset
|
693 logerr("%s: setsockopt SO_RCVBUF DHCP6", __func__); |
|
5293
b161ecf0b891
privsep: Only open raw sockets for the needed protocols.
Roy Marples <roy@marples.name>
parents:
5289
diff
changeset
|
694 } |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
695 #endif |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
696 |
|
5262
f168a25dd330
privsep: Fix compile for prior without dev plugins
Roy Marples <roy@marples.name>
parents:
5260
diff
changeset
|
697 #ifdef PLUGIN_DEV |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
698 /* Start any dev listening plugin which may want to |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
699 * change the interface name provided by the kernel */ |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
700 if ((ctx->options & (DHCPCD_MASTER | DHCPCD_DEV)) == |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
701 (DHCPCD_MASTER | DHCPCD_DEV)) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
702 dev_start(ctx, ps_root_handleinterface); |
|
5262
f168a25dd330
privsep: Fix compile for prior without dev plugins
Roy Marples <roy@marples.name>
parents:
5260
diff
changeset
|
703 #endif |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
704 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
705 return 0; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
706 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
707 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
708 static void |
|
5425
9edfc000a89b
privsep: Only the master process accepts signals
Roy Marples <roy@marples.name>
parents:
5422
diff
changeset
|
709 ps_root_signalcb(int sig, __unused void *arg) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
710 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
711 |
|
5371
0c4a9b4da8e6
privsep: Simplyfy signal handling
Roy Marples <roy@marples.name>
parents:
5367
diff
changeset
|
712 if (sig == SIGCHLD) { |
|
5304
04f26d9f1885
privsep: Don't wait for the process to finish when stopping it
Roy Marples <roy@marples.name>
parents:
5302
diff
changeset
|
713 while (waitpid(-1, NULL, WNOHANG) > 0) |
|
04f26d9f1885
privsep: Don't wait for the process to finish when stopping it
Roy Marples <roy@marples.name>
parents:
5302
diff
changeset
|
714 ; |
|
04f26d9f1885
privsep: Don't wait for the process to finish when stopping it
Roy Marples <roy@marples.name>
parents:
5302
diff
changeset
|
715 return; |
|
04f26d9f1885
privsep: Don't wait for the process to finish when stopping it
Roy Marples <roy@marples.name>
parents:
5302
diff
changeset
|
716 } |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
717 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
718 |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
719 int (*handle_interface)(void *, int, const char *); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
720 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
721 #ifdef PLUGIN_DEV |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
722 static ssize_t |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
723 ps_root_devcb(struct dhcpcd_ctx *ctx, struct ps_msghdr *psm, struct msghdr *msg) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
724 { |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
725 int action; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
726 struct iovec *iov = msg->msg_iov; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
727 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
728 if (msg->msg_iovlen != 1) { |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
729 errno = EINVAL; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
730 return -1; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
731 } |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
732 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
733 switch(psm->ps_flags) { |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
734 case PS_DEV_IFADDED: |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
735 action = 1; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
736 break; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
737 case PS_DEV_IFREMOVED: |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
738 action = -1; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
739 break; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
740 case PS_DEV_IFUPDATED: |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
741 action = 0; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
742 break; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
743 default: |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
744 errno = EINVAL; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
745 return -1; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
746 } |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
747 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
748 return dhcpcd_handleinterface(ctx, action, iov->iov_base); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
749 } |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
750 #endif |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
751 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
752 static ssize_t |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
753 ps_root_dispatchcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
754 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
755 struct dhcpcd_ctx *ctx = arg; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
756 ssize_t err; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
757 |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
758 switch(psm->ps_cmd) { |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
759 #ifdef PLUGIN_DEV |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
760 case PS_DEV_IFCMD: |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
761 err = ps_root_devcb(ctx, psm, msg); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
762 break; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
763 #endif |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
764 default: |
|
5286
b820f26385b7
Fix compile with inet or inet6 disabled
Roy Marples <roy@marples.name>
parents:
5267
diff
changeset
|
765 #ifdef INET |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
766 err = ps_bpf_dispatch(ctx, psm, msg); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
767 if (err == -1 && errno == ENOTSUP) |
|
5112
899adcd7f449
Fix build without INET or INET6
Roy Marples <roy@marples.name>
parents:
5060
diff
changeset
|
768 #endif |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
769 err = ps_inet_dispatch(ctx, psm, msg); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
770 } |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
771 return err; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
772 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
773 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
774 static void |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
775 ps_root_dispatch(void *arg) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
776 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
777 struct dhcpcd_ctx *ctx = arg; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
778 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
779 if (ps_recvpsmsg(ctx, ctx->ps_data_fd, ps_root_dispatchcb, ctx) == -1) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
780 logerr(__func__); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
781 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
782 |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
783 static void |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
784 ps_root_syslog(void *arg) |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
785 { |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
786 struct dhcpcd_ctx *ctx = arg; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
787 |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
788 if (loghandlesyslogfd(ctx->ps_syslog_fd) == -1) |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
789 logerr(__func__); |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
790 } |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
791 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
792 pid_t |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
793 ps_root_start(struct dhcpcd_ctx *ctx) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
794 { |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
795 int logfd[2], datafd[2]; |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
796 pid_t pid; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
797 |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
798 if (xsocketpair(AF_UNIX, SOCK_DGRAM | SOCK_CXNB, 0, logfd) == -1) |
|
5321
41b99a2a12cf
privsep: Limit rights generically rather than Capsicum specifc
Roy Marples <roy@marples.name>
parents:
5316
diff
changeset
|
799 return -1; |
|
41b99a2a12cf
privsep: Limit rights generically rather than Capsicum specifc
Roy Marples <roy@marples.name>
parents:
5316
diff
changeset
|
800 #ifdef PRIVSEP_RIGHTS |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
801 if (ps_rights_limit_fdpair(logfd) == -1) |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
802 return -1; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
803 #endif |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
804 |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
805 if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_CXNB, 0, datafd) == -1) |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
806 return -1; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
807 if (ps_setbuf_fdpair(datafd) == -1) |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
808 return -1; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
809 #ifdef PRIVSEP_RIGHTS |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
810 if (ps_rights_limit_fdpair(datafd) == -1) |
|
5321
41b99a2a12cf
privsep: Limit rights generically rather than Capsicum specifc
Roy Marples <roy@marples.name>
parents:
5316
diff
changeset
|
811 return -1; |
|
41b99a2a12cf
privsep: Limit rights generically rather than Capsicum specifc
Roy Marples <roy@marples.name>
parents:
5316
diff
changeset
|
812 #endif |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
813 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
814 pid = ps_dostart(ctx, &ctx->ps_root_pid, &ctx->ps_root_fd, |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
815 ps_root_recvmsg, NULL, ctx, |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
816 ps_root_startcb, ps_root_signalcb, 0); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
817 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
818 if (pid == 0) { |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
819 ctx->ps_syslog_fd = logfd[1]; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
820 if (eloop_event_add(ctx->eloop, ctx->ps_syslog_fd, |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
821 ps_root_syslog, ctx) == -1) |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
822 return -1; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
823 close(logfd[0]); |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
824 ctx->ps_data_fd = datafd[1]; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
825 close(datafd[0]); |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
826 return 0; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
827 } else if (pid == -1) |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
828 return -1; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
829 |
|
5525
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
830 logsetsyslogfd(logfd[0]); |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
831 close(logfd[1]); |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
832 |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
833 ctx->ps_data_fd = datafd[0]; |
|
26b5d9bc2985
privsep: Send all log messages to the privileged actioneer
Roy Marples <roy@marples.name>
parents:
5491
diff
changeset
|
834 close(datafd[1]); |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
835 if (eloop_event_add(ctx->eloop, ctx->ps_data_fd, |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
836 ps_root_dispatch, ctx) == -1) |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
837 return -1; |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
838 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
839 if ((ctx->ps_eloop = eloop_new()) == NULL) |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
840 return -1; |
|
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
841 |
| 5301 | 842 eloop_signal_set_cb(ctx->ps_eloop, |
|
4851
b615d58905ad
privsep: Use another eloop instead of a blocking read.
Roy Marples <roy@marples.name>
parents:
4844
diff
changeset
|
843 dhcpcd_signals, dhcpcd_signals_len, |
|
5367
fce20bebb28a
privsep: Use root signal_cb for all signals here.
Roy Marples <roy@marples.name>
parents:
5365
diff
changeset
|
844 ps_root_signalcb, ctx); |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5225
diff
changeset
|
845 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
846 return pid; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
847 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
848 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
849 int |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
850 ps_root_stop(struct dhcpcd_ctx *ctx) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
851 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
852 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
853 return ps_dostop(ctx, &ctx->ps_root_pid, &ctx->ps_root_fd); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
854 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
855 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
856 ssize_t |
|
5255
ee23398a68db
dhcpcd: Move the script file from per interface to global context
Roy Marples <roy@marples.name>
parents:
5253
diff
changeset
|
857 ps_root_script(struct dhcpcd_ctx *ctx, const void *data, size_t len) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
858 { |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
859 |
|
5255
ee23398a68db
dhcpcd: Move the script file from per interface to global context
Roy Marples <roy@marples.name>
parents:
5253
diff
changeset
|
860 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_SCRIPT, 0, data, len) == -1) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
861 return -1; |
|
5255
ee23398a68db
dhcpcd: Move the script file from per interface to global context
Roy Marples <roy@marples.name>
parents:
5253
diff
changeset
|
862 return ps_root_readerror(ctx, NULL, 0); |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
863 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
864 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
865 ssize_t |
|
4948
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
866 ps_root_ioctl(struct dhcpcd_ctx *ctx, ioctl_request_t req, void *data, |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
867 size_t len) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
868 { |
|
4948
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
869 #ifdef IOCTL_REQUEST_TYPE |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
870 unsigned long ulreq = 0; |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
871 |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
872 memcpy(&ulreq, &req, sizeof(req)); |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
873 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_IOCTL, ulreq, data, len) == -1) |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
874 return -1; |
|
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
875 #else |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
876 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_IOCTL, req, data, len) == -1) |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
877 return -1; |
|
4948
b664b38faf10
ioctl: The POSIX signature differs from BSD and glibc
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
878 #endif |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
879 return ps_root_readerror(ctx, data, len); |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
880 } |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
881 |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
882 ssize_t |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
883 ps_root_unlink(struct dhcpcd_ctx *ctx, const char *file) |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
884 { |
|
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
885 |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
886 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_UNLINK, 0, |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
887 file, strlen(file) + 1) == -1) |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
888 return -1; |
|
5202
318cd9e48312
privsep: Copy back ioctl data
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
889 return ps_root_readerror(ctx, NULL, 0); |
|
4989
ca9234046989
privsep: chroot the master process
Roy Marples <roy@marples.name>
parents:
4948
diff
changeset
|
890 } |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
891 |
|
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
892 ssize_t |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
893 ps_root_readfile(struct dhcpcd_ctx *ctx, const char *file, |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
894 void *data, size_t len) |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
895 { |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
896 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_READFILE, 0, |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
897 file, strlen(file) + 1) == -1) |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
898 return -1; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
899 return ps_root_readerror(ctx, data, len); |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
900 } |
|
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
901 |
|
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
902 ssize_t |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
903 ps_root_writefile(struct dhcpcd_ctx *ctx, const char *file, mode_t mode, |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
904 const void *data, size_t len) |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
905 { |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
906 char buf[PS_BUFLEN]; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
907 size_t flen; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
908 |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
909 flen = strlcpy(buf, file, sizeof(buf)); |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
910 flen += 1; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
911 if (flen > sizeof(buf) || flen + len > sizeof(buf)) { |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
912 errno = ENOBUFS; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
913 return -1; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
914 } |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
915 memcpy(buf + flen, data, len); |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
916 |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
917 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_WRITEFILE, mode, |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
918 buf, flen + len) == -1) |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
919 return -1; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
920 return ps_root_readerror(ctx, NULL, 0); |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
921 } |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
922 |
|
5208
6e53055c9989
Fix compile warnings with prior.
Roy Marples <roy@marples.name>
parents:
5207
diff
changeset
|
923 ssize_t |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
924 ps_root_filemtime(struct dhcpcd_ctx *ctx, const char *file, time_t *time) |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
925 { |
|
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
926 |
|
5207
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
927 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_FILEMTIME, 0, |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
928 file, strlen(file) + 1) == -1) |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
929 return -1; |
|
84b63f09c8a4
privsep: Handle all file IO in the Priviledged Actioneer
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
930 return ps_root_readerror(ctx, time, sizeof(*time)); |
|
4991
45bd88c307ed
privsep: copy configuration file into chroot
Roy Marples <roy@marples.name>
parents:
4989
diff
changeset
|
931 } |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
932 |
|
5316
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
933 #ifdef PRIVSEP_GETIFADDRS |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
934 int |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
935 ps_root_getifaddrs(struct dhcpcd_ctx *ctx, struct ifaddrs **ifahead) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
936 { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
937 struct ifaddrs *ifa; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
938 void *buf = NULL; |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
939 char *bp, *sap; |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
940 socklen_t salen; |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
941 size_t len; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
942 ssize_t err; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
943 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
944 if (ps_sendcmd(ctx, ctx->ps_root_fd, |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
945 PS_GETIFADDRS, 0, NULL, 0) == -1) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
946 return -1; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
947 err = ps_root_mreaderror(ctx, &buf, &len); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
948 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
949 if (err == -1) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
950 return -1; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
951 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
952 /* Should be impossible - lo0 will always exist. */ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
953 if (len == 0) { |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
954 *ifahead = NULL; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
955 return 0; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
956 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
957 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
958 bp = buf; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
959 *ifahead = (struct ifaddrs *)(void *)bp; |
|
5316
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
960 for (ifa = *ifahead; ifa != NULL; ifa = ifa->ifa_next) { |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
961 if (len < ALIGN(sizeof(*ifa)) + |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
962 ALIGN(IFNAMSIZ) + ALIGN(sizeof(salen) * IFA_NADDRS)) |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
963 goto err; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
964 bp += ALIGN(sizeof(*ifa)); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
965 ifa->ifa_name = bp; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
966 bp += ALIGN(IFNAMSIZ); |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
967 sap = bp; |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
968 bp += ALIGN(sizeof(salen) * IFA_NADDRS); |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
969 len -= ALIGN(sizeof(*ifa)) + |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
970 ALIGN(IFNAMSIZ) + ALIGN(sizeof(salen) * IFA_NADDRS); |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
971 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
972 #define COPYOUTSA(addr) \ |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
973 do { \ |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
974 memcpy(&salen, sap, sizeof(salen)); \ |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
975 if (len < salen) \ |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
976 goto err; \ |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
977 if (salen != 0) { \ |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
978 (addr) = (struct sockaddr *)bp; \ |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
979 bp += ALIGN(salen); \ |
|
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
980 len -= ALIGN(salen); \ |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
981 } \ |
|
5225
2b18af138e24
privsep: sockaddr len should be socklen_t
Roy Marples <roy@marples.name>
parents:
5224
diff
changeset
|
982 sap += sizeof(salen); \ |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
983 } while (0 /* CONSTCOND */) |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
984 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
985 COPYOUTSA(ifa->ifa_addr); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
986 COPYOUTSA(ifa->ifa_netmask); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
987 COPYOUTSA(ifa->ifa_broadaddr); |
|
5491
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
988 |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
989 memcpy(&salen, sap, sizeof(salen)); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
990 if (len < salen) |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
991 goto err; |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
992 if (salen != 0) { |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
993 ifa->ifa_data = bp; |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
994 bp += ALIGN(salen); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
995 len -= ALIGN(salen); |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
996 } else |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
997 ifa->ifa_data = NULL; |
|
6cd47402148f
privsep: We now need to carry ifa_data for BSD
Roy Marples <roy@marples.name>
parents:
5457
diff
changeset
|
998 |
|
5316
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
999 if (len != 0) |
|
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
1000 ifa->ifa_next = (struct ifaddrs *)(void *)bp; |
|
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
1001 else |
|
0a99cd624a1c
Linux: make resource limits work by using getifaddrs over privsep
Roy Marples <roy@marples.name>
parents:
5309
diff
changeset
|
1002 ifa->ifa_next = NULL; |
|
5223
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1003 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1004 return 0; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1005 |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1006 err: |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1007 free(buf); |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1008 *ifahead = NULL; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1009 errno = EINVAL; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1010 return -1; |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1011 } |
|
333f66ce84bd
privsep: Add a generic wrapper for getifaddrs(3)
Roy Marples <roy@marples.name>
parents:
5208
diff
changeset
|
1012 #endif |
|
5258
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1013 |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1014 #if defined(__linux__) || defined(HAVE_PLEDGE) |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1015 ssize_t |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1016 ps_root_ip6forwarding(struct dhcpcd_ctx *ctx, const char *ifname) |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1017 { |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1018 |
| 5263 | 1019 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_IP6FORWARDING, 0, |
| 1020 ifname, ifname != NULL ? strlen(ifname) + 1 : 0) == -1) | |
|
5258
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1021 return -1; |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1022 return ps_root_readerror(ctx, NULL, 0); |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1023 } |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5255
diff
changeset
|
1024 #endif |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1025 |
|
5299
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1026 #ifdef AUTH |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1027 int |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1028 ps_root_getauthrdm(struct dhcpcd_ctx *ctx, uint64_t *rdm) |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1029 { |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1030 |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1031 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_AUTH_MONORDM, 0, |
| 5350 | 1032 rdm, sizeof(*rdm))== -1) |
|
5299
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1033 return -1; |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1034 return (int)ps_root_readerror(ctx, rdm, sizeof(*rdm)); |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1035 } |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1036 #endif |
|
b7e676ac73c1
privsep: Access the RDM monotic file via IPC
Roy Marples <roy@marples.name>
parents:
5297
diff
changeset
|
1037 |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1038 #ifdef PLUGIN_DEV |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1039 int |
|
5457
7fb0274b9127
Linux: detect network namespace and deny udev in one
Roy Marples <roy@marples.name>
parents:
5425
diff
changeset
|
1040 ps_root_dev_initialised(struct dhcpcd_ctx *ctx, const char *ifname) |
|
5260
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1041 { |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1042 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1043 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_DEV_INITTED, 0, |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1044 ifname, strlen(ifname) + 1)== -1) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1045 return -1; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1046 return (int)ps_root_readerror(ctx, NULL, 0); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1047 } |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1048 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1049 int |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1050 ps_root_dev_listening(struct dhcpcd_ctx * ctx) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1051 { |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1052 |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1053 if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_DEV_LISTENING, 0, NULL, 0)== -1) |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1054 return -1; |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1055 return (int)ps_root_readerror(ctx, NULL, 0); |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1056 } |
|
7571d82b48da
privsep: Allow dev plugins to work
Roy Marples <roy@marples.name>
parents:
5258
diff
changeset
|
1057 #endif |
