mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-30 05:42:46 +01:00
x86/mm: care about shadow stack guard gap during placement
When memory is being placed, mmap() will take care to respect the guard
gaps of certain types of memory (VM_SHADOWSTACK, VM_GROWSUP and
VM_GROWSDOWN). In order to ensure guard gaps between mappings, mmap()
needs to consider two things:
1. That the new mapping isn't placed in an any existing mappings guard
gaps.
2. That the new mapping isn't placed such that any existing mappings
are not in *its* guard gaps.
The longstanding behavior of mmap() is to ensure 1, but not take any care
around 2. So for example, if there is a PAGE_SIZE free area, and a mmap()
with a PAGE_SIZE size, and a type that has a guard gap is being placed,
mmap() may place the shadow stack in the PAGE_SIZE free area. Then the
mapping that is supposed to have a guard gap will not have a gap to the
adjacent VMA.
Now that the vm_flags is passed into the arch get_unmapped_area()'s, and
vm_unmapped_area() is ready to consider it, have VM_SHADOW_STACK's get
guard gap consideration for scenario 2.
Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Rick Edgecombe <[email protected]>
Cc: Alexei Starovoitov <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Aneesh Kumar K.V <[email protected]>
Cc: Borislav Petkov (AMD) <[email protected]>
Cc: Christophe Leroy <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Deepak Gupta <[email protected]>
Cc: Guo Ren <[email protected]>
Cc: Helge Deller <[email protected]>
Cc: H. Peter Anvin (Intel) <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: "James E.J. Bottomley" <[email protected]>
Cc: Kees Cook <[email protected]>
Cc: Kirill A. Shutemov <[email protected]>
Cc: Liam R. Howlett <[email protected]>
Cc: Mark Brown <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Naveen N. Rao <[email protected]>
Cc: Nicholas Piggin <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
c5ecd8eb8c
commit
c44357c2e7
1 file changed
+10
@@ -112,6 +112,14 @@ static void find_start_end(unsigned long addr, unsigned long flags,
|
||||
*end = task_size_64bit(addr > DEFAULT_MAP_WINDOW);
|
||||
}
|
||||
|
||||
static inline unsigned long stack_guard_placement(vm_flags_t vm_flags)
|
||||
{
|
||||
if (vm_flags & VM_SHADOW_STACK)
|
||||
return PAGE_SIZE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long
|
||||
arch_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, unsigned long len,
|
||||
unsigned long pgoff, unsigned long flags, vm_flags_t vm_flags)
|
||||
@@ -141,6 +149,7 @@ arch_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, unsigned l
|
||||
info.low_limit = begin;
|
||||
info.high_limit = end;
|
||||
info.align_offset = pgoff << PAGE_SHIFT;
|
||||
info.start_gap = stack_guard_placement(vm_flags);
|
||||
if (filp) {
|
||||
info.align_mask = get_align_mask();
|
||||
info.align_offset += get_align_bits();
|
||||
@@ -190,6 +199,7 @@ get_unmapped_area:
|
||||
info.low_limit = PAGE_SIZE;
|
||||
|
||||
info.high_limit = get_mmap_base(0);
|
||||
info.start_gap = stack_guard_placement(vm_flags);
|
||||
|
||||
/*
|
||||
* If hint address is above DEFAULT_MAP_WINDOW, look for unmapped area
|
||||
|
||||
Reference in new issue
Block a user