Patch "drivers: char: mem: Fix thinkos in kmem address checks" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
drivers: char: mem: Fix thinkos in kmem address checks
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drivers-char-mem-fix-thinkos-in-kmem-address-checks.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
488debb9971bc7d0edd6d8080ba78ca02a04f6c4Mon Sep 17 00:00:00 2001
From: Robin Murphy <[email protected]>
Date: Thu, 5 Jan 2017 17:15:01 +0000
Subject: drivers: char: mem: Fix thinkos in kmem address checks
From: Robin Murphy <[email protected]>
commit 488debb9971bc7d0edd6d8080ba78ca02a04f6c4 upstream.
When borrowing the pfn_valid() check from mmap_kmem(), somebody managed to get physical and virtual addresses spectacularly muddled up, such that we've ended up with checks for one being the other. Whilst this does indeed prevent out-of-bounds accesses crashing, on most systems it also prevents the more desirable use-case of working at all ever.
Check the *virtual* offset correctly for what it is. Furthermore, do so in the right place - a read or write may span multiple pages, so a single up-front check is insufficient. High memory accesses already have a similar validity check just before the copy_to_user() call, so just make the low memory path fully consistent with that.
--- drivers/char/mem.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/char/mem.c +4 -6
@@ -381,9 +381,6 @@ static ssize_t read_kmem(struct file *fichar *kbuf;/* k-addr because vread() takes vmlist_lock rwlock */ int err =0 ; -if (!pfn_valid (PFN_DOWN (p))) -return -EIO ; - read =0 ;if (p < (unsigned long ) high_memory) { low_count = count;
@@ -412,6 +409,8 @@ static ssize_t read_kmem(struct file *fi* by the kernel or data corruption may occur */ kbuf =xlate_dev_kmem_ptr ((void *)p); +if (!virt_addr_valid (kbuf)) +return -ENXIO ;if (copy_to_user (buf, kbuf, sz))return -EFAULT ;
@@ -482,6 +481,8 @@ static ssize_t do_write_kmem(unsigned lo* corruption may occur. */ ptr =xlate_dev_kmem_ptr ((void *)p); +if (!virt_addr_valid (ptr)) +return -ENXIO ; copied =copy_from_user (ptr, buf, sz);if (copied) {
@@ -512,9 +513,6 @@ static ssize_t write_kmem(struct file *fchar *kbuf;/* k-addr because vwrite() takes vmlist_lock rwlock */ int err =0 ; -if (!pfn_valid (PFN_DOWN (p))) -return -EIO ; -if (p < (unsigned long ) high_memory) { unsigned long to_write = min_t(unsigned long, count, (unsigned long )high_memory - p);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/drivers-char-mem-fix-thinkos-in-kmem-address-checks.patch