| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * ksyms_common.c: A split of kernel/kallsyms.c |
| * Contains a few generic function definations independent of config KALLSYMS. |
| */ |
| #include <linux/kallsyms.h> |
| #include <linux/security.h> |
| |
| static inline int kallsyms_for_perf(void) |
| { |
| #ifdef CONFIG_PERF_EVENTS |
| extern int sysctl_perf_event_paranoid; |
| |
| if (sysctl_perf_event_paranoid <= 1) |
| return 1; |
| #endif |
| return 0; |
| } |
| |
| /* |
| * We show kallsyms information even to normal users if we've enabled |
| * kernel profiling and are explicitly not paranoid (so kptr_restrict |
| * is clear, and sysctl_perf_event_paranoid isn't set). |
| * |
| * Otherwise, require CAP_SYSLOG (assuming kptr_restrict isn't set to |
| * block even that). |
| */ |
| bool kallsyms_show_value(const struct cred *cred) |
| { |
| switch (kptr_restrict) { |
| case 0: |
| if (kallsyms_for_perf()) |
| return true; |
| fallthrough; |
| case 1: |
| if (security_capable(cred, &init_user_ns, CAP_SYSLOG, |
| CAP_OPT_NOAUDIT) == 0) |
| return true; |
| fallthrough; |
| default: |
| return false; |
| } |
| } |