Path: blob/master/tools/testing/selftests/bpf/cap_helpers.c
26285 views
// SPDX-License-Identifier: GPL-2.01#include "cap_helpers.h"23/* Avoid including <sys/capability.h> from the libcap-devel package,4* so directly declare them here and use them from glibc.5*/6int capget(cap_user_header_t header, cap_user_data_t data);7int capset(cap_user_header_t header, const cap_user_data_t data);89int cap_enable_effective(__u64 caps, __u64 *old_caps)10{11struct __user_cap_data_struct data[_LINUX_CAPABILITY_U32S_3];12struct __user_cap_header_struct hdr = {13.version = _LINUX_CAPABILITY_VERSION_3,14};15__u32 cap0 = caps;16__u32 cap1 = caps >> 32;17int err;1819err = capget(&hdr, data);20if (err)21return -errno;2223if (old_caps)24*old_caps = (__u64)(data[1].effective) << 32 | data[0].effective;2526if ((data[0].effective & cap0) == cap0 &&27(data[1].effective & cap1) == cap1)28return 0;2930data[0].effective |= cap0;31data[1].effective |= cap1;32err = capset(&hdr, data);33if (err)34return -errno;3536return 0;37}3839int cap_disable_effective(__u64 caps, __u64 *old_caps)40{41struct __user_cap_data_struct data[_LINUX_CAPABILITY_U32S_3];42struct __user_cap_header_struct hdr = {43.version = _LINUX_CAPABILITY_VERSION_3,44};45__u32 cap0 = caps;46__u32 cap1 = caps >> 32;47int err;4849err = capget(&hdr, data);50if (err)51return -errno;5253if (old_caps)54*old_caps = (__u64)(data[1].effective) << 32 | data[0].effective;5556if (!(data[0].effective & cap0) && !(data[1].effective & cap1))57return 0;5859data[0].effective &= ~cap0;60data[1].effective &= ~cap1;61err = capset(&hdr, data);62if (err)63return -errno;6465return 0;66}676869