LCOV - code coverage report
Current view: top level - include/linux - binfmts.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 1 100.0 %
Date: 2023-03-27 20:00:47 Functions: 0 0 -

          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             : struct 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             :  */
      18             : struct linux_binprm {
      19             : #ifdef CONFIG_MMU
      20             :         struct vm_area_struct *vma;
      21             :         unsigned long vma_pages;
      22             : #else
      23             : # define MAX_ARG_PAGES  32
      24             :         struct page *page[MAX_ARG_PAGES];
      25             : #endif
      26             :         struct mm_struct *mm;
      27             :         unsigned long p; /* current top of mem */
      28             :         unsigned long argmin; /* rlimit marker for copy_strings() */
      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             :         struct file *executable; /* Executable to pass to the interpreter */
      47             :         struct file *interpreter;
      48             :         struct file *file;
      49             :         struct cred *cred;      /* new credentials */
      50             :         int unsafe;             /* how unsafe this exec is (mask of LSM_UNSAFE_*) */
      51             :         unsigned int per_clear; /* bits to clear in current->personality */
      52             :         int argc, envc;
      53             :         const char *filename;   /* Name of binary as seen by procps */
      54             :         const char *interp;     /* Name of the binary really executed. Most
      55             :                                    of the time same as filename, but could be
      56             :                                    different for binfmt_{misc,script} */
      57             :         const char *fdpath;     /* generated filename for execveat */
      58             :         unsigned interp_flags;
      59             :         int execfd;             /* File descriptor of the executable */
      60             :         unsigned long loader, exec;
      61             : 
      62             :         struct rlimit rlim_stack; /* Saved RLIMIT_STACK used during exec. */
      63             : 
      64             :         char buf[BINPRM_BUF_SIZE];
      65             : } __randomize_layout;
      66             : 
      67             : #define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0
      68             : #define BINPRM_FLAGS_ENFORCE_NONDUMP (1 << BINPRM_FLAGS_ENFORCE_NONDUMP_BIT)
      69             : 
      70             : /* filename of the binary will be inaccessible after exec */
      71             : #define BINPRM_FLAGS_PATH_INACCESSIBLE_BIT 2
      72             : #define BINPRM_FLAGS_PATH_INACCESSIBLE (1 << BINPRM_FLAGS_PATH_INACCESSIBLE_BIT)
      73             : 
      74             : /* preserve argv0 for the interpreter  */
      75             : #define BINPRM_FLAGS_PRESERVE_ARGV0_BIT 3
      76             : #define BINPRM_FLAGS_PRESERVE_ARGV0 (1 << BINPRM_FLAGS_PRESERVE_ARGV0_BIT)
      77             : 
      78             : /*
      79             :  * This structure defines the functions that are used to load the binary formats that
      80             :  * linux accepts.
      81             :  */
      82             : struct linux_binfmt {
      83             :         struct list_head lh;
      84             :         struct module *module;
      85             :         int (*load_binary)(struct linux_binprm *);
      86             :         int (*load_shlib)(struct file *);
      87             : #ifdef CONFIG_COREDUMP
      88             :         int (*core_dump)(struct coredump_params *cprm);
      89             :         unsigned long min_coredump;     /* minimal dump size */
      90             : #endif
      91             : } __randomize_layout;
      92             : 
      93             : extern void __register_binfmt(struct linux_binfmt *fmt, int insert);
      94             : 
      95             : /* Registration of default binfmt handlers */
      96             : static inline void register_binfmt(struct linux_binfmt *fmt)
      97             : {
      98           2 :         __register_binfmt(fmt, 0);
      99             : }
     100             : /* Same as above, but adds a new binfmt at the top of the list */
     101             : static inline void insert_binfmt(struct linux_binfmt *fmt)
     102             : {
     103             :         __register_binfmt(fmt, 1);
     104             : }
     105             : 
     106             : extern void unregister_binfmt(struct linux_binfmt *);
     107             : 
     108             : extern int __must_check remove_arg_zero(struct linux_binprm *);
     109             : extern int begin_new_exec(struct linux_binprm * bprm);
     110             : extern void setup_new_exec(struct linux_binprm * bprm);
     111             : extern void finalize_exec(struct linux_binprm *bprm);
     112             : extern void would_dump(struct linux_binprm *, struct file *);
     113             : 
     114             : extern int suid_dumpable;
     115             : 
     116             : /* Stack area protections */
     117             : #define EXSTACK_DEFAULT   0     /* Whatever the arch defaults to */
     118             : #define EXSTACK_DISABLE_X 1     /* Disable executable stacks */
     119             : #define EXSTACK_ENABLE_X  2     /* Enable executable stacks */
     120             : 
     121             : extern int setup_arg_pages(struct linux_binprm * bprm,
     122             :                            unsigned long stack_top,
     123             :                            int executable_stack);
     124             : extern int transfer_args_to_stack(struct linux_binprm *bprm,
     125             :                                   unsigned long *sp_location);
     126             : extern int bprm_change_interp(const char *interp, struct linux_binprm *bprm);
     127             : int copy_string_kernel(const char *arg, struct linux_binprm *bprm);
     128             : extern void set_binfmt(struct linux_binfmt *new);
     129             : extern ssize_t read_code(struct file *, unsigned long, loff_t, size_t);
     130             : 
     131             : int kernel_execve(const char *filename,
     132             :                   const char *const *argv, const char *const *envp);
     133             : 
     134             : #endif /* _LINUX_BINFMTS_H */

Generated by: LCOV version 1.14