diff options
Diffstat (limited to 'fs/binfmt_elf.c')
-rw-r--r-- | fs/binfmt_elf.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 535e763ab1a6..303983fabfd6 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -66,12 +66,11 @@ static int elf_core_dump(struct coredump_params *cprm); | |||
66 | #define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1)) | 66 | #define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1)) |
67 | 67 | ||
68 | static struct linux_binfmt elf_format = { | 68 | static struct linux_binfmt elf_format = { |
69 | .module = THIS_MODULE, | 69 | .module = THIS_MODULE, |
70 | .load_binary = load_elf_binary, | 70 | .load_binary = load_elf_binary, |
71 | .load_shlib = load_elf_library, | 71 | .load_shlib = load_elf_library, |
72 | .core_dump = elf_core_dump, | 72 | .core_dump = elf_core_dump, |
73 | .min_coredump = ELF_EXEC_PAGESIZE, | 73 | .min_coredump = ELF_EXEC_PAGESIZE, |
74 | .hasvdso = 1 | ||
75 | }; | 74 | }; |
76 | 75 | ||
77 | #define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE) | 76 | #define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE) |
@@ -316,8 +315,6 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, | |||
316 | return 0; | 315 | return 0; |
317 | } | 316 | } |
318 | 317 | ||
319 | #ifndef elf_map | ||
320 | |||
321 | static unsigned long elf_map(struct file *filep, unsigned long addr, | 318 | static unsigned long elf_map(struct file *filep, unsigned long addr, |
322 | struct elf_phdr *eppnt, int prot, int type, | 319 | struct elf_phdr *eppnt, int prot, int type, |
323 | unsigned long total_size) | 320 | unsigned long total_size) |
@@ -354,8 +351,6 @@ static unsigned long elf_map(struct file *filep, unsigned long addr, | |||
354 | return(map_addr); | 351 | return(map_addr); |
355 | } | 352 | } |
356 | 353 | ||
357 | #endif /* !elf_map */ | ||
358 | |||
359 | static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr) | 354 | static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr) |
360 | { | 355 | { |
361 | int i, first_idx = -1, last_idx = -1; | 356 | int i, first_idx = -1, last_idx = -1; |
@@ -421,7 +416,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, | |||
421 | goto out; | 416 | goto out; |
422 | 417 | ||
423 | retval = kernel_read(interpreter, interp_elf_ex->e_phoff, | 418 | retval = kernel_read(interpreter, interp_elf_ex->e_phoff, |
424 | (char *)elf_phdata,size); | 419 | (char *)elf_phdata, size); |
425 | error = -EIO; | 420 | error = -EIO; |
426 | if (retval != size) { | 421 | if (retval != size) { |
427 | if (retval < 0) | 422 | if (retval < 0) |
@@ -575,7 +570,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
575 | unsigned long elf_entry; | 570 | unsigned long elf_entry; |
576 | unsigned long interp_load_addr = 0; | 571 | unsigned long interp_load_addr = 0; |
577 | unsigned long start_code, end_code, start_data, end_data; | 572 | unsigned long start_code, end_code, start_data, end_data; |
578 | unsigned long reloc_func_desc = 0; | 573 | unsigned long reloc_func_desc __maybe_unused = 0; |
579 | int executable_stack = EXSTACK_DEFAULT; | 574 | int executable_stack = EXSTACK_DEFAULT; |
580 | unsigned long def_flags = 0; | 575 | unsigned long def_flags = 0; |
581 | struct { | 576 | struct { |
@@ -601,7 +596,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
601 | goto out; | 596 | goto out; |
602 | if (!elf_check_arch(&loc->elf_ex)) | 597 | if (!elf_check_arch(&loc->elf_ex)) |
603 | goto out; | 598 | goto out; |
604 | if (!bprm->file->f_op||!bprm->file->f_op->mmap) | 599 | if (!bprm->file->f_op || !bprm->file->f_op->mmap) |
605 | goto out; | 600 | goto out; |
606 | 601 | ||
607 | /* Now read in all of the header information */ | 602 | /* Now read in all of the header information */ |
@@ -761,8 +756,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
761 | /* There was a PT_LOAD segment with p_memsz > p_filesz | 756 | /* There was a PT_LOAD segment with p_memsz > p_filesz |
762 | before this one. Map anonymous pages, if needed, | 757 | before this one. Map anonymous pages, if needed, |
763 | and clear the area. */ | 758 | and clear the area. */ |
764 | retval = set_brk (elf_bss + load_bias, | 759 | retval = set_brk(elf_bss + load_bias, |
765 | elf_brk + load_bias); | 760 | elf_brk + load_bias); |
766 | if (retval) { | 761 | if (retval) { |
767 | send_sig(SIGKILL, current, 0); | 762 | send_sig(SIGKILL, current, 0); |
768 | goto out_free_dentry; | 763 | goto out_free_dentry; |
@@ -800,7 +795,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
800 | * default mmap base, as well as whatever program they | 795 | * default mmap base, as well as whatever program they |
801 | * might try to exec. This is because the brk will | 796 | * might try to exec. This is because the brk will |
802 | * follow the loader, and is not movable. */ | 797 | * follow the loader, and is not movable. */ |
803 | #ifdef CONFIG_X86 | 798 | #if defined(CONFIG_X86) || defined(CONFIG_ARM) |
804 | load_bias = 0; | 799 | load_bias = 0; |
805 | #else | 800 | #else |
806 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | 801 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); |
@@ -946,9 +941,13 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
946 | current->mm->start_stack = bprm->p; | 941 | current->mm->start_stack = bprm->p; |
947 | 942 | ||
948 | #ifdef arch_randomize_brk | 943 | #ifdef arch_randomize_brk |
949 | if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) | 944 | if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) { |
950 | current->mm->brk = current->mm->start_brk = | 945 | current->mm->brk = current->mm->start_brk = |
951 | arch_randomize_brk(current->mm); | 946 | arch_randomize_brk(current->mm); |
947 | #ifdef CONFIG_COMPAT_BRK | ||
948 | current->brk_randomized = 1; | ||
949 | #endif | ||
950 | } | ||
952 | #endif | 951 | #endif |
953 | 952 | ||
954 | if (current->personality & MMAP_PAGE_ZERO) { | 953 | if (current->personality & MMAP_PAGE_ZERO) { |
@@ -1911,7 +1910,7 @@ static int elf_core_dump(struct coredump_params *cprm) | |||
1911 | segs = current->mm->map_count; | 1910 | segs = current->mm->map_count; |
1912 | segs += elf_core_extra_phdrs(); | 1911 | segs += elf_core_extra_phdrs(); |
1913 | 1912 | ||
1914 | gate_vma = get_gate_vma(current); | 1913 | gate_vma = get_gate_vma(current->mm); |
1915 | if (gate_vma != NULL) | 1914 | if (gate_vma != NULL) |
1916 | segs++; | 1915 | segs++; |
1917 | 1916 | ||