diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/binfmt_elf.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 3edca6cb9a33..46f0438088d3 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -377,6 +377,11 @@ static unsigned long elf_map(struct file *filep, unsigned long addr, | |||
377 | } else | 377 | } else |
378 | map_addr = vm_mmap(filep, addr, size, prot, type, off); | 378 | map_addr = vm_mmap(filep, addr, size, prot, type, off); |
379 | 379 | ||
380 | if ((type & MAP_FIXED_NOREPLACE) && BAD_ADDR(map_addr)) | ||
381 | pr_info("%d (%s): Uhuuh, elf segment at %p requested but the memory is mapped already\n", | ||
382 | task_pid_nr(current), current->comm, | ||
383 | (void *)addr); | ||
384 | |||
380 | return(map_addr); | 385 | return(map_addr); |
381 | } | 386 | } |
382 | 387 | ||
@@ -575,7 +580,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, | |||
575 | elf_prot |= PROT_EXEC; | 580 | elf_prot |= PROT_EXEC; |
576 | vaddr = eppnt->p_vaddr; | 581 | vaddr = eppnt->p_vaddr; |
577 | if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) | 582 | if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) |
578 | elf_type |= MAP_FIXED; | 583 | elf_type |= MAP_FIXED_NOREPLACE; |
579 | else if (no_base && interp_elf_ex->e_type == ET_DYN) | 584 | else if (no_base && interp_elf_ex->e_type == ET_DYN) |
580 | load_addr = -vaddr; | 585 | load_addr = -vaddr; |
581 | 586 | ||
@@ -939,7 +944,7 @@ static int load_elf_binary(struct linux_binprm *bprm) | |||
939 | * the ET_DYN load_addr calculations, proceed normally. | 944 | * the ET_DYN load_addr calculations, proceed normally. |
940 | */ | 945 | */ |
941 | if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) { | 946 | if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) { |
942 | elf_flags |= MAP_FIXED; | 947 | elf_flags |= MAP_FIXED_NOREPLACE; |
943 | } else if (loc->elf_ex.e_type == ET_DYN) { | 948 | } else if (loc->elf_ex.e_type == ET_DYN) { |
944 | /* | 949 | /* |
945 | * This logic is run once for the first LOAD Program | 950 | * This logic is run once for the first LOAD Program |
@@ -975,7 +980,7 @@ static int load_elf_binary(struct linux_binprm *bprm) | |||
975 | load_bias = ELF_ET_DYN_BASE; | 980 | load_bias = ELF_ET_DYN_BASE; |
976 | if (current->flags & PF_RANDOMIZE) | 981 | if (current->flags & PF_RANDOMIZE) |
977 | load_bias += arch_mmap_rnd(); | 982 | load_bias += arch_mmap_rnd(); |
978 | elf_flags |= MAP_FIXED; | 983 | elf_flags |= MAP_FIXED_NOREPLACE; |
979 | } else | 984 | } else |
980 | load_bias = 0; | 985 | load_bias = 0; |
981 | 986 | ||
@@ -1235,7 +1240,7 @@ static int load_elf_library(struct file *file) | |||
1235 | (eppnt->p_filesz + | 1240 | (eppnt->p_filesz + |
1236 | ELF_PAGEOFFSET(eppnt->p_vaddr)), | 1241 | ELF_PAGEOFFSET(eppnt->p_vaddr)), |
1237 | PROT_READ | PROT_WRITE | PROT_EXEC, | 1242 | PROT_READ | PROT_WRITE | PROT_EXEC, |
1238 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, | 1243 | MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE, |
1239 | (eppnt->p_offset - | 1244 | (eppnt->p_offset - |
1240 | ELF_PAGEOFFSET(eppnt->p_vaddr))); | 1245 | ELF_PAGEOFFSET(eppnt->p_vaddr))); |
1241 | if (error != ELF_PAGESTART(eppnt->p_vaddr)) | 1246 | if (error != ELF_PAGESTART(eppnt->p_vaddr)) |