Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Kees Cook and committed by
Linus Torvalds
ba093a6d 0036d1f7

+5 -3
+5 -3
mm/mmap.c
··· 2653 2653 * anonymous maps. eventually we may be able to do some 2654 2654 * brk-specific accounting here. 2655 2655 */ 2656 - static int do_brk(unsigned long addr, unsigned long len) 2656 + static int do_brk(unsigned long addr, unsigned long request) 2657 2657 { 2658 2658 struct mm_struct *mm = current->mm; 2659 2659 struct vm_area_struct *vma, *prev; 2660 - unsigned long flags; 2660 + unsigned long flags, len; 2661 2661 struct rb_node **rb_link, *rb_parent; 2662 2662 pgoff_t pgoff = addr >> PAGE_SHIFT; 2663 2663 int error; 2664 2664 2665 - len = PAGE_ALIGN(len); 2665 + len = PAGE_ALIGN(request); 2666 + if (len < request) 2667 + return -ENOMEM; 2666 2668 if (!len) 2667 2669 return 0; 2668 2670