arm: use generic mmap top-down layout and brk randomization
arm uses a top-down mmap layout by default that exactly fits the generic functions, so get rid of arch specific code and use the generic version by selecting ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT. As ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT selects ARCH_HAS_ELF_RANDOMIZE, use the generic version of arch_randomize_brk since it also fits. Note that this commit also removes the possibility for arm to have elf randomization and no MMU: without MMU, the security added by randomization is worth nothing. Note that it is safe to remove STACK_RND_MASK since it matches the default value. Link: http://lkml.kernel.org/r/20190730055113.23635-9-alex@ghiti.fr Signed-off-by: Alexandre Ghiti <alex@ghiti.fr> Acked-by: Kees Cook <keescook@chromium.org> Reviewed-by: Luis Chamberlain <mcgrof@kernel.org> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: Christoph Hellwig <hch@lst.de> Cc: James Hogan <jhogan@kernel.org> Cc: Palmer Dabbelt <palmer@sifive.com> Cc: Paul Burton <paul.burton@mips.com> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Russell King <linux@armlinux.org.uk> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									86e568e9c0
								
							
						
					
					
						commit
						dba79c3df4
					
				| @ -34,6 +34,7 @@ config ARM | ||||
| 	select ARCH_SUPPORTS_ATOMIC_RMW | ||||
| 	select ARCH_USE_BUILTIN_BSWAP | ||||
| 	select ARCH_USE_CMPXCHG_LOCKREF | ||||
| 	select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU | ||||
| 	select ARCH_WANT_IPC_PARSE_VERSION | ||||
| 	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK | ||||
| 	select BUILDTIME_EXTABLE_SORT if MMU | ||||
|  | ||||
| @ -140,8 +140,6 @@ static inline void prefetchw(const void *ptr) | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #define HAVE_ARCH_PICK_MMAP_LAYOUT | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __ASM_ARM_PROCESSOR_H */ | ||||
|  | ||||
| @ -319,11 +319,6 @@ unsigned long get_wchan(struct task_struct *p) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| unsigned long arch_randomize_brk(struct mm_struct *mm) | ||||
| { | ||||
| 	return randomize_page(mm->brk, 0x02000000); | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_MMU | ||||
| #ifdef CONFIG_KUSER_HELPERS | ||||
| /*
 | ||||
|  | ||||
| @ -17,43 +17,6 @@ | ||||
| 	((((addr)+SHMLBA-1)&~(SHMLBA-1)) +	\ | ||||
| 	 (((pgoff)<<PAGE_SHIFT) & (SHMLBA-1))) | ||||
| 
 | ||||
| /* gap between mmap and stack */ | ||||
| #define MIN_GAP		(128*1024*1024UL) | ||||
| #define MAX_GAP		((STACK_TOP)/6*5) | ||||
| #define STACK_RND_MASK	(0x7ff >> (PAGE_SHIFT - 12)) | ||||
| 
 | ||||
| static int mmap_is_legacy(struct rlimit *rlim_stack) | ||||
| { | ||||
| 	if (current->personality & ADDR_COMPAT_LAYOUT) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	if (rlim_stack->rlim_cur == RLIM_INFINITY) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	return sysctl_legacy_va_layout; | ||||
| } | ||||
| 
 | ||||
| static unsigned long mmap_base(unsigned long rnd, struct rlimit *rlim_stack) | ||||
| { | ||||
| 	unsigned long gap = rlim_stack->rlim_cur; | ||||
| 	unsigned long pad = stack_guard_gap; | ||||
| 
 | ||||
| 	/* Account for stack randomization if necessary */ | ||||
| 	if (current->flags & PF_RANDOMIZE) | ||||
| 		pad += (STACK_RND_MASK << PAGE_SHIFT); | ||||
| 
 | ||||
| 	/* Values close to RLIM_INFINITY can overflow. */ | ||||
| 	if (gap + pad > gap) | ||||
| 		gap += pad; | ||||
| 
 | ||||
| 	if (gap < MIN_GAP) | ||||
| 		gap = MIN_GAP; | ||||
| 	else if (gap > MAX_GAP) | ||||
| 		gap = MAX_GAP; | ||||
| 
 | ||||
| 	return PAGE_ALIGN(STACK_TOP - gap - rnd); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * We need to ensure that shared mappings are correctly aligned to | ||||
|  * avoid aliasing issues with VIPT caches.  We need to ensure that | ||||
| @ -181,31 +144,6 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | ||||
| 	return addr; | ||||
| } | ||||
| 
 | ||||
| unsigned long arch_mmap_rnd(void) | ||||
| { | ||||
| 	unsigned long rnd; | ||||
| 
 | ||||
| 	rnd = get_random_long() & ((1UL << mmap_rnd_bits) - 1); | ||||
| 
 | ||||
| 	return rnd << PAGE_SHIFT; | ||||
| } | ||||
| 
 | ||||
| void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) | ||||
| { | ||||
| 	unsigned long random_factor = 0UL; | ||||
| 
 | ||||
| 	if (current->flags & PF_RANDOMIZE) | ||||
| 		random_factor = arch_mmap_rnd(); | ||||
| 
 | ||||
| 	if (mmap_is_legacy(rlim_stack)) { | ||||
| 		mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; | ||||
| 		mm->get_unmapped_area = arch_get_unmapped_area; | ||||
| 	} else { | ||||
| 		mm->mmap_base = mmap_base(random_factor, rlim_stack); | ||||
| 		mm->get_unmapped_area = arch_get_unmapped_area_topdown; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * You really shouldn't be using read() or write() on /dev/mem.  This | ||||
|  * might go away in the future. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user