aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2016-08-02 17:04:54 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-08-02 19:35:15 -0400
commitba093a6d9397da8eafcfbaa7d95bd34255da39a0 (patch)
tree0c949c629283ee48079fa8ee7f545d90dfb7cab3
parent0036d1f7eb95bcc52977f15507f00dd07018e7e2 (diff)
mm: refuse wrapped vm_brk requests
The vm_brk() alignment calculations should refuse to overflow. The ELF loader depending on this, but it has been fixed now. No other unsafe callers have been found. Link: http://lkml.kernel.org/r/1468014494-25291-3-git-send-email-keescook@chromium.org Signed-off-by: Kees Cook <keescook@chromium.org> Reported-by: Hector Marco-Gisbert <hecmargi@upv.es> Cc: Ismael Ripoll Ripoll <iripoll@upv.es> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Chen Gang <gang.chen.5i5j@gmail.com> Cc: Michal Hocko <mhocko@suse.com> Cc: Konstantin Khlebnikov <koct9i@gmail.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/mmap.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/mm/mmap.c b/mm/mmap.c
index d44bee96a5fe..ca9d91bca0d6 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2653,16 +2653,18 @@ static inline void verify_mm_writelocked(struct mm_struct *mm)
2653 * anonymous maps. eventually we may be able to do some 2653 * anonymous maps. eventually we may be able to do some
2654 * brk-specific accounting here. 2654 * brk-specific accounting here.
2655 */ 2655 */
2656static int do_brk(unsigned long addr, unsigned long len) 2656static int do_brk(unsigned long addr, unsigned long request)
2657{ 2657{
2658 struct mm_struct *mm = current->mm; 2658 struct mm_struct *mm = current->mm;
2659 struct vm_area_struct *vma, *prev; 2659 struct vm_area_struct *vma, *prev;
2660 unsigned long flags; 2660 unsigned long flags, len;
2661 struct rb_node **rb_link, *rb_parent; 2661 struct rb_node **rb_link, *rb_parent;
2662 pgoff_t pgoff = addr >> PAGE_SHIFT; 2662 pgoff_t pgoff = addr >> PAGE_SHIFT;
2663 int error; 2663 int error;
2664 2664
2665 len = PAGE_ALIGN(len); 2665 len = PAGE_ALIGN(request);
2666 if (len < request)
2667 return -ENOMEM;
2666 if (!len) 2668 if (!len)
2667 return 0; 2669 return 0;
2668 2670