]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 1 Aug 2015 00:02:44 +0000 (17:02 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 1 Aug 2015 00:02:44 +0000 (17:02 -0700)
added patches:
mm-avoid-setting-up-anonymous-pages-into-file-mapping.patch

queue-4.1/mm-avoid-setting-up-anonymous-pages-into-file-mapping.patch [new file with mode: 0644]
queue-4.1/series

diff --git a/queue-4.1/mm-avoid-setting-up-anonymous-pages-into-file-mapping.patch b/queue-4.1/mm-avoid-setting-up-anonymous-pages-into-file-mapping.patch
new file mode 100644 (file)
index 0000000..f4b4699
--- /dev/null
@@ -0,0 +1,76 @@
+From 6b7339f4c31ad69c8e9c0b2859276e22cf72176d Mon Sep 17 00:00:00 2001
+From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
+Date: Mon, 6 Jul 2015 23:18:37 +0300
+Subject: mm: avoid setting up anonymous pages into file mapping
+
+From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
+
+commit 6b7339f4c31ad69c8e9c0b2859276e22cf72176d upstream.
+
+Reading page fault handler code I've noticed that under right
+circumstances kernel would map anonymous pages into file mappings: if
+the VMA doesn't have vm_ops->fault() and the VMA wasn't fully populated
+on ->mmap(), kernel would handle page fault to not populated pte with
+do_anonymous_page().
+
+Let's change page fault handler to use do_anonymous_page() only on
+anonymous VMA (->vm_ops == NULL) and make sure that the VMA is not
+shared.
+
+For file mappings without vm_ops->fault() or shred VMA without vm_ops,
+page fault on pte_none() entry would lead to SIGBUS.
+
+Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Acked-by: Oleg Nesterov <oleg@redhat.com>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: Willy Tarreau <w@1wt.eu>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ mm/memory.c |   20 +++++++++++++-------
+ 1 file changed, 13 insertions(+), 7 deletions(-)
+
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -2669,6 +2669,10 @@ static int do_anonymous_page(struct mm_s
+       pte_unmap(page_table);
++      /* File mapping without ->vm_ops ? */
++      if (vma->vm_flags & VM_SHARED)
++              return VM_FAULT_SIGBUS;
++
+       /* Check if we need to add a guard page to the stack */
+       if (check_stack_guard_page(vma, address) < 0)
+               return VM_FAULT_SIGSEGV;
+@@ -3097,6 +3101,9 @@ static int do_fault(struct mm_struct *mm
+                       - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
+       pte_unmap(page_table);
++      /* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */
++      if (!vma->vm_ops->fault)
++              return VM_FAULT_SIGBUS;
+       if (!(flags & FAULT_FLAG_WRITE))
+               return do_read_fault(mm, vma, address, pmd, pgoff, flags,
+                               orig_pte);
+@@ -3242,13 +3249,12 @@ static int handle_pte_fault(struct mm_st
+       barrier();
+       if (!pte_present(entry)) {
+               if (pte_none(entry)) {
+-                      if (vma->vm_ops) {
+-                              if (likely(vma->vm_ops->fault))
+-                                      return do_fault(mm, vma, address, pte,
+-                                                      pmd, flags, entry);
+-                      }
+-                      return do_anonymous_page(mm, vma, address,
+-                                               pte, pmd, flags);
++                      if (vma->vm_ops)
++                              return do_fault(mm, vma, address, pte, pmd,
++                                              flags, entry);
++
++                      return do_anonymous_page(mm, vma, address, pte, pmd,
++                                      flags);
+               }
+               return do_swap_page(mm, vma, address,
+                                       pte, pmd, flags, entry);
index 6c87c890adbefa1901709fcf80153daca701b744..cb17703615e125dc0d8e00f361437e3ed62d23a6 100644 (file)
@@ -265,3 +265,4 @@ arm-8397-1-fix-vdsomunge-not-to-depend-on-glibc-specific-error.h.patch
 hpfs-kstrdup-out-of-memory-handling.patch
 hpfs-hpfs_error-remove-static-buffer-use-vsprintf-extension-pv-instead.patch
 fix-firmware-loader-uevent-buffer-null-pointer-dereference.patch
+mm-avoid-setting-up-anonymous-pages-into-file-mapping.patch