Implement ->proc_write_buf() so procfs copies in what is written before
it pins the entry, and look at the first character of that copy. Writes
larger than PAGE_SIZE - 1 bytes fail with -EINVAL now.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
kernel/locking/lockdep_proc.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/kernel/locking/lockdep_proc.c b/kernel/locking/lockdep_proc.c
index 9b034b5b94bd..2a66ea09c2aa 100644
--- a/kernel/locking/lockdep_proc.c
+++ b/kernel/locking/lockdep_proc.c
@@ -669,18 +669,14 @@ static int lock_stat_open(struct inode *inode, struct file *file)
return 0;
}
-static ssize_t lock_stat_write(struct file *file, const char __user *buf,
- size_t count, loff_t *ppos)
+static ssize_t lock_stat_write(struct file *file, char *buf, size_t count,
+ loff_t *ppos)
{
struct lock_class *class;
unsigned long idx;
- char c;
if (count) {
- if (get_user(c, buf))
- return -EFAULT;
-
- if (c != '0')
+ if (buf[0] != '0')
return count;
iterate_lock_classes(idx, class) {@@ -703,7 +699,7 @@ static int lock_stat_release(struct inode *inode, struct file *file)
static const struct proc_ops lock_stat_proc_ops = {
.proc_seq_ops = &lockstat_ops,
.proc_open = lock_stat_open,
- .proc_write = lock_stat_write,
+ .proc_write_buf = lock_stat_write,
.proc_release = lock_stat_release,
};
#endif /* CONFIG_LOCK_STAT */
--
2.53.0