| From 329aee3c0115d32e36b23a2bd048a069aa490069 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 14 Sep 2021 23:38:37 +0900 |
| Subject: kprobes: Do not use local variable when creating debugfs file |
| |
| From: Punit Agrawal <punitagrawal@gmail.com> |
| |
| [ Upstream commit 8f7262cd66699a4b02eb7549b35c81b2116aad95 ] |
| |
| debugfs_create_file() takes a pointer argument that can be used during |
| file operation callbacks (accessible via i_private in the inode |
| structure). An obvious requirement is for the pointer to refer to |
| valid memory when used. |
| |
| When creating the debugfs file to dynamically enable / disable |
| kprobes, a pointer to local variable is passed to |
| debugfs_create_file(); which will go out of scope when the init |
| function returns. The reason this hasn't triggered random memory |
| corruption is because the pointer is not accessed during the debugfs |
| file callbacks. |
| |
| Since the enabled state is managed by the kprobes_all_disabled global |
| variable, the local variable is not needed. Fix the incorrect (and |
| unnecessary) usage of local variable during debugfs_file_create() by |
| passing NULL instead. |
| |
| Link: https://lkml.kernel.org/r/163163031686.489837.4476867635937014973.stgit@devnote2 |
| |
| Fixes: bf8f6e5b3e51 ("Kprobes: The ON/OFF knob thru debugfs") |
| Signed-off-by: Punit Agrawal <punitagrawal@gmail.com> |
| Acked-by: Masami Hiramatsu <mhiramat@kernel.org> |
| Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/kprobes.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| diff --git a/kernel/kprobes.c b/kernel/kprobes.c |
| index a7812c115e487..1668439b269d3 100644 |
| --- a/kernel/kprobes.c |
| +++ b/kernel/kprobes.c |
| @@ -2712,14 +2712,13 @@ static const struct file_operations fops_kp = { |
| static int __init debugfs_kprobe_init(void) |
| { |
| struct dentry *dir; |
| - unsigned int value = 1; |
| |
| dir = debugfs_create_dir("kprobes", NULL); |
| |
| debugfs_create_file("list", 0400, dir, NULL, |
| &debugfs_kprobes_operations); |
| |
| - debugfs_create_file("enabled", 0600, dir, &value, &fops_kp); |
| + debugfs_create_file("enabled", 0600, dir, NULL, &fops_kp); |
| |
| debugfs_create_file("blacklist", 0400, dir, NULL, |
| &debugfs_kprobe_blacklist_ops); |
| -- |
| 2.33.0 |
| |