1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- #include <linux/init.h>
- #include <linux/fs.h>
- #include <linux/file.h>
- #include <linux/mm_types.h>
- #include <linux/binfmts.h>
- #include <linux/a.out.h>
- static int load_binary(struct linux_binprm *bprm)
- {
- struct exec *eh = (struct exec *)bprm->buf;
- unsigned long loader;
- struct file *file;
- int retval;
- if (eh->fh.f_magic != 0x183 || (eh->fh.f_flags & 0x3000) != 0x3000)
- return -ENOEXEC;
- if (bprm->loader)
- return -ENOEXEC;
- allow_write_access(bprm->file);
- fput(bprm->file);
- bprm->file = NULL;
- loader = bprm->vma->vm_end - sizeof(void *);
- file = open_exec("/sbin/loader");
- retval = PTR_ERR(file);
- if (IS_ERR(file))
- return retval;
- /* Remember if the application is TASO. */
- bprm->taso = eh->ah.entry < 0x100000000UL;
- bprm->file = file;
- bprm->loader = loader;
- retval = prepare_binprm(bprm);
- if (retval < 0)
- return retval;
- return search_binary_handler(bprm);
- }
- static struct linux_binfmt loader_format = {
- .load_binary = load_binary,
- };
- static int __init init_loader_binfmt(void)
- {
- insert_binfmt(&loader_format);
- return 0;
- }
- arch_initcall(init_loader_binfmt);
|