]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Jun 2014 20:50:44 +0000 (13:50 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Jun 2014 20:50:44 +0000 (13:50 -0700)
added patches:
mm-highmem-don-t-treat-pkmap_addr-last_pkmap-as-a-highmem-address.patch

queue-3.4/mm-highmem-don-t-treat-pkmap_addr-last_pkmap-as-a-highmem-address.patch [new file with mode: 0644]
queue-3.4/series

diff --git a/queue-3.4/mm-highmem-don-t-treat-pkmap_addr-last_pkmap-as-a-highmem-address.patch b/queue-3.4/mm-highmem-don-t-treat-pkmap_addr-last_pkmap-as-a-highmem-address.patch
new file mode 100644 (file)
index 0000000..77a06ae
--- /dev/null
@@ -0,0 +1,42 @@
+From 498c2280212327858e521e9d21345d4cc2637f54 Mon Sep 17 00:00:00 2001
+From: Will Deacon <will.deacon@arm.com>
+Date: Fri, 16 Nov 2012 14:15:00 -0800
+Subject: mm: highmem: don't treat PKMAP_ADDR(LAST_PKMAP) as a highmem address
+
+From: Will Deacon <will.deacon@arm.com>
+
+commit 498c2280212327858e521e9d21345d4cc2637f54 upstream.
+
+kmap_to_page returns the corresponding struct page for a virtual address
+of an arbitrary mapping.  This works by checking whether the address
+falls in the pkmap region and using the pkmap page tables instead of the
+linear mapping if appropriate.
+
+Unfortunately, the bounds checking means that PKMAP_ADDR(LAST_PKMAP) is
+incorrectly treated as a highmem address and we can end up walking off
+the end of pkmap_page_table and subsequently passing junk to pte_page.
+
+This patch fixes the bound check to stay within the pkmap tables.
+
+Signed-off-by: Will Deacon <will.deacon@arm.com>
+Cc: Mel Gorman <mgorman@suse.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Yijing Wang <wangyijing@huawei.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ mm/highmem.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/mm/highmem.c
++++ b/mm/highmem.c
+@@ -98,7 +98,7 @@ struct page *kmap_to_page(void *vaddr)
+ {
+       unsigned long addr = (unsigned long)vaddr;
+-      if (addr >= PKMAP_ADDR(0) && addr <= PKMAP_ADDR(LAST_PKMAP)) {
++      if (addr >= PKMAP_ADDR(0) && addr < PKMAP_ADDR(LAST_PKMAP)) {
+               int i = (addr - PKMAP_ADDR(0)) >> PAGE_SHIFT;
+               return pte_page(pkmap_page_table[i]);
+       }
index 56ec69a17ab1ff689f3ec913d9ddab562a3d120e..1d512a2064233033fda4bfb5d02f025b0eae5d2f 100644 (file)
@@ -75,3 +75,4 @@ tty-correct-tty-buffer-flush.patch
 fix-4-port-and-add-support-for-8-port-unknown-pci-serial-port-cards.patch
 8250-16-50-add-support-for-broadcom-trumanage-redirected-serial-port.patch
 tty-serial-add-support-for-altera-serial-port.patch
+mm-highmem-don-t-treat-pkmap_addr-last_pkmap-as-a-highmem-address.patch