summaryrefslogtreecommitdiff
path: root/kernel/kallsyms.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2020-07-26 19:52:16 +0200
committerIngo Molnar <mingo@kernel.org>2020-07-26 19:52:30 +0200
commit2d65685a4a6ff6ef6bfe42717222db92c04224c2 (patch)
tree894aebbf77ce53375e999cd5c6bb34ee5d28bb9f /kernel/kallsyms.c
parentde0038bfaf53af0e8bc4961b7aacdcb79f43bf08 (diff)
parentfbe0d451bcea569fc0ed3455511a90646c8a9c81 (diff)
downloadlwn-2d65685a4a6ff6ef6bfe42717222db92c04224c2.tar.gz
lwn-2d65685a4a6ff6ef6bfe42717222db92c04224c2.zip
Merge branch 'x86/urgent' into x86/cleanups
Refresh the branch for a dependent commit. Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/kallsyms.c')
-rw-r--r--kernel/kallsyms.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index 16c8c605f4b0..bb14e64f62a4 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -644,19 +644,20 @@ static inline int kallsyms_for_perf(void)
* Otherwise, require CAP_SYSLOG (assuming kptr_restrict isn't set to
* block even that).
*/
-int kallsyms_show_value(void)
+bool kallsyms_show_value(const struct cred *cred)
{
switch (kptr_restrict) {
case 0:
if (kallsyms_for_perf())
- return 1;
+ return true;
/* fallthrough */
case 1:
- if (has_capability_noaudit(current, CAP_SYSLOG))
- return 1;
+ if (security_capable(cred, &init_user_ns, CAP_SYSLOG,
+ CAP_OPT_NOAUDIT) == 0)
+ return true;
/* fallthrough */
default:
- return 0;
+ return false;
}
}
@@ -673,7 +674,11 @@ static int kallsyms_open(struct inode *inode, struct file *file)
return -ENOMEM;
reset_iter(iter, 0);
- iter->show_value = kallsyms_show_value();
+ /*
+ * Instead of checking this on every s_show() call, cache
+ * the result here at open time.
+ */
+ iter->show_value = kallsyms_show_value(file->f_cred);
return 0;
}