cregit-Linux how code gets into the kernel

Release 4.11 fs/binfmt_em86.c

Directory: fs
 *  linux/fs/binfmt_em86.c
 *  Based on linux/fs/binfmt_script.c
 *  Copyright (C) 1996  Martin von Löwis
 *  original #!-checking implemented by tytso.
 *  em86 changes Copyright (C) 1997  Jim Paradis

#include <linux/module.h>
#include <linux/string.h>
#include <linux/stat.h>
#include <linux/binfmts.h>
#include <linux/elf.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/file.h>
#include <linux/errno.h>

#define EM86_INTERP	"/usr/bin/em86"

#define EM86_I_NAME	"em86"

static int load_em86(struct linux_binprm *bprm) { const char *i_name, *i_arg; char *interp; struct file * file; int retval; struct elfhdr elf_ex; /* Make sure this is a Linux/Intel ELF executable... */ elf_ex = *((struct elfhdr *)bprm->buf); if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0) return -ENOEXEC; /* First of all, some simple consistency checks */ if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) || (!((elf_ex.e_machine == EM_386) || (elf_ex.e_machine == EM_486))) || !bprm->file->f_op->mmap) { return -ENOEXEC; } /* Need to be able to load the file after exec */ if (bprm->interp_flags & BINPRM_FLAGS_PATH_INACCESSIBLE) return -ENOENT; allow_write_access(bprm->file); fput(bprm->file); bprm->file = NULL; /* Unlike in the script case, we don't have to do any hairy * parsing to find our interpreter... it's hardcoded! */ interp = EM86_INTERP; i_name = EM86_I_NAME; i_arg = NULL; /* We reserve the right to add an arg later */ /* * Splice in (1) the interpreter's name for argv[0] * (2) (optional) argument to interpreter * (3) filename of emulated file (replace argv[0]) * * This is done in reverse order, because of how the * user environment and arguments are stored. */ remove_arg_zero(bprm); retval = copy_strings_kernel(1, &bprm->filename, bprm); if (retval < 0) return retval; bprm->argc++; if (i_arg) { retval = copy_strings_kernel(1, &i_arg, bprm); if (retval < 0) return retval; bprm->argc++; } retval = copy_strings_kernel(1, &i_name, bprm); if (retval < 0) return retval; bprm->argc++; /* * OK, now restart the process with the interpreter's inode. * Note that we use open_exec() as the name is now in kernel * space, and we don't need to copy it. */ file = open_exec(interp); if (IS_ERR(file)) return PTR_ERR(file); bprm->file = file; retval = prepare_binprm(bprm); if (retval < 0) return retval; return search_binary_handler(bprm); }


Linus Torvalds (pre-git)29294.19%777.78%
David Drysdale134.19%111.11%
Daniel Wagner51.61%111.11%

static struct linux_binfmt em86_format = { .module = THIS_MODULE, .load_binary = load_em86, };
static int __init init_em86_binfmt(void) { register_binfmt(&em86_format); return 0; }


Linus Torvalds (pre-git)1583.33%375.00%
Al Viro316.67%125.00%

static void __exit exit_em86_binfmt(void) { unregister_binfmt(&em86_format); }


Linus Torvalds (pre-git)15100.00%2100.00%

core_initcall(init_em86_binfmt); module_exit(exit_em86_binfmt); MODULE_LICENSE("GPL");

Overall Contributors

Linus Torvalds (pre-git)36588.81%1152.38%
David Drysdale133.16%14.76%
Dave Jones81.95%29.52%
Jan-Benedict Glaw61.46%14.76%
Andrew Morton51.22%14.76%
Daniel Wagner51.22%14.76%
Art Haas40.97%14.76%
Al Viro30.73%14.76%
Jan Engelhardt10.24%14.76%
Chris Wright10.24%14.76%
Directory: fs
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.