|
@@ -2099,14 +2099,17 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns
|
|
|
{
|
|
|
struct mm_struct *mm = vma->vm_mm;
|
|
|
struct rlimit *rlim = current->signal->rlim;
|
|
|
- unsigned long new_start;
|
|
|
+ unsigned long new_start, actual_size;
|
|
|
|
|
|
/* address space limit tests */
|
|
|
if (!may_expand_vm(mm, grow))
|
|
|
return -ENOMEM;
|
|
|
|
|
|
/* Stack limit test */
|
|
|
- if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))
|
|
|
+ actual_size = size;
|
|
|
+ if (size && (vma->vm_flags & (VM_GROWSUP | VM_GROWSDOWN)))
|
|
|
+ actual_size -= PAGE_SIZE;
|
|
|
+ if (actual_size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))
|
|
|
return -ENOMEM;
|
|
|
|
|
|
/* mlock limit tests */
|