linux/arch/alpha/kernel/binfmt_loader.c
<<
>>
Prefs
   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