Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : #ifndef _LINUX_BINFMTS_H 3 : #define _LINUX_BINFMTS_H 4 : 5 : #include <linux/sched.h> 6 : #include <linux/unistd.h> 7 : #include <asm/exec.h> 8 : #include <uapi/linux/binfmts.h> 9 : 10 : struct filename; 11 : 12 : #define CORENAME_MAX_SIZE 128 13 : 14 : /* 15 : * This structure is used to hold the arguments that are used when loading binaries. 16 : */ 17 : struct linux_binprm { 18 : #ifdef CONFIG_MMU 19 : struct vm_area_struct *vma; 20 : unsigned long vma_pages; 21 : #else 22 : # define MAX_ARG_PAGES 32 23 : struct page *page[MAX_ARG_PAGES]; 24 : #endif 25 : struct mm_struct *mm; 26 : unsigned long p; /* current top of mem */ 27 : unsigned long argmin; /* rlimit marker for copy_strings() */ 28 : unsigned int 29 : /* Should an execfd be passed to userspace? */ 30 : have_execfd:1, 31 : 32 : /* Use the creds of a script (see binfmt_misc) */ 33 : execfd_creds:1, 34 : /* 35 : * Set by bprm_creds_for_exec hook to indicate a 36 : * privilege-gaining exec has happened. Used to set 37 : * AT_SECURE auxv for glibc. 38 : */ 39 : secureexec:1, 40 : /* 41 : * Set when errors can no longer be returned to the 42 : * original userspace. 43 : */ 44 : point_of_no_return:1; 45 : #ifdef __alpha__ 46 : unsigned int taso:1; 47 : #endif 48 : struct file *executable; /* Executable to pass to the interpreter */ 49 : struct file *interpreter; 50 : struct file *file; 51 : struct cred *cred; /* new credentials */ 52 : int unsafe; /* how unsafe this exec is (mask of LSM_UNSAFE_*) */ 53 : unsigned int per_clear; /* bits to clear in current->personality */ 54 : int argc, envc; 55 : const char *filename; /* Name of binary as seen by procps */ 56 : const char *interp; /* Name of the binary really executed. Most 57 : of the time same as filename, but could be 58 : different for binfmt_{misc,script} */ 59 : const char *fdpath; /* generated filename for execveat */ 60 : unsigned interp_flags; 61 : int execfd; /* File descriptor of the executable */ 62 : unsigned long loader, exec; 63 : 64 : struct rlimit rlim_stack; /* Saved RLIMIT_STACK used during exec. */ 65 : 66 : char buf[BINPRM_BUF_SIZE]; 67 : } __randomize_layout; 68 : 69 : #define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0 70 : #define BINPRM_FLAGS_ENFORCE_NONDUMP (1 << BINPRM_FLAGS_ENFORCE_NONDUMP_BIT) 71 : 72 : /* filename of the binary will be inaccessible after exec */ 73 : #define BINPRM_FLAGS_PATH_INACCESSIBLE_BIT 2 74 : #define BINPRM_FLAGS_PATH_INACCESSIBLE (1 << BINPRM_FLAGS_PATH_INACCESSIBLE_BIT) 75 : 76 : /* preserve argv0 for the interpreter */ 77 : #define BINPRM_FLAGS_PRESERVE_ARGV0_BIT 3 78 : #define BINPRM_FLAGS_PRESERVE_ARGV0 (1 << BINPRM_FLAGS_PRESERVE_ARGV0_BIT) 79 : 80 : /* Function parameter for binfmt->coredump */ 81 : struct coredump_params { 82 : const kernel_siginfo_t *siginfo; 83 : struct pt_regs *regs; 84 : struct file *file; 85 : unsigned long limit; 86 : unsigned long mm_flags; 87 : loff_t written; 88 : loff_t pos; 89 : }; 90 : 91 : /* 92 : * This structure defines the functions that are used to load the binary formats that 93 : * linux accepts. 94 : */ 95 : struct linux_binfmt { 96 : struct list_head lh; 97 : struct module *module; 98 : int (*load_binary)(struct linux_binprm *); 99 : int (*load_shlib)(struct file *); 100 : int (*core_dump)(struct coredump_params *cprm); 101 : unsigned long min_coredump; /* minimal dump size */ 102 : } __randomize_layout; 103 : 104 : extern void __register_binfmt(struct linux_binfmt *fmt, int insert); 105 : 106 : /* Registration of default binfmt handlers */ 107 3 : static inline void register_binfmt(struct linux_binfmt *fmt) 108 : { 109 3 : __register_binfmt(fmt, 0); 110 : } 111 : /* Same as above, but adds a new binfmt at the top of the list */ 112 : static inline void insert_binfmt(struct linux_binfmt *fmt) 113 : { 114 : __register_binfmt(fmt, 1); 115 : } 116 : 117 : extern void unregister_binfmt(struct linux_binfmt *); 118 : 119 : extern int __must_check remove_arg_zero(struct linux_binprm *); 120 : extern int begin_new_exec(struct linux_binprm * bprm); 121 : extern void setup_new_exec(struct linux_binprm * bprm); 122 : extern void finalize_exec(struct linux_binprm *bprm); 123 : extern void would_dump(struct linux_binprm *, struct file *); 124 : 125 : extern int suid_dumpable; 126 : 127 : /* Stack area protections */ 128 : #define EXSTACK_DEFAULT 0 /* Whatever the arch defaults to */ 129 : #define EXSTACK_DISABLE_X 1 /* Disable executable stacks */ 130 : #define EXSTACK_ENABLE_X 2 /* Enable executable stacks */ 131 : 132 : extern int setup_arg_pages(struct linux_binprm * bprm, 133 : unsigned long stack_top, 134 : int executable_stack); 135 : extern int transfer_args_to_stack(struct linux_binprm *bprm, 136 : unsigned long *sp_location); 137 : extern int bprm_change_interp(const char *interp, struct linux_binprm *bprm); 138 : int copy_string_kernel(const char *arg, struct linux_binprm *bprm); 139 : extern void set_binfmt(struct linux_binfmt *new); 140 : extern ssize_t read_code(struct file *, unsigned long, loff_t, size_t); 141 : 142 : int kernel_execve(const char *filename, 143 : const char *const *argv, const char *const *envp); 144 : 145 : #endif /* _LINUX_BINFMTS_H */