mm: make stack guard page logic use vm_prev pointer
Like the mlock() change previously, this makes the stack guard check code use vma->vm_prev to see what the mapping below the current stack is, rather than have to look it up with find_vma(). Also, accept an abutting stack segment, since that happens naturally if you split the stack with mlock or mprotect. Tested-by: Ian Campbell <ijc@hellion.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
15
mm/memory.c
15
mm/memory.c
@@ -2770,11 +2770,18 @@ static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned lo
|
|||||||
{
|
{
|
||||||
address &= PAGE_MASK;
|
address &= PAGE_MASK;
|
||||||
if ((vma->vm_flags & VM_GROWSDOWN) && address == vma->vm_start) {
|
if ((vma->vm_flags & VM_GROWSDOWN) && address == vma->vm_start) {
|
||||||
address -= PAGE_SIZE;
|
struct vm_area_struct *prev = vma->vm_prev;
|
||||||
if (find_vma(vma->vm_mm, address) != vma)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
expand_stack(vma, address);
|
/*
|
||||||
|
* Is there a mapping abutting this one below?
|
||||||
|
*
|
||||||
|
* That's only ok if it's the same stack mapping
|
||||||
|
* that has gotten split..
|
||||||
|
*/
|
||||||
|
if (prev && prev->vm_end == address)
|
||||||
|
return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM;
|
||||||
|
|
||||||
|
expand_stack(vma, address - PAGE_SIZE);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user