39#include <sys/capsicum.h>
43#include <sys/kernel.h>
44#include <machine/stdarg.h>
54#define assert(exp) KASSERT((exp), ("%s:%u", __func__, __LINE__))
156#define CAPARSIZE_MIN (CAP_RIGHTS_VERSION_00 + 2)
157#define CAPARSIZE_MAX (CAP_RIGHTS_VERSION + 2)
162 static const int bit2idx[] = {
163 -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1,
164 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
168 idx = CAPIDXBIT(right);
169 assert(idx >= 0 && idx <
sizeof(bit2idx) /
sizeof(bit2idx[0]));
170 return (bit2idx[idx]);
179 assert(CAPVER(rights) == CAP_RIGHTS_VERSION_00);
181 n = CAPARSIZE(rights);
185 right = (uint64_t)va_arg(ap,
unsigned long long);
188 assert(CAPRVER(right) == 0);
192 assert(CAPIDXBIT(rights->cr_rights[i]) == CAPIDXBIT(right));
193 rights->cr_rights[i] |= right;
194 assert(CAPIDXBIT(rights->cr_rights[i]) == CAPIDXBIT(right));
204 assert(CAPVER(rights) == CAP_RIGHTS_VERSION_00);
206 n = CAPARSIZE(rights);
210 right = (uint64_t)va_arg(ap,
unsigned long long);
213 assert(CAPRVER(right) == 0);
217 assert(CAPIDXBIT(rights->cr_rights[i]) == CAPIDXBIT(right));
218 rights->cr_rights[i] &= ~(right & 0x01FFFFFFFFFFFFFFULL);
219 assert(CAPIDXBIT(rights->cr_rights[i]) == CAPIDXBIT(right));
229 assert(CAPVER(rights) == CAP_RIGHTS_VERSION_00);
231 n = CAPARSIZE(rights);
235 right = (uint64_t)va_arg(ap,
unsigned long long);
238 assert(CAPRVER(right) == 0);
242 assert(CAPIDXBIT(rights->cr_rights[i]) == CAPIDXBIT(right));
243 if ((rights->cr_rights[i] & right) != right)
253 unsigned int n __unused;
256 assert(version == CAP_RIGHTS_VERSION_00);
261 va_start(ap, rights);
273 assert(CAPVER(rights) == CAP_RIGHTS_VERSION_00);
275 va_start(ap, rights);
287 assert(CAPVER(rights) == CAP_RIGHTS_VERSION_00);
289 va_start(ap, rights);
302 assert(CAPVER(rights) == CAP_RIGHTS_VERSION_00);
304 va_start(ap, rights);
314 cap_rights_t allrights;
317 if (CAPVER(rights) != CAP_RIGHTS_VERSION_00)
324 if (!cap_rights_contains(&allrights, rights))
326 for (i = 0; i < CAPARSIZE(rights); i++) {
331 if (CAPRVER(rights->cr_rights[i]) != 0)
344 assert(CAPVER(dst) == CAP_RIGHTS_VERSION_00);
345 assert(CAPVER(
src) == CAP_RIGHTS_VERSION_00);
353 for (i = 0; i < n; i++)
354 dst->cr_rights[i] |=
src->cr_rights[i];
367 assert(CAPVER(dst) == CAP_RIGHTS_VERSION_00);
368 assert(CAPVER(
src) == CAP_RIGHTS_VERSION_00);
376 for (i = 0; i < n; i++) {
378 ~(
src->cr_rights[i] & 0x01FFFFFFFFFFFFFFULL);
389cap_rights_contains(
const cap_rights_t *big,
const cap_rights_t *little)
393 assert(CAPVER(big) == CAP_RIGHTS_VERSION_00);
394 assert(CAPVER(little) == CAP_RIGHTS_VERSION_00);
395 assert(CAPVER(big) == CAPVER(little));
400 for (i = 0; i < n; i++) {
401 if ((big->cr_rights[i] & little->cr_rights[i]) !=
402 little->cr_rights[i]) {
struct intr_irqsrc ** src
static bool kasan_enabled __read_mostly
static void cap_rights_sysinit(void *arg)
cap_rights_t * cap_rights_remove(cap_rights_t *dst, const cap_rights_t *src)
__read_mostly cap_rights_t cap_send_connect_rights
bool __cap_rights_is_set(const cap_rights_t *rights,...)
__read_mostly cap_rights_t cap_renameat_source_rights
__read_mostly cap_rights_t cap_unlinkat_rights
__read_mostly cap_rights_t cap_linkat_target_rights
__read_mostly cap_rights_t cap_connect_rights
__read_mostly cap_rights_t cap_recv_rights
__read_mostly cap_rights_t cap_fchown_rights
__read_mostly cap_rights_t cap_fchdir_rights
__read_mostly cap_rights_t cap_event_rights
__read_mostly cap_rights_t cap_chflags_rights
__read_mostly cap_rights_t cap_bind_rights
__read_mostly cap_rights_t cap_setsockopt_rights
__read_mostly cap_rights_t cap_fexecve_rights
__read_mostly cap_rights_t cap_accept_rights
__read_mostly cap_rights_t cap_mkdirat_rights
cap_rights_t * __cap_rights_set(cap_rights_t *rights,...)
__read_mostly cap_rights_t cap_getpeername_rights
static bool cap_rights_is_vset(const cap_rights_t *rights, va_list ap)
__read_mostly cap_rights_t cap_no_rights
SYSINIT(cap_rights_sysinit, SI_SUB_COPYRIGHT, SI_ORDER_ANY, cap_rights_sysinit, NULL)
__read_mostly cap_rights_t cap_flock_rights
__read_mostly cap_rights_t cap_listen_rights
__read_mostly cap_rights_t cap_shutdown_rights
__read_mostly cap_rights_t cap_mmap_rights
__read_mostly cap_rights_t cap_write_rights
__read_mostly cap_rights_t cap_pread_rights
__read_mostly cap_rights_t cap_symlinkat_rights
__read_mostly cap_rights_t cap_pdgetpid_rights
__read_mostly cap_rights_t cap_fcntl_rights
cap_rights_t * __cap_rights_clear(cap_rights_t *rights,...)
__read_mostly cap_rights_t cap_getsockname_rights
__read_mostly cap_rights_t cap_mknodat_rights
__read_mostly cap_rights_t cap_renameat_target_rights
__read_mostly cap_rights_t cap_mkfifoat_rights
cap_rights_t * __cap_rights_init(int version, cap_rights_t *rights,...)
bool cap_rights_is_valid(const cap_rights_t *rights)
__read_mostly cap_rights_t cap_pdkill_rights
__read_mostly cap_rights_t cap_pwrite_rights
static __inline int right_to_index(uint64_t right)
__read_mostly cap_rights_t cap_futimes_rights
__read_mostly cap_rights_t cap_ioctl_rights
__read_mostly cap_rights_t cap_fchflags_rights
__read_mostly cap_rights_t cap_fsync_rights
static void cap_rights_vclear(cap_rights_t *rights, va_list ap)
__read_mostly cap_rights_t cap_fchmod_rights
__read_mostly cap_rights_t cap_getsockopt_rights
__read_mostly cap_rights_t cap_fstatfs_rights
__read_mostly cap_rights_t cap_send_rights
__read_mostly cap_rights_t cap_seek_rights
__read_mostly cap_rights_t cap_ftruncate_rights
__read_mostly cap_rights_t cap_linkat_source_rights
static void cap_rights_vset(cap_rights_t *rights, va_list ap)
cap_rights_t * cap_rights_merge(cap_rights_t *dst, const cap_rights_t *src)
__read_mostly cap_rights_t cap_fpathconf_rights
__read_mostly cap_rights_t cap_fstat_rights
__read_mostly cap_rights_t cap_read_rights