Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kernel/kcov: unproxify debugfs file's fops

Since commit 49d200deaa68 ("debugfs: prevent access to removed files'
private data"), a debugfs file's file_operations methods get proxied
through lifetime aware wrappers.

However, only a certain subset of the file_operations members is supported
by debugfs and ->mmap isn't among them -- it appears to be NULL from the
VFS layer's perspective.

This behaviour breaks the /sys/kernel/debug/kcov file introduced
concurrently with commit 5c9a8750a640 ("kernel: add kcov code coverage").

Since that file never gets removed, there is no file removal race and thus,
a lifetime checking proxy isn't needed.

Avoid the proxying for /sys/kernel/debug/kcov by creating it via
debugfs_create_file_unsafe() rather than debugfs_create_file().

Fixes: 49d200deaa68 ("debugfs: prevent access to removed files' private data")
Fixes: 5c9a8750a640 ("kernel: add kcov code coverage")
Reported-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Nicolai Stange <nicstange@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Nicolai Stange and committed by
Greg Kroah-Hartman
df4565f9 5edb5649

+6 -1
+6 -1
kernel/kcov.c
··· 264 264 265 265 static int __init kcov_init(void) 266 266 { 267 - if (!debugfs_create_file("kcov", 0600, NULL, NULL, &kcov_fops)) { 267 + /* 268 + * The kcov debugfs file won't ever get removed and thus, 269 + * there is no need to protect it against removal races. The 270 + * use of debugfs_create_file_unsafe() is actually safe here. 271 + */ 272 + if (!debugfs_create_file_unsafe("kcov", 0600, NULL, NULL, &kcov_fops)) { 268 273 pr_err("failed to create kcov in debugfs\n"); 269 274 return -ENOMEM; 270 275 }