1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_BINFMTS_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_BINFMTS_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/capability.h>
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct pt_regs;
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * MAX_ARG_PAGES defines the number of pages allocated for arguments
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and envelope for the new program. 32 should suffice, this gives
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * a maximum env+arg of 128kB w/4KB pages!
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MAX_ARG_PAGES 32
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* sizeof(linux_binprm->buf) */
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BINPRM_BUF_SIZE 128
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This structure is used to hold the arguments that are used when loading binaries.
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct linux_binprm{
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char buf[BINPRM_BUF_SIZE];
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct page *page[MAX_ARG_PAGES];
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct mm_struct *mm;
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long p; /* current top of mem */
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int sh_bang;
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct file * file;
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int e_uid, e_gid;
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	kernel_cap_t cap_inheritable, cap_permitted, cap_effective;
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void *security;
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int argc, envc;
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char * filename;	/* Name of binary as seen by procps */
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char * interp;		/* Name of the binary really executed. Most
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				   of the time same as filename, but could be
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				   different for binfmt_{misc,script} */
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned interp_flags;
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned interp_data;
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long loader, exec;
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BINPRM_FLAGS_ENFORCE_NONDUMP (1 << BINPRM_FLAGS_ENFORCE_NONDUMP_BIT)
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* fd of the binary should be passed to the interpreter */
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BINPRM_FLAGS_EXECFD_BIT 1
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This structure defines the functions that are used to load the binary formats that
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linux accepts.
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct linux_binfmt {
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct linux_binfmt * next;
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct module *module;
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*load_binary)(struct linux_binprm *, struct  pt_regs * regs);
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*load_shlib)(struct file *);
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*core_dump)(long signr, struct pt_regs * regs, struct file * file);
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long min_coredump;	/* minimal dump size */
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int register_binfmt(struct linux_binfmt *);
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int unregister_binfmt(struct linux_binfmt *);
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int prepare_binprm(struct linux_binprm *);
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void remove_arg_zero(struct linux_binprm *);
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int search_binary_handler(struct linux_binprm *,struct pt_regs *);
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int flush_old_exec(struct linux_binprm * bprm);
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int suid_dumpable;
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SUID_DUMP_DISABLE	0	/* No setuid dumping */
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SUID_DUMP_USER		1	/* Dump as user of process */
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SUID_DUMP_ROOT		2	/* Dump as root */
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Stack area protections */
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define EXSTACK_DEFAULT   0	/* Whatever the arch defaults to */
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define EXSTACK_DISABLE_X 1	/* Disable executable stacks */
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define EXSTACK_ENABLE_X  2	/* Enable executable stacks */
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int setup_arg_pages(struct linux_binprm * bprm,
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			   unsigned long stack_top,
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			   int executable_stack);
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm);
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void compute_creds(struct linux_binprm *binprm);
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int do_coredump(long signr, int exit_code, struct pt_regs * regs);
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int set_binfmt(struct linux_binfmt *new);
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_BINFMTS_H */
92