at v5.4-rc8 53 lines 1.1 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2#include <linux/init.h> 3#include <linux/fs.h> 4#include <linux/file.h> 5#include <linux/mm_types.h> 6#include <linux/binfmts.h> 7#include <linux/a.out.h> 8 9static int load_binary(struct linux_binprm *bprm) 10{ 11 struct exec *eh = (struct exec *)bprm->buf; 12 unsigned long loader; 13 struct file *file; 14 int retval; 15 16 if (eh->fh.f_magic != 0x183 || (eh->fh.f_flags & 0x3000) != 0x3000) 17 return -ENOEXEC; 18 19 if (bprm->loader) 20 return -ENOEXEC; 21 22 allow_write_access(bprm->file); 23 fput(bprm->file); 24 bprm->file = NULL; 25 26 loader = bprm->vma->vm_end - sizeof(void *); 27 28 file = open_exec("/sbin/loader"); 29 retval = PTR_ERR(file); 30 if (IS_ERR(file)) 31 return retval; 32 33 /* Remember if the application is TASO. */ 34 bprm->taso = eh->ah.entry < 0x100000000UL; 35 36 bprm->file = file; 37 bprm->loader = loader; 38 retval = prepare_binprm(bprm); 39 if (retval < 0) 40 return retval; 41 return search_binary_handler(bprm); 42} 43 44static struct linux_binfmt loader_format = { 45 .load_binary = load_binary, 46}; 47 48static int __init init_loader_binfmt(void) 49{ 50 insert_binfmt(&loader_format); 51 return 0; 52} 53arch_initcall(init_loader_binfmt);