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 8static int load_binary(struct linux_binprm *bprm) 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); 41} 42 43static struct linux_binfmt loader_format = { 44 .load_binary = load_binary, 45}; 46 47static int __init init_loader_binfmt(void) 48{ 49 insert_binfmt(&loader_format); 50 return 0; 51} 52arch_initcall(init_loader_binfmt); 53