diff options
author | Kees Cook <keescook@chromium.org> | 2016-08-02 17:04:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-08-02 19:35:15 -0400 |
commit | ba093a6d9397da8eafcfbaa7d95bd34255da39a0 (patch) | |
tree | 0c949c629283ee48079fa8ee7f545d90dfb7cab3 | |
parent | 0036d1f7eb95bcc52977f15507f00dd07018e7e2 (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.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -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 | */ |
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 | 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 | ||