|
@@ -2316,7 +2316,6 @@ int expand_downwards(struct vm_area_struct *vma,
|
|
|
{
|
|
|
struct mm_struct *mm = vma->vm_mm;
|
|
|
struct vm_area_struct *prev;
|
|
|
- unsigned long gap_addr;
|
|
|
int error;
|
|
|
|
|
|
address &= PAGE_MASK;
|
|
@@ -2325,15 +2324,12 @@ int expand_downwards(struct vm_area_struct *vma,
|
|
|
return error;
|
|
|
|
|
|
/* Enforce stack_guard_gap */
|
|
|
- gap_addr = address - stack_guard_gap;
|
|
|
- if (gap_addr > address)
|
|
|
- return -ENOMEM;
|
|
|
prev = vma->vm_prev;
|
|
|
- if (prev && prev->vm_end > gap_addr &&
|
|
|
+ /* Check that both stack segments have the same anon_vma? */
|
|
|
+ if (prev && !(prev->vm_flags & VM_GROWSDOWN) &&
|
|
|
(prev->vm_flags & (VM_WRITE|VM_READ|VM_EXEC))) {
|
|
|
- if (!(prev->vm_flags & VM_GROWSDOWN))
|
|
|
+ if (address - prev->vm_end < stack_guard_gap)
|
|
|
return -ENOMEM;
|
|
|
- /* Check that both stack segments have the same anon_vma? */
|
|
|
}
|
|
|
|
|
|
/* We must make sure the anon_vma is allocated. */
|