LCOV - code coverage report
Current view: top level - include/linux - binfmts.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 2 2 100.0 %
Date: 2021-04-22 12:43:58 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             : 
      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 */

Generated by: LCOV version 1.14