Skip to content

Commit ba093a6

Browse files
keestorvalds
authored andcommitted
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>
1 parent 0036d1f commit ba093a6

1 file changed

Lines changed: 5 additions & 3 deletions

File tree

mm/mmap.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2653,16 +2653,18 @@ static inline void verify_mm_writelocked(struct mm_struct *mm)
26532653
* anonymous maps. eventually we may be able to do some
26542654
* brk-specific accounting here.
26552655
*/
2656-
static int do_brk(unsigned long addr, unsigned long len)
2656+
static int do_brk(unsigned long addr, unsigned long request)
26572657
{
26582658
struct mm_struct *mm = current->mm;
26592659
struct vm_area_struct *vma, *prev;
2660-
unsigned long flags;
2660+
unsigned long flags, len;
26612661
struct rb_node **rb_link, *rb_parent;
26622662
pgoff_t pgoff = addr >> PAGE_SHIFT;
26632663
int error;
26642664

2665-
len = PAGE_ALIGN(len);
2665+
len = PAGE_ALIGN(request);
2666+
if (len < request)
2667+
return -ENOMEM;
26662668
if (!len)
26672669
return 0;
26682670

0 commit comments

Comments
 (0)