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 @@ | |||
31 | #include <linux/security.h> | 31 | #include <linux/security.h> |
32 | #include <linux/random.h> | 32 | #include <linux/random.h> |
33 | #include <linux/elf.h> | 33 | #include <linux/elf.h> |
34 | #include <linux/elf-randomize.h> | ||
34 | #include <linux/utsname.h> | 35 | #include <linux/utsname.h> |
35 | #include <linux/coredump.h> | 36 | #include <linux/coredump.h> |
36 | #include <linux/sched.h> | 37 | #include <linux/sched.h> |
@@ -862,6 +863,7 @@ static int load_elf_binary(struct linux_binprm *bprm) | |||
862 | i < loc->elf_ex.e_phnum; i++, elf_ppnt++) { | 863 | i < loc->elf_ex.e_phnum; i++, elf_ppnt++) { |
863 | int elf_prot = 0, elf_flags; | 864 | int elf_prot = 0, elf_flags; |
864 | unsigned long k, vaddr; | 865 | unsigned long k, vaddr; |
866 | unsigned long total_size = 0; | ||
865 | 867 | ||
866 | if (elf_ppnt->p_type != PT_LOAD) | 868 | if (elf_ppnt->p_type != PT_LOAD) |
867 | continue; | 869 | continue; |
@@ -909,25 +911,20 @@ static int load_elf_binary(struct linux_binprm *bprm) | |||
909 | * default mmap base, as well as whatever program they | 911 | * default mmap base, as well as whatever program they |
910 | * might try to exec. This is because the brk will | 912 | * might try to exec. This is because the brk will |
911 | * follow the loader, and is not movable. */ | 913 | * follow the loader, and is not movable. */ |
912 | #ifdef CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE | 914 | load_bias = ELF_ET_DYN_BASE - vaddr; |
913 | /* Memory randomization might have been switched off | ||
914 | * in runtime via sysctl or explicit setting of | ||
915 | * personality flags. | ||
916 | * If that is the case, retain the original non-zero | ||
917 | * load_bias value in order to establish proper | ||
918 | * non-randomized mappings. | ||
919 | */ | ||
920 | if (current->flags & PF_RANDOMIZE) | 915 | if (current->flags & PF_RANDOMIZE) |
921 | load_bias = 0; | 916 | load_bias += arch_mmap_rnd(); |
922 | else | 917 | load_bias = ELF_PAGESTART(load_bias); |
923 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | 918 | total_size = total_mapping_size(elf_phdata, |
924 | #else | 919 | loc->elf_ex.e_phnum); |
925 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | 920 | if (!total_size) { |
926 | #endif | 921 | error = -EINVAL; |
922 | goto out_free_dentry; | ||
923 | } | ||
927 | } | 924 | } |
928 | 925 | ||
929 | error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, | 926 | error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, |
930 | elf_prot, elf_flags, 0); | 927 | elf_prot, elf_flags, total_size); |
931 | if (BAD_ADDR(error)) { | 928 | if (BAD_ADDR(error)) { |
932 | retval = IS_ERR((void *)error) ? | 929 | retval = IS_ERR((void *)error) ? |
933 | PTR_ERR((void*)error) : -EINVAL; | 930 | PTR_ERR((void*)error) : -EINVAL; |
@@ -1053,15 +1050,13 @@ static int load_elf_binary(struct linux_binprm *bprm) | |||
1053 | current->mm->end_data = end_data; | 1050 | current->mm->end_data = end_data; |
1054 | current->mm->start_stack = bprm->p; | 1051 | current->mm->start_stack = bprm->p; |
1055 | 1052 | ||
1056 | #ifdef arch_randomize_brk | ||
1057 | if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) { | 1053 | if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) { |
1058 | current->mm->brk = current->mm->start_brk = | 1054 | current->mm->brk = current->mm->start_brk = |
1059 | arch_randomize_brk(current->mm); | 1055 | arch_randomize_brk(current->mm); |
1060 | #ifdef CONFIG_COMPAT_BRK | 1056 | #ifdef compat_brk_randomized |
1061 | current->brk_randomized = 1; | 1057 | current->brk_randomized = 1; |
1062 | #endif | 1058 | #endif |
1063 | } | 1059 | } |
1064 | #endif | ||
1065 | 1060 | ||
1066 | if (current->personality & MMAP_PAGE_ZERO) { | 1061 | if (current->personality & MMAP_PAGE_ZERO) { |
1067 | /* Why this, you ask??? Well SVr4 maps page 0 as read-only, | 1062 | /* Why this, you ask??? Well SVr4 maps page 0 as read-only, |