Implement ->proc_write_buf() for the mconsole and exitcode files so
procfs copies in what is written before it pins the entry. Writes larger
than PAGE_SIZE - 1 bytes fail with -EINVAL now.

exitcode parses procfs' copy as is, so it no longer stops at the first
six bytes of what is written.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 arch/um/drivers/mconsole_kern.c | 11 ++---------
 arch/um/kernel/exitcode.c       | 14 ++++----------
 2 files changed, 6 insertions(+), 19 deletions(-)

diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
index f01b7d8a07bc..a4370470286f 100644
--- a/arch/um/drivers/mconsole_kern.c
+++ b/arch/um/drivers/mconsole_kern.c
@@ -769,21 +769,14 @@ static int __init mconsole_init(void)
 __initcall(mconsole_init);
 
 static ssize_t mconsole_proc_write(struct file *file,
-               const char __user *buffer, size_t count, loff_t *pos)
+               char *buf, size_t count, loff_t *pos)
 {
-       char *buf;
-
-       buf = memdup_user_nul(buffer, count);
-       if (IS_ERR(buf))
-               return PTR_ERR(buf);
-
        mconsole_notify(notify_socket, MCONSOLE_USER_NOTIFY, buf, count);
-       kfree(buf);
        return count;
 }
 
 static const struct proc_ops mconsole_proc_ops = {
-       .proc_write     = mconsole_proc_write,
+       .proc_write_buf = mconsole_proc_write,
        .proc_lseek     = noop_llseek,
 };
 
diff --git a/arch/um/kernel/exitcode.c b/arch/um/kernel/exitcode.c
index c71657df38f5..8f76e3b20c18 100644
--- a/arch/um/kernel/exitcode.c
+++ b/arch/um/kernel/exitcode.c
@@ -32,18 +32,12 @@ static int exitcode_proc_show(struct seq_file *m, void *v)
 }
 
 static ssize_t exitcode_proc_write(struct file *file,
-               const char __user *buffer, size_t count, loff_t *pos)
+               char *buffer, size_t count, loff_t *pos)
 {
-       char *end, buf[sizeof("nnnnn\0")];
-       size_t size;
+       char *end;
        int tmp;
 
-       size = min(count, sizeof(buf) - 1);
-       if (copy_from_user(buf, buffer, size))
-               return -EFAULT;
-       buf[size] = '\0';
-
-       tmp = simple_strtol(buf, &end, 0);
+       tmp = simple_strtol(buffer, &end, 0);
        if ((*end != '\0') && !isspace(*end))
                return -EINVAL;
 
@@ -53,7 +47,7 @@ static ssize_t exitcode_proc_write(struct file *file,
 
 static const struct proc_ops exitcode_proc_ops = {
        .proc_show      = exitcode_proc_show,
-       .proc_write     = exitcode_proc_write,
+       .proc_write_buf = exitcode_proc_write,
 };
 
 static int make_proc_exitcode(void)

-- 
2.53.0

Reply via email to