get rid of special-casing the /sbin/loader on alpha

... just make it a binfmt handler like #! one.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Al Viro and committed by
Linus Torvalds
3bfacef4 17580d7f

+52 -40
+1 -1
arch/alpha/kernel/Makefile
··· 8 9 obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \ 10 irq_alpha.o signal.o setup.o ptrace.o time.o \ 11 - alpha_ksyms.o systbls.o err_common.o io.o 12 13 obj-$(CONFIG_VGA_HOSE) += console.o 14 obj-$(CONFIG_SMP) += smp.o
··· 8 9 obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \ 10 irq_alpha.o signal.o setup.o ptrace.o time.o \ 11 + alpha_ksyms.o systbls.o err_common.o io.o binfmt_loader.o 12 13 obj-$(CONFIG_VGA_HOSE) += console.o 14 obj-$(CONFIG_SMP) += smp.o
+51
arch/alpha/kernel/binfmt_loader.c
···
··· 1 + #include <linux/init.h> 2 + #include <linux/fs.h> 3 + #include <linux/file.h> 4 + #include <linux/mm_types.h> 5 + #include <linux/binfmts.h> 6 + #include <linux/a.out.h> 7 + 8 + static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs) 9 + { 10 + struct exec *eh = (struct exec *)bprm->buf; 11 + unsigned long loader; 12 + struct file *file; 13 + int retval; 14 + 15 + if (eh->fh.f_magic != 0x183 || (eh->fh.f_flags & 0x3000) != 0x3000) 16 + return -ENOEXEC; 17 + 18 + if (bprm->loader) 19 + return -ENOEXEC; 20 + 21 + allow_write_access(bprm->file); 22 + fput(bprm->file); 23 + bprm->file = NULL; 24 + 25 + loader = bprm->vma->vm_end - sizeof(void *); 26 + 27 + file = open_exec("/sbin/loader"); 28 + retval = PTR_ERR(file); 29 + if (IS_ERR(file)) 30 + return retval; 31 + 32 + /* Remember if the application is TASO. */ 33 + bprm->taso = eh->ah.entry < 0x100000000UL; 34 + 35 + bprm->file = file; 36 + bprm->loader = loader; 37 + retval = prepare_binprm(bprm); 38 + if (retval < 0) 39 + return retval; 40 + return search_binary_handler(bprm,regs); 41 + } 42 + 43 + static struct linux_binfmt loader_format = { 44 + .load_binary = load_binary, 45 + }; 46 + 47 + static int __init init_loader_binfmt(void) 48 + { 49 + return register_binfmt(&loader_format); 50 + } 51 + arch_initcall(init_loader_binfmt);
-39
fs/exec.c
··· 57 #include <asm/tlb.h> 58 #include "internal.h" 59 60 - #ifdef __alpha__ 61 - /* for /sbin/loader handling in search_binary_handler() */ 62 - #include <linux/a.out.h> 63 - #endif 64 - 65 int core_uses_pid; 66 char core_pattern[CORENAME_MAX_SIZE] = "core"; 67 int suid_dumpable = 0; ··· 1167 unsigned int depth = bprm->recursion_depth; 1168 int try,retval; 1169 struct linux_binfmt *fmt; 1170 - #ifdef __alpha__ 1171 - /* handle /sbin/loader.. */ 1172 - { 1173 - struct exec * eh = (struct exec *) bprm->buf; 1174 1175 - if (!bprm->loader && eh->fh.f_magic == 0x183 && 1176 - (eh->fh.f_flags & 0x3000) == 0x3000) 1177 - { 1178 - struct file * file; 1179 - unsigned long loader; 1180 - 1181 - allow_write_access(bprm->file); 1182 - fput(bprm->file); 1183 - bprm->file = NULL; 1184 - 1185 - loader = bprm->vma->vm_end - sizeof(void *); 1186 - 1187 - file = open_exec("/sbin/loader"); 1188 - retval = PTR_ERR(file); 1189 - if (IS_ERR(file)) 1190 - return retval; 1191 - 1192 - /* Remember if the application is TASO. */ 1193 - bprm->taso = eh->ah.entry < 0x100000000UL; 1194 - 1195 - bprm->file = file; 1196 - bprm->loader = loader; 1197 - retval = prepare_binprm(bprm); 1198 - if (retval<0) 1199 - return retval; 1200 - /* should call search_binary_handler recursively here, 1201 - but it does not matter */ 1202 - } 1203 - } 1204 - #endif 1205 retval = security_bprm_check(bprm); 1206 if (retval) 1207 return retval;
··· 57 #include <asm/tlb.h> 58 #include "internal.h" 59 60 int core_uses_pid; 61 char core_pattern[CORENAME_MAX_SIZE] = "core"; 62 int suid_dumpable = 0; ··· 1172 unsigned int depth = bprm->recursion_depth; 1173 int try,retval; 1174 struct linux_binfmt *fmt; 1175 1176 retval = security_bprm_check(bprm); 1177 if (retval) 1178 return retval;