MIPS: Randomize mmap if randomize_va_space is set
Fairly straight forward: For 32-bit address spaces randomize within a 16MB space, for 64-bit within a 256MB space. Signed-off-by: David Daney <ddaney@caviumnetworks.com> To: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/1480/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
		
					parent
					
						
							
								b3b3c176d9
							
						
					
				
			
			
				commit
				
					
						1091458d09
					
				
			
		
					 2 changed files with 31 additions and 1 deletions
				
			
		|  | @ -33,6 +33,11 @@ extern void (*cpu_wait)(void); | |||
| 
 | ||||
| extern unsigned int vced_count, vcei_count; | ||||
| 
 | ||||
| /*
 | ||||
|  * MIPS does have an arch_pick_mmap_layout() | ||||
|  */ | ||||
| #define HAVE_ARCH_PICK_MMAP_LAYOUT 1 | ||||
| 
 | ||||
| /*
 | ||||
|  * A special page (the vdso) is mapped into all processes at the very | ||||
|  * top of the virtual memory space. | ||||
|  | @ -52,6 +57,9 @@ extern unsigned int vced_count, vcei_count; | |||
|  * space during mmap's. | ||||
|  */ | ||||
| #define TASK_UNMAPPED_BASE	((TASK_SIZE / 3) & ~(PAGE_SIZE)) | ||||
| 
 | ||||
| #define TASK_IS_32BIT_ADDR 1 | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_64BIT | ||||
|  | @ -77,6 +85,9 @@ extern unsigned int vced_count, vcei_count; | |||
| 		PAGE_ALIGN(TASK_SIZE32 / 3) : PAGE_ALIGN(TASK_SIZE / 3)) | ||||
| #define TASK_SIZE_OF(tsk)						\ | ||||
| 	(test_tsk_thread_flag(tsk, TIF_32BIT_ADDR) ? TASK_SIZE32 : TASK_SIZE) | ||||
| 
 | ||||
| #define TASK_IS_32BIT_ADDR test_thread_flag(TIF_32BIT_ADDR) | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ | |||
| #include <linux/ipc.h> | ||||
| #include <linux/uaccess.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/random.h> | ||||
| 
 | ||||
| #include <asm/asm.h> | ||||
| #include <asm/branch.h> | ||||
|  | @ -116,7 +117,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
| 		    (!vmm || addr + len <= vmm->vm_start)) | ||||
| 			return addr; | ||||
| 	} | ||||
| 	addr = TASK_UNMAPPED_BASE; | ||||
| 	addr = current->mm->mmap_base; | ||||
| 	if (do_color_align) | ||||
| 		addr = COLOUR_ALIGN(addr, pgoff); | ||||
| 	else | ||||
|  | @ -134,6 +135,24 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| void arch_pick_mmap_layout(struct mm_struct *mm) | ||||
| { | ||||
| 	unsigned long random_factor = 0UL; | ||||
| 
 | ||||
| 	if (current->flags & PF_RANDOMIZE) { | ||||
| 		random_factor = get_random_int(); | ||||
| 		random_factor = random_factor << PAGE_SHIFT; | ||||
| 		if (TASK_IS_32BIT_ADDR) | ||||
| 			random_factor &= 0xfffffful; | ||||
| 		else | ||||
| 			random_factor &= 0xffffffful; | ||||
| 	} | ||||
| 
 | ||||
| 	mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; | ||||
| 	mm->get_unmapped_area = arch_get_unmapped_area; | ||||
| 	mm->unmap_area = arch_unmap_area; | ||||
| } | ||||
| 
 | ||||
| SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len, | ||||
| 	unsigned long, prot, unsigned long, flags, unsigned long, | ||||
| 	fd, off_t, offset) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 David Daney
				David Daney