diff --git a/mm/mmap.c b/mm/mmap.c index be0d7307bf0..bc7cdd62bf0 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1833,16 +1833,19 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address) * We must make sure the anon_vma is allocated * so that the anon_vma locking is not a noop. */ - /* Guard against wrapping around to address 0. */ + /* Guard against exceeding limits of the address space. */ address &= PAGE_MASK; - address += PAGE_SIZE; - if (!address) + if (address >= TASK_SIZE) return -ENOMEM; + address += PAGE_SIZE; /* Enforce stack_guard_gap */ gap_addr = address + stack_guard_gap; - if (gap_addr < address) - return -ENOMEM; + + /* Guard against overflow */ + if (gap_addr < address || gap_addr > TASK_SIZE) + gap_addr = TASK_SIZE; + next = vma->vm_next; if (next && next->vm_start < gap_addr) { if (!(next->vm_flags & VM_GROWSUP))