File Index
Files and directories
Sign in
FILE

binfmts.h

File preview with syntax highlighting.

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