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
