diff options
| -rw-r--r-- | mm/mmap.c | 7 |
1 files changed, 7 insertions, 0 deletions
| @@ -1477,6 +1477,7 @@ static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, un | |||
| 1477 | { | 1477 | { |
| 1478 | struct mm_struct *mm = vma->vm_mm; | 1478 | struct mm_struct *mm = vma->vm_mm; |
| 1479 | struct rlimit *rlim = current->signal->rlim; | 1479 | struct rlimit *rlim = current->signal->rlim; |
| 1480 | unsigned long new_start; | ||
| 1480 | 1481 | ||
| 1481 | /* address space limit tests */ | 1482 | /* address space limit tests */ |
| 1482 | if (!may_expand_vm(mm, grow)) | 1483 | if (!may_expand_vm(mm, grow)) |
| @@ -1496,6 +1497,12 @@ static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, un | |||
| 1496 | return -ENOMEM; | 1497 | return -ENOMEM; |
| 1497 | } | 1498 | } |
| 1498 | 1499 | ||
| 1500 | /* Check to ensure the stack will not grow into a hugetlb-only region */ | ||
| 1501 | new_start = (vma->vm_flags & VM_GROWSUP) ? vma->vm_start : | ||
| 1502 | vma->vm_end - size; | ||
| 1503 | if (is_hugepage_only_range(vma->vm_mm, new_start, size)) | ||
| 1504 | return -EFAULT; | ||
| 1505 | |||
| 1499 | /* | 1506 | /* |
| 1500 | * Overcommit.. This must be the final test, as it will | 1507 | * Overcommit.. This must be the final test, as it will |
| 1501 | * update security statistics. | 1508 | * update security statistics. |
