From 86ea9a217618598743fbaba9032f9dd9798ef4d7 Mon Sep 17 00:00:00 2001 From: Wu Fengguang Date: Mon, 14 Dec 2009 17:58:08 -0800 Subject: [PATCH] --- yaml --- r: 176235 b: refs/heads/master c: fa29e97bb8c70fd7f564acbed3422403cee10ab7 h: refs/heads/master i: 176233: ad68871ceed4c46425bf7ca028da1f29a4ab2cc0 176231: 38cb07bfb9cc44d046f5ba606196c8a6c2c08ccc v: v3 --- [refs] | 2 +- trunk/drivers/char/mem.c | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 1fc0806dae8a..33ed146dca8c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f222318e9c3a315723e3524fb9d6566b2430db44 +refs/heads/master: fa29e97bb8c70fd7f564acbed3422403cee10ab7 diff --git a/trunk/drivers/char/mem.c b/trunk/drivers/char/mem.c index aaa9c24d4c14..c6b2fbc5ed47 100644 --- a/trunk/drivers/char/mem.c +++ b/trunk/drivers/char/mem.c @@ -154,6 +154,8 @@ static ssize_t read_mem(struct file * file, char __user * buf, #endif while (count > 0) { + unsigned long remaining; + sz = size_inside_page(p, count); if (!range_is_allowed(p >> PAGE_SHIFT, count)) @@ -168,12 +170,10 @@ static ssize_t read_mem(struct file * file, char __user * buf, if (!ptr) return -EFAULT; - if (copy_to_user(buf, ptr, sz)) { - unxlate_dev_mem_ptr(p, ptr); - return -EFAULT; - } - + remaining = copy_to_user(buf, ptr, sz); unxlate_dev_mem_ptr(p, ptr); + if (remaining) + return -EFAULT; buf += sz; p += sz; @@ -231,16 +231,14 @@ static ssize_t write_mem(struct file * file, const char __user * buf, } copied = copy_from_user(ptr, buf, sz); + unxlate_dev_mem_ptr(p, ptr); if (copied) { written += sz - copied; - unxlate_dev_mem_ptr(p, ptr); if (written) break; return -EFAULT; } - unxlate_dev_mem_ptr(p, ptr); - buf += sz; p += sz; count -= sz;