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

Generated by: LCOV version 1.14