mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
971 B
46 lines
971 B
// SPDX-License-Identifier: GPL-2.0 |
|
#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; |
|
|
|
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->interpreter = file; |
|
bprm->loader = loader; |
|
return 0; |
|
} |
|
|
|
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);
|
|
|