lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 14 Sep 2009 11:29:01 +0800 From: Wu Fengguang <fengguang.wu@...el.com> To: Andrew Morton <akpm@...ux-foundation.org> Cc: "mtosatti@...hat.com" <mtosatti@...hat.com>, "gregkh@...e.de" <gregkh@...e.de>, "broonie@...nsource.wolfsonmicro.com" <broonie@...nsource.wolfsonmicro.com>, "johannes@...solutions.net" <johannes@...solutions.net>, "avi@...ranet.com" <avi@...ranet.com>, "andi@...stfloor.org" <andi@...stfloor.org>, "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org> Subject: [PATCH] devmem: handle partial kmem write/read Current vwrite silently ignores vwrite() to vmap holes. Better behavior should be stop the write and return on such holes. Also return on partial read, which may happen in future (eg. hit hwpoison pages). CC: Andi Kleen <andi@...stfloor.org> Signed-off-by: Wu Fengguang <fengguang.wu@...el.com> --- drivers/char/mem.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) --- linux-mm.orig/drivers/char/mem.c 2009-09-14 10:59:50.000000000 +0800 +++ linux-mm/drivers/char/mem.c 2009-09-14 11:06:25.000000000 +0800 @@ -444,18 +444,22 @@ static ssize_t read_kmem(struct file *fi if (!kbuf) return -ENOMEM; while (count > 0) { + unsigned long n; + sz = size_inside_page(p, count); - sz = vread(kbuf, (char *)p, sz); - if (!sz) + n = vread(kbuf, (char *)p, sz); + if (!n) break; - if (copy_to_user(buf, kbuf, sz)) { + if (copy_to_user(buf, kbuf, n)) { free_page((unsigned long)kbuf); return -EFAULT; } - count -= sz; - buf += sz; - read += sz; - p += sz; + count -= n; + buf += n; + read += n; + p += n; + if (n < sz) + break; } free_page((unsigned long)kbuf); } @@ -551,11 +555,13 @@ static ssize_t write_kmem(struct file * free_page((unsigned long)kbuf); return -EFAULT; } - sz = vwrite(kbuf, (char *)p, sz); - count -= sz; - buf += sz; - virtr += sz; - p += sz; + n = vwrite(kbuf, (char *)p, sz); + count -= n; + buf += n; + virtr += n; + p += n; + if (n < sz) + break; } free_page((unsigned long)kbuf); } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists