summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/binfmt_elf.c13
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))