| From 40187a5ffff1a32889872b360660f277533b8cc9 Mon Sep 17 00:00:00 2001 |
| From: Helge Deller <deller@gmx.de> |
| Date: Mon, 19 Jun 2017 17:34:05 +0200 |
| Subject: [PATCH] Allow stack to grow up to address space limit |
| |
| commit bd726c90b6b8ce87602208701b208a208e6d5600 upstream. |
| |
| Fix expand_upwards() on architectures with an upward-growing stack (parisc, |
| metag and partly IA-64) to allow the stack to reliably grow exactly up to |
| the address space limit given by TASK_SIZE. |
| |
| Signed-off-by: Helge Deller <deller@gmx.de> |
| Acked-by: Hugh Dickins <hughd@google.com> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/mm/mmap.c b/mm/mmap.c |
| index 5680e300e279..bd4483153911 100644 |
| --- a/mm/mmap.c |
| +++ b/mm/mmap.c |
| @@ -2073,16 +2073,19 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address) |
| if (!(vma->vm_flags & VM_GROWSUP)) |
| return -EFAULT; |
| |
| - /* 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)) |
| -- |
| 2.12.0 |
| |