From fdd0311863b32b42bb2c54e60c987bbbabc0c430 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Sun, 5 Mar 2017 00:56:38 -0800 Subject: pstore: Replace arguments for write_buf_user() API Removes argument list in favor of pstore record, though the user buffer remains passed separately since it must carry the __user annotation. Signed-off-by: Kees Cook --- fs/pstore/platform.c | 35 ++++++++++++----------------------- fs/pstore/pmsg.c | 9 ++++++--- fs/pstore/ram.c | 14 +++++--------- 3 files changed, 23 insertions(+), 35 deletions(-) (limited to 'fs/pstore') diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 5eecf9012459..1e6642a2063e 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -639,47 +639,36 @@ static int pstore_write_compat(struct pstore_record *record) return record->psi->write_buf(record); } -static int pstore_write_buf_user_compat(enum pstore_type_id type, - enum kmsg_dump_reason reason, - u64 *id, unsigned int part, - const char __user *buf, - bool compressed, size_t size, - struct pstore_info *psi) +static int pstore_write_buf_user_compat(struct pstore_record *record, + const char __user *buf) { unsigned long flags = 0; - size_t i, bufsize = size; + size_t i, bufsize, total_size = record->size; long ret = 0; - if (unlikely(!access_ok(VERIFY_READ, buf, size))) + if (unlikely(!access_ok(VERIFY_READ, buf, total_size))) return -EFAULT; + bufsize = total_size; if (bufsize > psinfo->bufsize) bufsize = psinfo->bufsize; + record->buf = psinfo->buf; spin_lock_irqsave(&psinfo->buf_lock, flags); - for (i = 0; i < size; ) { - struct pstore_record record = { - .type = type, - .reason = reason, - .id = id, - .part = part, - .buf = psinfo->buf, - .compressed = compressed, - .psi = psi, - }; - size_t c = min(size - i, bufsize); + for (i = 0; i < total_size; ) { + size_t c = min(total_size - i, bufsize); - ret = __copy_from_user(psinfo->buf, buf + i, c); + ret = __copy_from_user(record->buf, buf + i, c); if (unlikely(ret != 0)) { ret = -EFAULT; break; } - record.size = c; - ret = psi->write_buf(&record); + record->size = c; + ret = record->psi->write_buf(record); if (unlikely(ret < 0)) break; i += c; } spin_unlock_irqrestore(&psinfo->buf_lock, flags); - return unlikely(ret < 0) ? ret : size; + return unlikely(ret < 0) ? ret : total_size; } /* diff --git a/fs/pstore/pmsg.c b/fs/pstore/pmsg.c index 78f6176c020f..ce35907602de 100644 --- a/fs/pstore/pmsg.c +++ b/fs/pstore/pmsg.c @@ -23,7 +23,11 @@ static DEFINE_MUTEX(pmsg_lock); static ssize_t write_pmsg(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { - u64 id; + struct pstore_record record = { + .type = PSTORE_TYPE_PMSG, + .size = count, + .psi = psinfo, + }; int ret; if (!count) @@ -34,8 +38,7 @@ static ssize_t write_pmsg(struct file *file, const char __user *buf, return -EFAULT; mutex_lock(&pmsg_lock); - ret = psinfo->write_buf_user(PSTORE_TYPE_PMSG, 0, &id, 0, buf, 0, count, - psinfo); + ret = psinfo->write_buf_user(&record, buf); mutex_unlock(&pmsg_lock); return ret ? ret : count; } diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index a7cdde60b1f9..d85e1adae1b6 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -451,19 +451,15 @@ static int notrace ramoops_pstore_write_buf(struct pstore_record *record) return 0; } -static int notrace ramoops_pstore_write_buf_user(enum pstore_type_id type, - enum kmsg_dump_reason reason, - u64 *id, unsigned int part, - const char __user *buf, - bool compressed, size_t size, - struct pstore_info *psi) +static int notrace ramoops_pstore_write_buf_user(struct pstore_record *record, + const char __user *buf) { - if (type == PSTORE_TYPE_PMSG) { - struct ramoops_context *cxt = psi->data; + if (record->type == PSTORE_TYPE_PMSG) { + struct ramoops_context *cxt = record->psi->data; if (!cxt->mprz) return -ENOMEM; - return persistent_ram_write_user(cxt->mprz, buf, size); + return persistent_ram_write_user(cxt->mprz, buf, record->size); } return -EINVAL; -- cgit