1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 /* 2 /* 3 * Capability utilities 3 * Capability utilities 4 */ 4 */ 5 5 6 #include "cap.h" !! 6 #ifdef HAVE_LIBCAP_SUPPORT 7 #include "debug.h" << 8 #include <errno.h> << 9 #include <string.h> << 10 #include <linux/capability.h> << 11 #include <sys/syscall.h> << 12 #include <unistd.h> << 13 7 14 #define MAX_LINUX_CAPABILITY_U32S _LINUX_CAPAB !! 8 #include "cap.h" >> 9 #include <stdbool.h> >> 10 #include <sys/capability.h> 15 11 16 bool perf_cap__capable(int cap, bool *used_roo !! 12 bool perf_cap__capable(cap_value_t cap) 17 { 13 { 18 struct __user_cap_header_struct header !! 14 cap_flag_value_t val; 19 .version = _LINUX_CAPABILITY_V !! 15 cap_t caps = cap_get_proc(); 20 .pid = 0, !! 16 21 }; !! 17 if (!caps) 22 struct __user_cap_data_struct data[MAX !! 18 return false; 23 __u32 cap_val; !! 19 24 !! 20 if (cap_get_flag(caps, cap, CAP_EFFECTIVE, &val) != 0) 25 *used_root = false; !! 21 val = CAP_CLEAR; 26 while (syscall(SYS_capget, &header, &d !! 22 27 /* Retry, first attempt has se !! 23 if (cap_free(caps) != 0) 28 if (errno == EINVAL && header. !! 24 return false; 29 header.version == _LINUX_C !! 25 30 continue; !! 26 return val == CAP_SET; 31 << 32 pr_debug2("capget syscall fail << 33 strerror(errno), err << 34 *used_root = true; << 35 return geteuid() == 0; << 36 } << 37 << 38 /* Extract the relevant capability bit << 39 if (cap >= 32) { << 40 if (header.version == _LINUX_C << 41 cap_val = data[1].effe << 42 } else { << 43 /* Capability beyond 3 << 44 return false; << 45 } << 46 } else { << 47 cap_val = data[0].effective; << 48 } << 49 return (cap_val & (1 << (cap & 0x1f))) << 50 } 27 } >> 28 >> 29 #endif /* HAVE_LIBCAP_SUPPORT */ 51 30
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.