diff options
author | David Howells <dhowells@redhat.com> | 2008-02-08 07:19:28 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-08 12:22:30 -0500 |
commit | 7fa3031500ec9b0a7460c8c23751799006ffee74 (patch) | |
tree | 2a7e9202b35a39dc8217e95825263c0629e67e35 /fs | |
parent | b0b933c08bd5fd053bbba8ba6387f543be03d49f (diff) |
aout: suppress A.OUT library support if !CONFIG_ARCH_SUPPORTS_AOUT
Suppress A.OUT library support if CONFIG_ARCH_SUPPORTS_AOUT is not set.
Not all architectures support the A.OUT binfmt, so the ELF binfmt should not
be permitted to go looking for A.OUT libraries to load in such a case. Not
only that, but under such conditions A.OUT core dumps are not produced either.
To make this work, this patch also does the following:
(1) Makes the existence of the contents of linux/a.out.h contingent on
CONFIG_ARCH_SUPPORTS_AOUT.
(2) Renames dump_thread() to aout_dump_thread() as it's only called by A.OUT
core dumping code.
(3) Moves aout_dump_thread() into asm/a.out-core.h and makes it inline. This
is then included only where needed. This means that this bit of arch
code will be stored in the appropriate A.OUT binfmt module rather than
the core kernel.
(4) Drops A.OUT support for Blackfin (according to Mike Frysinger it's not
needed) and FRV.
This patch depends on the previous patch to move STACK_TOP[_MAX] out of
asm/a.out.h and into asm/processor.h as they're required whether or not A.OUT
format is available.
[jdike@addtoit.com: uml: re-remove accidentally restored code]
Signed-off-by: David Howells <dhowells@redhat.com>
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/Kconfig.binfmt | 3 | ||||
-rw-r--r-- | fs/binfmt_aout.c | 3 | ||||
-rw-r--r-- | fs/binfmt_elf.c | 34 | ||||
-rw-r--r-- | fs/exec.c | 2 |
4 files changed, 31 insertions, 11 deletions
diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt index 7c3d5f923da1..b5c3b6114add 100644 --- a/fs/Kconfig.binfmt +++ b/fs/Kconfig.binfmt | |||
@@ -61,7 +61,8 @@ config BINFMT_SHARED_FLAT | |||
61 | 61 | ||
62 | config BINFMT_AOUT | 62 | config BINFMT_AOUT |
63 | tristate "Kernel support for a.out and ECOFF binaries" | 63 | tristate "Kernel support for a.out and ECOFF binaries" |
64 | depends on X86_32 || ALPHA || ARM || M68K || SPARC32 | 64 | depends on ARCH_SUPPORTS_AOUT && \ |
65 | (X86_32 || ALPHA || ARM || M68K || SPARC32) | ||
65 | ---help--- | 66 | ---help--- |
66 | A.out (Assembler.OUTput) is a set of formats for libraries and | 67 | A.out (Assembler.OUTput) is a set of formats for libraries and |
67 | executables used in the earliest versions of UNIX. Linux used | 68 | executables used in the earliest versions of UNIX. Linux used |
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index 7f65e71bf859..a1bb2244cac7 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/system.h> | 28 | #include <asm/system.h> |
29 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
30 | #include <asm/cacheflush.h> | 30 | #include <asm/cacheflush.h> |
31 | #include <asm/a.out-core.h> | ||
31 | 32 | ||
32 | static int load_aout_binary(struct linux_binprm *, struct pt_regs * regs); | 33 | static int load_aout_binary(struct linux_binprm *, struct pt_regs * regs); |
33 | static int load_aout_library(struct file*); | 34 | static int load_aout_library(struct file*); |
@@ -118,7 +119,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, u | |||
118 | dump.u_ar0 = offsetof(struct user, regs); | 119 | dump.u_ar0 = offsetof(struct user, regs); |
119 | #endif | 120 | #endif |
120 | dump.signal = signr; | 121 | dump.signal = signr; |
121 | dump_thread(regs, &dump); | 122 | aout_dump_thread(regs, &dump); |
122 | 123 | ||
123 | /* If the size of the dump file exceeds the rlimit, then see what would happen | 124 | /* If the size of the dump file exceeds the rlimit, then see what would happen |
124 | if we wrote the stack, but not the data area. */ | 125 | if we wrote the stack, but not the data area. */ |
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 111771d38e6e..a93b1170551b 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -513,6 +513,7 @@ out: | |||
513 | return error; | 513 | return error; |
514 | } | 514 | } |
515 | 515 | ||
516 | #ifdef CONFIG_ARCH_SUPPORTS_AOUT | ||
516 | static unsigned long load_aout_interp(struct exec *interp_ex, | 517 | static unsigned long load_aout_interp(struct exec *interp_ex, |
517 | struct file *interpreter) | 518 | struct file *interpreter) |
518 | { | 519 | { |
@@ -558,6 +559,14 @@ static unsigned long load_aout_interp(struct exec *interp_ex, | |||
558 | out: | 559 | out: |
559 | return elf_entry; | 560 | return elf_entry; |
560 | } | 561 | } |
562 | #else | ||
563 | /* dummy extern - the function should never be called if !CONFIG_AOUT_BINFMT */ | ||
564 | static inline unsigned long load_aout_interp(struct exec *interp_ex, | ||
565 | struct file *interpreter) | ||
566 | { | ||
567 | return -ELIBACC; | ||
568 | } | ||
569 | #endif | ||
561 | 570 | ||
562 | /* | 571 | /* |
563 | * These are the functions used to load ELF style executables and shared | 572 | * These are the functions used to load ELF style executables and shared |
@@ -565,9 +574,15 @@ out: | |||
565 | */ | 574 | */ |
566 | 575 | ||
567 | #define INTERPRETER_NONE 0 | 576 | #define INTERPRETER_NONE 0 |
568 | #define INTERPRETER_AOUT 1 | ||
569 | #define INTERPRETER_ELF 2 | 577 | #define INTERPRETER_ELF 2 |
570 | 578 | ||
579 | #ifdef CONFIG_ARCH_SUPPORTS_AOUT | ||
580 | #define INTERPRETER_AOUT 1 | ||
581 | #define IS_AOUT_INTERP(x) ((x) == INTERPRETER_AOUT) | ||
582 | #else | ||
583 | #define IS_AOUT_INTERP(x) (0) | ||
584 | #endif | ||
585 | |||
571 | #ifndef STACK_RND_MASK | 586 | #ifndef STACK_RND_MASK |
572 | #define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */ | 587 | #define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */ |
573 | #endif | 588 | #endif |
@@ -775,6 +790,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
775 | /* Some simple consistency checks for the interpreter */ | 790 | /* Some simple consistency checks for the interpreter */ |
776 | if (elf_interpreter) { | 791 | if (elf_interpreter) { |
777 | static int warn; | 792 | static int warn; |
793 | #ifdef CONFIG_ARCH_SUPPORTS_AOUT | ||
778 | interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT; | 794 | interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT; |
779 | 795 | ||
780 | /* Now figure out which format our binary is */ | 796 | /* Now figure out which format our binary is */ |
@@ -782,11 +798,13 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
782 | (N_MAGIC(loc->interp_ex) != ZMAGIC) && | 798 | (N_MAGIC(loc->interp_ex) != ZMAGIC) && |
783 | (N_MAGIC(loc->interp_ex) != QMAGIC)) | 799 | (N_MAGIC(loc->interp_ex) != QMAGIC)) |
784 | interpreter_type = INTERPRETER_ELF; | 800 | interpreter_type = INTERPRETER_ELF; |
785 | 801 | #else | |
802 | interpreter_type = INTERPRETER_ELF; | ||
803 | #endif | ||
786 | if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0) | 804 | if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0) |
787 | interpreter_type &= ~INTERPRETER_ELF; | 805 | interpreter_type &= ~INTERPRETER_ELF; |
788 | 806 | ||
789 | if (interpreter_type == INTERPRETER_AOUT && warn < 10) { | 807 | if (IS_AOUT_INTERP(interpreter_type) && warn < 10) { |
790 | printk(KERN_WARNING "a.out ELF interpreter %s is " | 808 | printk(KERN_WARNING "a.out ELF interpreter %s is " |
791 | "deprecated and will not be supported " | 809 | "deprecated and will not be supported " |
792 | "after Linux 2.6.25\n", elf_interpreter); | 810 | "after Linux 2.6.25\n", elf_interpreter); |
@@ -815,7 +833,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
815 | 833 | ||
816 | /* OK, we are done with that, now set up the arg stuff, | 834 | /* OK, we are done with that, now set up the arg stuff, |
817 | and then start this sucker up */ | 835 | and then start this sucker up */ |
818 | if ((!bprm->sh_bang) && (interpreter_type == INTERPRETER_AOUT)) { | 836 | if (IS_AOUT_INTERP(interpreter_type) && !bprm->sh_bang) { |
819 | char *passed_p = passed_fileno; | 837 | char *passed_p = passed_fileno; |
820 | sprintf(passed_fileno, "%d", elf_exec_fileno); | 838 | sprintf(passed_fileno, "%d", elf_exec_fileno); |
821 | 839 | ||
@@ -1004,7 +1022,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
1004 | } | 1022 | } |
1005 | 1023 | ||
1006 | if (elf_interpreter) { | 1024 | if (elf_interpreter) { |
1007 | if (interpreter_type == INTERPRETER_AOUT) { | 1025 | if (IS_AOUT_INTERP(interpreter_type)) { |
1008 | elf_entry = load_aout_interp(&loc->interp_ex, | 1026 | elf_entry = load_aout_interp(&loc->interp_ex, |
1009 | interpreter); | 1027 | interpreter); |
1010 | } else { | 1028 | } else { |
@@ -1045,7 +1063,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
1045 | 1063 | ||
1046 | kfree(elf_phdata); | 1064 | kfree(elf_phdata); |
1047 | 1065 | ||
1048 | if (interpreter_type != INTERPRETER_AOUT) | 1066 | if (!IS_AOUT_INTERP(interpreter_type)) |
1049 | sys_close(elf_exec_fileno); | 1067 | sys_close(elf_exec_fileno); |
1050 | 1068 | ||
1051 | set_binfmt(&elf_format); | 1069 | set_binfmt(&elf_format); |
@@ -1061,14 +1079,14 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
1061 | compute_creds(bprm); | 1079 | compute_creds(bprm); |
1062 | current->flags &= ~PF_FORKNOEXEC; | 1080 | current->flags &= ~PF_FORKNOEXEC; |
1063 | retval = create_elf_tables(bprm, &loc->elf_ex, | 1081 | retval = create_elf_tables(bprm, &loc->elf_ex, |
1064 | (interpreter_type == INTERPRETER_AOUT), | 1082 | IS_AOUT_INTERP(interpreter_type), |
1065 | load_addr, interp_load_addr); | 1083 | load_addr, interp_load_addr); |
1066 | if (retval < 0) { | 1084 | if (retval < 0) { |
1067 | send_sig(SIGKILL, current, 0); | 1085 | send_sig(SIGKILL, current, 0); |
1068 | goto out; | 1086 | goto out; |
1069 | } | 1087 | } |
1070 | /* N.B. passed_fileno might not be initialized? */ | 1088 | /* N.B. passed_fileno might not be initialized? */ |
1071 | if (interpreter_type == INTERPRETER_AOUT) | 1089 | if (IS_AOUT_INTERP(interpreter_type)) |
1072 | current->mm->arg_start += strlen(passed_fileno) + 1; | 1090 | current->mm->arg_start += strlen(passed_fileno) + 1; |
1073 | current->mm->end_code = end_code; | 1091 | current->mm->end_code = end_code; |
1074 | current->mm->start_code = start_code; | 1092 | current->mm->start_code = start_code; |
@@ -1166,7 +1166,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) | |||
1166 | { | 1166 | { |
1167 | int try,retval; | 1167 | int try,retval; |
1168 | struct linux_binfmt *fmt; | 1168 | struct linux_binfmt *fmt; |
1169 | #ifdef __alpha__ | 1169 | #if defined(__alpha__) && defined(CONFIG_ARCH_SUPPORTS_AOUT) |
1170 | /* handle /sbin/loader.. */ | 1170 | /* handle /sbin/loader.. */ |
1171 | { | 1171 | { |
1172 | struct exec * eh = (struct exec *) bprm->buf; | 1172 | struct exec * eh = (struct exec *) bprm->buf; |