From 7b0e6a564fa562a4aa91dbf703916b4ca47c86d9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 10 Jun 2014 13:50:44 -0700 Subject: [PATCH] 3.4-stable patches added patches: mm-highmem-don-t-treat-pkmap_addr-last_pkmap-as-a-highmem-address.patch --- ...addr-last_pkmap-as-a-highmem-address.patch | 42 +++++++++++++++++++ queue-3.4/series | 1 + 2 files changed, 43 insertions(+) create mode 100644 queue-3.4/mm-highmem-don-t-treat-pkmap_addr-last_pkmap-as-a-highmem-address.patch 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 index 00000000000..77a06ae50d2 --- /dev/null +++ b/queue-3.4/mm-highmem-don-t-treat-pkmap_addr-last_pkmap-as-a-highmem-address.patch @@ -0,0 +1,42 @@ +From 498c2280212327858e521e9d21345d4cc2637f54 Mon Sep 17 00:00:00 2001 +From: Will Deacon +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 + +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 +Cc: Mel Gorman +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Cc: Yijing Wang +Signed-off-by: Greg Kroah-Hartman + +--- + 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]); + } diff --git a/queue-3.4/series b/queue-3.4/series index 56ec69a17ab..1d512a20642 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -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 -- 2.47.3