diff options
Diffstat (limited to 'fs/binfmt_elf.c')
| -rw-r--r-- | fs/binfmt_elf.c | 31 | 
1 files changed, 13 insertions, 18 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 995986b8e36b..241ef68d2893 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -31,6 +31,7 @@  #include <linux/security.h>  #include <linux/random.h>  #include <linux/elf.h> +#include <linux/elf-randomize.h>  #include <linux/utsname.h>  #include <linux/coredump.h>  #include <linux/sched.h> @@ -862,6 +863,7 @@ static int load_elf_binary(struct linux_binprm *bprm)  	    i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {  		int elf_prot = 0, elf_flags;  		unsigned long k, vaddr; +		unsigned long total_size = 0;  		if (elf_ppnt->p_type != PT_LOAD)  			continue; @@ -909,25 +911,20 @@ static int load_elf_binary(struct linux_binprm *bprm)  			 * default mmap base, as well as whatever program they  			 * might try to exec.  This is because the brk will  			 * follow the loader, and is not movable.  */ -#ifdef CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE -			/* Memory randomization might have been switched off -			 * in runtime via sysctl or explicit setting of -			 * personality flags. -			 * If that is the case, retain the original non-zero -			 * load_bias value in order to establish proper -			 * non-randomized mappings. -			 */ +			load_bias = ELF_ET_DYN_BASE - vaddr;  			if (current->flags & PF_RANDOMIZE) -				load_bias = 0; -			else -				load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); -#else -			load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); -#endif +				load_bias += arch_mmap_rnd(); +			load_bias = ELF_PAGESTART(load_bias); +			total_size = total_mapping_size(elf_phdata, +							loc->elf_ex.e_phnum); +			if (!total_size) { +				error = -EINVAL; +				goto out_free_dentry; +			}  		}  		error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, -				elf_prot, elf_flags, 0); +				elf_prot, elf_flags, total_size);  		if (BAD_ADDR(error)) {  			retval = IS_ERR((void *)error) ?  				PTR_ERR((void*)error) : -EINVAL; @@ -1053,15 +1050,13 @@ static int load_elf_binary(struct linux_binprm *bprm)  	current->mm->end_data = end_data;  	current->mm->start_stack = bprm->p; -#ifdef arch_randomize_brk  	if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {  		current->mm->brk = current->mm->start_brk =  			arch_randomize_brk(current->mm); -#ifdef CONFIG_COMPAT_BRK +#ifdef compat_brk_randomized  		current->brk_randomized = 1;  #endif  	} -#endif  	if (current->personality & MMAP_PAGE_ZERO) {  		/* Why this, you ask???  Well SVr4 maps page 0 as read-only,  |