LCOV - code coverage report
Current view: top level - fs - exec.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 373 522 71.5 %
Date: 2014-04-16 Functions: 35 39 89.7 %
Branches: 184 295 62.4 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  linux/fs/exec.c
       3                 :            :  *
       4                 :            :  *  Copyright (C) 1991, 1992  Linus Torvalds
       5                 :            :  */
       6                 :            : 
       7                 :            : /*
       8                 :            :  * #!-checking implemented by tytso.
       9                 :            :  */
      10                 :            : /*
      11                 :            :  * Demand-loading implemented 01.12.91 - no need to read anything but
      12                 :            :  * the header into memory. The inode of the executable is put into
      13                 :            :  * "current->executable", and page faults do the actual loading. Clean.
      14                 :            :  *
      15                 :            :  * Once more I can proudly say that linux stood up to being changed: it
      16                 :            :  * was less than 2 hours work to get demand-loading completely implemented.
      17                 :            :  *
      18                 :            :  * Demand loading changed July 1993 by Eric Youngdale.   Use mmap instead,
      19                 :            :  * current->executable is only used by the procfs.  This allows a dispatch
      20                 :            :  * table to check for several different types  of binary formats.  We keep
      21                 :            :  * trying until we recognize the file or we run out of supported binary
      22                 :            :  * formats. 
      23                 :            :  */
      24                 :            : 
      25                 :            : #include <linux/slab.h>
      26                 :            : #include <linux/file.h>
      27                 :            : #include <linux/fdtable.h>
      28                 :            : #include <linux/mm.h>
      29                 :            : #include <linux/stat.h>
      30                 :            : #include <linux/fcntl.h>
      31                 :            : #include <linux/swap.h>
      32                 :            : #include <linux/string.h>
      33                 :            : #include <linux/init.h>
      34                 :            : #include <linux/pagemap.h>
      35                 :            : #include <linux/perf_event.h>
      36                 :            : #include <linux/highmem.h>
      37                 :            : #include <linux/spinlock.h>
      38                 :            : #include <linux/key.h>
      39                 :            : #include <linux/personality.h>
      40                 :            : #include <linux/binfmts.h>
      41                 :            : #include <linux/utsname.h>
      42                 :            : #include <linux/pid_namespace.h>
      43                 :            : #include <linux/module.h>
      44                 :            : #include <linux/namei.h>
      45                 :            : #include <linux/mount.h>
      46                 :            : #include <linux/security.h>
      47                 :            : #include <linux/syscalls.h>
      48                 :            : #include <linux/tsacct_kern.h>
      49                 :            : #include <linux/cn_proc.h>
      50                 :            : #include <linux/audit.h>
      51                 :            : #include <linux/tracehook.h>
      52                 :            : #include <linux/kmod.h>
      53                 :            : #include <linux/fsnotify.h>
      54                 :            : #include <linux/fs_struct.h>
      55                 :            : #include <linux/pipe_fs_i.h>
      56                 :            : #include <linux/oom.h>
      57                 :            : #include <linux/compat.h>
      58                 :            : 
      59                 :            : #include <asm/uaccess.h>
      60                 :            : #include <asm/mmu_context.h>
      61                 :            : #include <asm/tlb.h>
      62                 :            : 
      63                 :            : #include <trace/events/task.h>
      64                 :            : #include "internal.h"
      65                 :            : 
      66                 :            : #include <trace/events/sched.h>
      67                 :            : 
      68                 :            : int suid_dumpable = 0;
      69                 :            : 
      70                 :            : static LIST_HEAD(formats);
      71                 :            : static DEFINE_RWLOCK(binfmt_lock);
      72                 :            : 
      73                 :          0 : void __register_binfmt(struct linux_binfmt * fmt, int insert)
      74                 :            : {
      75         [ #  # ]:          0 :         BUG_ON(!fmt);
      76 [ #  # ][ #  # ]:          0 :         if (WARN_ON(!fmt->load_binary))
      77                 :          0 :                 return;
      78                 :          0 :         write_lock(&binfmt_lock);
      79         [ #  # ]:          0 :         insert ? list_add(&fmt->lh, &formats) :
      80                 :          0 :                  list_add_tail(&fmt->lh, &formats);
      81                 :            :         write_unlock(&binfmt_lock);
      82                 :            : }
      83                 :            : 
      84                 :            : EXPORT_SYMBOL(__register_binfmt);
      85                 :            : 
      86                 :          0 : void unregister_binfmt(struct linux_binfmt * fmt)
      87                 :            : {
      88                 :          0 :         write_lock(&binfmt_lock);
      89                 :            :         list_del(&fmt->lh);
      90                 :            :         write_unlock(&binfmt_lock);
      91                 :          0 : }
      92                 :            : 
      93                 :            : EXPORT_SYMBOL(unregister_binfmt);
      94                 :            : 
      95                 :            : static inline void put_binfmt(struct linux_binfmt * fmt)
      96                 :            : {
      97                 :      82477 :         module_put(fmt->module);
      98                 :            : }
      99                 :            : 
     100                 :            : /*
     101                 :            :  * Note that a shared library must be both readable and executable due to
     102                 :            :  * security reasons.
     103                 :            :  *
     104                 :            :  * Also note that we take the address to load from from the file itself.
     105                 :            :  */
     106                 :          0 : SYSCALL_DEFINE1(uselib, const char __user *, library)
     107                 :            : {
     108                 :          0 :         struct linux_binfmt *fmt;
     109                 :          0 :         struct file *file;
     110                 :          0 :         struct filename *tmp = getname(library);
     111                 :            :         int error = PTR_ERR(tmp);
     112                 :            :         static const struct open_flags uselib_flags = {
     113                 :            :                 .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC,
     114                 :            :                 .acc_mode = MAY_READ | MAY_EXEC | MAY_OPEN,
     115                 :            :                 .intent = LOOKUP_OPEN,
     116                 :            :                 .lookup_flags = LOOKUP_FOLLOW,
     117                 :            :         };
     118                 :            : 
     119         [ #  # ]:          0 :         if (IS_ERR(tmp))
     120                 :            :                 goto out;
     121                 :            : 
     122                 :          0 :         file = do_filp_open(AT_FDCWD, tmp, &uselib_flags);
     123                 :          0 :         putname(tmp);
     124                 :            :         error = PTR_ERR(file);
     125         [ #  # ]:          0 :         if (IS_ERR(file))
     126                 :            :                 goto out;
     127                 :            : 
     128                 :            :         error = -EINVAL;
     129         [ #  # ]:          0 :         if (!S_ISREG(file_inode(file)->i_mode))
     130                 :            :                 goto exit;
     131                 :            : 
     132                 :            :         error = -EACCES;
     133         [ #  # ]:          0 :         if (file->f_path.mnt->mnt_flags & MNT_NOEXEC)
     134                 :            :                 goto exit;
     135                 :            : 
     136                 :            :         fsnotify_open(file);
     137                 :            : 
     138                 :            :         error = -ENOEXEC;
     139                 :            : 
     140                 :          0 :         read_lock(&binfmt_lock);
     141         [ #  # ]:          0 :         list_for_each_entry(fmt, &formats, lh) {
     142         [ #  # ]:          0 :                 if (!fmt->load_shlib)
     143                 :          0 :                         continue;
     144         [ #  # ]:          0 :                 if (!try_module_get(fmt->module))
     145                 :          0 :                         continue;
     146                 :            :                 read_unlock(&binfmt_lock);
     147                 :          0 :                 error = fmt->load_shlib(file);
     148                 :          0 :                 read_lock(&binfmt_lock);
     149                 :            :                 put_binfmt(fmt);
     150         [ #  # ]:          0 :                 if (error != -ENOEXEC)
     151                 :            :                         break;
     152                 :            :         }
     153                 :            :         read_unlock(&binfmt_lock);
     154                 :            : exit:
     155                 :          0 :         fput(file);
     156                 :            : out:
     157                 :            :         return error;
     158                 :            : }
     159                 :            : 
     160                 :            : #ifdef CONFIG_MMU
     161                 :            : /*
     162                 :            :  * The nascent bprm->mm is not visible until exec_mmap() but it can
     163                 :            :  * use a lot of memory, account these pages in current->mm temporary
     164                 :            :  * for oom_badness()->get_mm_rss(). Once exec succeeds or fails, we
     165                 :            :  * change the counter back via acct_arg_size(0).
     166                 :            :  */
     167                 :    2068409 : static void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)
     168                 :            : {
     169                 :    2068409 :         struct mm_struct *mm = current->mm;
     170                 :    2068409 :         long diff = (long)(pages - bprm->vma_pages);
     171                 :            : 
     172         [ +  + ]:    2068409 :         if (!mm || !diff)
     173                 :          0 :                 return;
     174                 :            : 
     175                 :    2013302 :         bprm->vma_pages = pages;
     176                 :            :         add_mm_counter(mm, MM_ANONPAGES, diff);
     177                 :            : }
     178                 :            : 
     179                 :          0 : static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
     180                 :            :                 int write)
     181                 :            : {
     182                 :            :         struct page *page;
     183                 :            :         int ret;
     184                 :            : 
     185                 :            : #ifdef CONFIG_STACK_GROWSUP
     186                 :            :         if (write) {
     187                 :            :                 ret = expand_downwards(bprm->vma, pos);
     188                 :            :                 if (ret < 0)
     189                 :            :                         return NULL;
     190                 :            :         }
     191                 :            : #endif
     192                 :    2041511 :         ret = get_user_pages(current, bprm->mm, pos,
     193                 :            :                         1, write, 1, &page, NULL);
     194         [ +  + ]:    2041511 :         if (ret <= 0)
     195                 :            :                 return NULL;
     196                 :            : 
     197         [ +  + ]:    2041508 :         if (write) {
     198                 :    2041154 :                 unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start;
     199                 :            :                 struct rlimit *rlim;
     200                 :            : 
     201                 :    2041154 :                 acct_arg_size(bprm, size / PAGE_SIZE);
     202                 :            : 
     203                 :            :                 /*
     204                 :            :                  * We've historically supported up to 32 pages (ARG_MAX)
     205                 :            :                  * of argument strings even with small stacks
     206                 :            :                  */
     207         [ +  + ]:    2041153 :                 if (size <= ARG_MAX)
     208                 :      89535 :                         return page;
     209                 :            : 
     210                 :            :                 /*
     211                 :            :                  * Limit to 1/4-th the stack size for the argv+env strings.
     212                 :            :                  * This ensures that:
     213                 :            :                  *  - the remaining binfmt code will not run out of stack space,
     214                 :            :                  *  - the program will have a reasonable amount of stack left
     215                 :            :                  *    to work from.
     216                 :            :                  */
     217                 :    1951618 :                 rlim = current->signal->rlim;
     218         [ -  + ]:    1951618 :                 if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur) / 4) {
     219                 :          0 :                         put_page(page);
     220                 :          0 :                         return NULL;
     221                 :            :                 }
     222                 :            :         }
     223                 :            : 
     224                 :    1951972 :         return page;
     225                 :            : }
     226                 :            : 
     227                 :            : static void put_arg_page(struct page *page)
     228                 :            : {
     229                 :    2041508 :         put_page(page);
     230                 :            : }
     231                 :            : 
     232                 :            : static void free_arg_page(struct linux_binprm *bprm, int i)
     233                 :            : {
     234                 :            : }
     235                 :            : 
     236                 :            : static void free_arg_pages(struct linux_binprm *bprm)
     237                 :            : {
     238                 :            : }
     239                 :            : 
     240                 :    2041157 : static void flush_arg_page(struct linux_binprm *bprm, unsigned long pos,
     241                 :            :                 struct page *page)
     242                 :            : {
     243                 :    2041157 :         flush_cache_page(bprm->vma, pos, page_to_pfn(page));
     244                 :    2041158 : }
     245                 :            : 
     246                 :          0 : static int __bprm_mm_init(struct linux_binprm *bprm)
     247                 :            : {
     248                 :            :         int err;
     249                 :            :         struct vm_area_struct *vma = NULL;
     250                 :      27245 :         struct mm_struct *mm = bprm->mm;
     251                 :            : 
     252                 :      54492 :         bprm->vma = vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
     253         [ +  - ]:      27247 :         if (!vma)
     254                 :            :                 return -ENOMEM;
     255                 :            : 
     256                 :      27247 :         down_write(&mm->mmap_sem);
     257                 :      27249 :         vma->vm_mm = mm;
     258                 :            : 
     259                 :            :         /*
     260                 :            :          * Place the stack at the largest stack address the architecture
     261                 :            :          * supports. Later, we'll move this to an appropriate place. We don't
     262                 :            :          * use STACK_TOP because that can depend on attributes which aren't
     263                 :            :          * configured yet.
     264                 :            :          */
     265                 :            :         BUILD_BUG_ON(VM_STACK_FLAGS & VM_STACK_INCOMPLETE_SETUP);
     266                 :      27249 :         vma->vm_end = STACK_TOP_MAX;
     267                 :      27249 :         vma->vm_start = vma->vm_end - PAGE_SIZE;
     268         [ +  - ]:      27249 :         vma->vm_flags = VM_SOFTDIRTY | VM_STACK_FLAGS | VM_STACK_INCOMPLETE_SETUP;
     269                 :      27249 :         vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
     270                 :      27241 :         INIT_LIST_HEAD(&vma->anon_vma_chain);
     271                 :            : 
     272                 :      27241 :         err = insert_vm_struct(mm, vma);
     273         [ +  - ]:      27252 :         if (err)
     274                 :            :                 goto err;
     275                 :            : 
     276                 :      27252 :         mm->stack_vm = mm->total_vm = 1;
     277                 :      27252 :         up_write(&mm->mmap_sem);
     278                 :      27253 :         bprm->p = vma->vm_end - sizeof(void *);
     279                 :      27253 :         return 0;
     280                 :            : err:
     281                 :          0 :         up_write(&mm->mmap_sem);
     282                 :          0 :         bprm->vma = NULL;
     283                 :          0 :         kmem_cache_free(vm_area_cachep, vma);
     284                 :          0 :         return err;
     285                 :            : }
     286                 :            : 
     287                 :            : static bool valid_arg_len(struct linux_binprm *bprm, long len)
     288                 :            : {
     289                 :     919268 :         return len <= MAX_ARG_STRLEN;
     290                 :            : }
     291                 :            : 
     292                 :            : #else
     293                 :            : 
     294                 :            : static inline void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)
     295                 :            : {
     296                 :            : }
     297                 :            : 
     298                 :            : static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
     299                 :            :                 int write)
     300                 :            : {
     301                 :            :         struct page *page;
     302                 :            : 
     303                 :            :         page = bprm->page[pos / PAGE_SIZE];
     304                 :            :         if (!page && write) {
     305                 :            :                 page = alloc_page(GFP_HIGHUSER|__GFP_ZERO);
     306                 :            :                 if (!page)
     307                 :            :                         return NULL;
     308                 :            :                 bprm->page[pos / PAGE_SIZE] = page;
     309                 :            :         }
     310                 :            : 
     311                 :            :         return page;
     312                 :            : }
     313                 :            : 
     314                 :            : static void put_arg_page(struct page *page)
     315                 :            : {
     316                 :            : }
     317                 :            : 
     318                 :            : static void free_arg_page(struct linux_binprm *bprm, int i)
     319                 :            : {
     320                 :            :         if (bprm->page[i]) {
     321                 :            :                 __free_page(bprm->page[i]);
     322                 :            :                 bprm->page[i] = NULL;
     323                 :            :         }
     324                 :            : }
     325                 :            : 
     326                 :            : static void free_arg_pages(struct linux_binprm *bprm)
     327                 :            : {
     328                 :            :         int i;
     329                 :            : 
     330                 :            :         for (i = 0; i < MAX_ARG_PAGES; i++)
     331                 :            :                 free_arg_page(bprm, i);
     332                 :            : }
     333                 :            : 
     334                 :            : static void flush_arg_page(struct linux_binprm *bprm, unsigned long pos,
     335                 :            :                 struct page *page)
     336                 :            : {
     337                 :            : }
     338                 :            : 
     339                 :            : static int __bprm_mm_init(struct linux_binprm *bprm)
     340                 :            : {
     341                 :            :         bprm->p = PAGE_SIZE * MAX_ARG_PAGES - sizeof(void *);
     342                 :            :         return 0;
     343                 :            : }
     344                 :            : 
     345                 :            : static bool valid_arg_len(struct linux_binprm *bprm, long len)
     346                 :            : {
     347                 :            :         return len <= bprm->p;
     348                 :            : }
     349                 :            : 
     350                 :            : #endif /* CONFIG_MMU */
     351                 :            : 
     352                 :            : /*
     353                 :            :  * Create a new mm_struct and populate it with a temporary stack
     354                 :            :  * vm_area_struct.  We don't have enough context at this point to set the stack
     355                 :            :  * flags, permissions, and offset, so we use temporary values.  We'll update
     356                 :            :  * them later in setup_arg_pages().
     357                 :            :  */
     358                 :          0 : static int bprm_mm_init(struct linux_binprm *bprm)
     359                 :            : {
     360                 :            :         int err;
     361                 :            :         struct mm_struct *mm = NULL;
     362                 :            : 
     363                 :      27251 :         bprm->mm = mm = mm_alloc();
     364                 :            :         err = -ENOMEM;
     365         [ +  - ]:      27249 :         if (!mm)
     366                 :            :                 goto err;
     367                 :            : 
     368                 :      27249 :         err = init_new_context(current, mm);
     369                 :            :         if (err)
     370                 :            :                 goto err;
     371                 :            : 
     372                 :      27252 :         err = __bprm_mm_init(bprm);
     373            [ + ]:      27249 :         if (err)
     374                 :            :                 goto err;
     375                 :            : 
     376                 :            :         return 0;
     377                 :            : 
     378                 :            : err:
     379         [ #  # ]:      27251 :         if (mm) {
     380                 :          0 :                 bprm->mm = NULL;
     381                 :            :                 mmdrop(mm);
     382                 :            :         }
     383                 :            : 
     384                 :          0 :         return err;
     385                 :            : }
     386                 :            : 
     387                 :            : struct user_arg_ptr {
     388                 :            : #ifdef CONFIG_COMPAT
     389                 :            :         bool is_compat;
     390                 :            : #endif
     391                 :            :         union {
     392                 :            :                 const char __user *const __user *native;
     393                 :            : #ifdef CONFIG_COMPAT
     394                 :            :                 const compat_uptr_t __user *compat;
     395                 :            : #endif
     396                 :            :         } ptr;
     397                 :            : };
     398                 :            : 
     399                 :          0 : static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr)
     400                 :            : {
     401                 :            :         const char __user *native;
     402                 :            : 
     403                 :            : #ifdef CONFIG_COMPAT
     404                 :            :         if (unlikely(argv.is_compat)) {
     405                 :            :                 compat_uptr_t compat;
     406                 :            : 
     407                 :            :                 if (get_user(compat, argv.ptr.compat + nr))
     408                 :            :                         return ERR_PTR(-EFAULT);
     409                 :            : 
     410                 :            :                 return compat_ptr(compat);
     411                 :            :         }
     412                 :            : #endif
     413                 :            : 
     414            [ + ]:    1864570 :         if (get_user(native, argv.ptr.native + nr))
     415                 :            :                 return ERR_PTR(-EFAULT);
     416                 :            : 
     417                 :    1864677 :         return native;
     418                 :            : }
     419                 :            : 
     420                 :            : /*
     421                 :            :  * count() counts the number of strings in array ARGV.
     422                 :            :  */
     423                 :          0 : static int count(struct user_arg_ptr argv, int max)
     424                 :            : {
     425                 :            :         int i = 0;
     426                 :            : 
     427         [ +  + ]:      54551 :         if (argv.ptr.native != NULL) {
     428                 :            :                 for (;;) {
     429                 :     945496 :                         const char __user *p = get_user_arg_ptr(argv, i);
     430                 :            : 
     431         [ +  + ]:     945400 :                         if (!p)
     432                 :            :                                 break;
     433                 :            : 
     434         [ +  + ]:     890955 :                         if (IS_ERR(p))
     435                 :            :                                 return -EFAULT;
     436                 :            : 
     437            [ + ]:     890938 :                         if (i >= max)
     438                 :            :                                 return -E2BIG;
     439                 :     890944 :                         ++i;
     440                 :            : 
     441         [ +  + ]:     890944 :                         if (fatal_signal_pending(current))
     442                 :            :                                 return -ERESTARTNOHAND;
     443                 :     890909 :                         cond_resched();
     444                 :     890999 :                 }
     445                 :            :         }
     446                 :      54499 :         return i;
     447                 :            : }
     448                 :            : 
     449                 :            : /*
     450                 :            :  * 'copy_strings()' copies argument/environment strings from the old
     451                 :            :  * processes's memory to the new process's stack.  The call to get_user_pages()
     452                 :            :  * ensures the destination page is created and not swapped out.
     453                 :            :  */
     454                 :          0 : static int copy_strings(int argc, struct user_arg_ptr argv,
     455                 :    2041155 :                         struct linux_binprm *bprm)
     456                 :            : {
     457                 :            :         struct page *kmapped_page = NULL;
     458                 :            :         char *kaddr = NULL;
     459                 :            :         unsigned long kpos = 0;
     460                 :            :         int ret;
     461                 :            : 
     462         [ +  + ]:    1001807 :         while (argc-- > 0) {
     463                 :            :                 const char __user *str;
     464                 :            :                 int len;
     465                 :            :                 unsigned long pos;
     466                 :            : 
     467                 :            :                 ret = -EFAULT;
     468                 :     919329 :                 str = get_user_arg_ptr(argv, argc);
     469            [ + ]:     919333 :                 if (IS_ERR(str))
     470                 :            :                         goto out;
     471                 :            : 
     472                 :     919335 :                 len = strnlen_user(str, MAX_ARG_STRLEN);
     473            [ + ]:     919246 :                 if (!len)
     474                 :            :                         goto out;
     475                 :            : 
     476                 :            :                 ret = -E2BIG;
     477            [ + ]:     919268 :                 if (!valid_arg_len(bprm, len))
     478                 :            :                         goto out;
     479                 :            : 
     480                 :            :                 /* We're going to work our way backwords. */
     481                 :     919294 :                 pos = bprm->p;
     482                 :     919294 :                 str += len;
     483                 :     919294 :                 bprm->p -= len;
     484                 :            : 
     485         [ +  + ]:    3797433 :                 while (len > 0) {
     486                 :            :                         int offset, bytes_to_copy;
     487                 :            : 
     488            [ + ]:    2878103 :                         if (fatal_signal_pending(current)) {
     489                 :            :                                 ret = -ERESTARTNOHAND;
     490                 :            :                                 goto out;
     491                 :            :                         }
     492                 :    2878227 :                         cond_resched();
     493                 :            : 
     494                 :    2878163 :                         offset = pos % PAGE_SIZE;
     495         [ +  + ]:    2878163 :                         if (offset == 0)
     496                 :            :                                 offset = PAGE_SIZE;
     497                 :            : 
     498                 :            :                         bytes_to_copy = offset;
     499         [ +  + ]:    2878163 :                         if (bytes_to_copy > len)
     500                 :            :                                 bytes_to_copy = len;
     501                 :            : 
     502                 :    2878163 :                         offset -= bytes_to_copy;
     503                 :    2878163 :                         pos -= bytes_to_copy;
     504                 :    2878163 :                         str -= bytes_to_copy;
     505                 :    2878163 :                         len -= bytes_to_copy;
     506                 :            : 
     507 [ +  + ][ +  + ]:    2878163 :                         if (!kmapped_page || kpos != (pos & PAGE_MASK)) {
     508                 :            :                                 struct page *page;
     509                 :            : 
     510                 :    2041175 :                                 page = get_arg_page(bprm, pos, 1);
     511            [ + ]:    2041157 :                                 if (!page) {
     512                 :            :                                         ret = -E2BIG;
     513                 :            :                                         goto out;
     514                 :            :                                 }
     515                 :            : 
     516         [ +  + ]:    2041158 :                                 if (kmapped_page) {
     517                 :    1958850 :                                         flush_kernel_dcache_page(kmapped_page);
     518                 :    1958850 :                                         kunmap(kmapped_page);
     519                 :            :                                         put_arg_page(kmapped_page);
     520                 :            :                                 }
     521                 :            :                                 kmapped_page = page;
     522                 :    2041158 :                                 kaddr = kmap(kmapped_page);
     523                 :    2041155 :                                 kpos = pos & PAGE_MASK;
     524                 :    2041155 :                                 flush_arg_page(bprm, kpos, kmapped_page);
     525                 :            :                         }
     526         [ +  + ]:    2878309 :                         if (copy_from_user(kaddr+offset, str, bytes_to_copy)) {
     527                 :            :                                 ret = -EFAULT;
     528                 :            :                                 goto out;
     529                 :            :                         }
     530                 :            :                 }
     531                 :            :         }
     532                 :            :         ret = 0;
     533                 :            : out:
     534         [ +  + ]:      82473 :         if (kmapped_page) {
     535                 :      82303 :                 flush_kernel_dcache_page(kmapped_page);
     536                 :      82304 :                 kunmap(kmapped_page);
     537                 :            :                 put_arg_page(kmapped_page);
     538                 :            :         }
     539                 :      82479 :         return ret;
     540                 :            : }
     541                 :            : 
     542                 :            : /*
     543                 :            :  * Like copy_strings, but get argv and its values from kernel memory.
     544                 :            :  */
     545                 :          0 : int copy_strings_kernel(int argc, const char *const *__argv,
     546                 :            :                         struct linux_binprm *bprm)
     547                 :            : {
     548                 :            :         int r;
     549                 :      27971 :         mm_segment_t oldfs = get_fs();
     550                 :      27971 :         struct user_arg_ptr argv = {
     551                 :            :                 .ptr.native = (const char __user *const  __user *)__argv,
     552                 :            :         };
     553                 :            : 
     554                 :            :         set_fs(KERNEL_DS);
     555                 :      27971 :         r = copy_strings(argc, argv, bprm);
     556                 :            :         set_fs(oldfs);
     557                 :            : 
     558                 :      27973 :         return r;
     559                 :            : }
     560                 :            : EXPORT_SYMBOL(copy_strings_kernel);
     561                 :            : 
     562                 :            : #ifdef CONFIG_MMU
     563                 :            : 
     564                 :            : /*
     565                 :            :  * During bprm_mm_init(), we create a temporary stack at STACK_TOP_MAX.  Once
     566                 :            :  * the binfmt code determines where the new stack should reside, we shift it to
     567                 :            :  * its final location.  The process proceeds as follows:
     568                 :            :  *
     569                 :            :  * 1) Use shift to calculate the new vma endpoints.
     570                 :            :  * 2) Extend vma to cover both the old and new ranges.  This ensures the
     571                 :            :  *    arguments passed to subsequent functions are consistent.
     572                 :            :  * 3) Move vma's page tables to the new range.
     573                 :            :  * 4) Free up any cleared pgd range.
     574                 :            :  * 5) Shrink the vma to cover only the new range.
     575                 :            :  */
     576                 :          0 : static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift)
     577                 :            : {
     578                 :      27235 :         struct mm_struct *mm = vma->vm_mm;
     579                 :      27235 :         unsigned long old_start = vma->vm_start;
     580                 :      27235 :         unsigned long old_end = vma->vm_end;
     581                 :      27235 :         unsigned long length = old_end - old_start;
     582                 :      27235 :         unsigned long new_start = old_start - shift;
     583                 :      27235 :         unsigned long new_end = old_end - shift;
     584                 :            :         struct mmu_gather tlb;
     585                 :            : 
     586         [ -  + ]:      27235 :         BUG_ON(new_start > new_end);
     587                 :            : 
     588                 :            :         /*
     589                 :            :          * ensure there are no vmas between where we want to go
     590                 :            :          * and where we are
     591                 :            :          */
     592            [ + ]:      27235 :         if (vma != find_vma(mm, new_start))
     593                 :            :                 return -EFAULT;
     594                 :            : 
     595                 :            :         /*
     596                 :            :          * cover the whole range: [new_start, old_end)
     597                 :            :          */
     598         [ +  + ]:      27240 :         if (vma_adjust(vma, new_start, old_end, vma->vm_pgoff, NULL))
     599                 :            :                 return -ENOMEM;
     600                 :            : 
     601                 :            :         /*
     602                 :            :          * move the page tables downwards, on failure we rely on
     603                 :            :          * process cleanup to remove whatever mess we made.
     604                 :            :          */
     605         [ +  + ]:      27223 :         if (length != move_page_tables(vma, old_start,
     606                 :            :                                        vma, new_start, length, false))
     607                 :            :                 return -ENOMEM;
     608                 :            : 
     609                 :      27236 :         lru_add_drain();
     610                 :            :         tlb_gather_mmu(&tlb, mm, old_start, old_end);
     611         [ +  + ]:      27238 :         if (new_end > old_start) {
     612                 :            :                 /*
     613                 :            :                  * when the old and new regions overlap clear from new_end.
     614                 :            :                  */
     615         [ -  + ]:        249 :                 free_pgd_range(&tlb, new_end, old_end, new_end,
     616                 :        249 :                         vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING);
     617                 :            :         } else {
     618                 :            :                 /*
     619                 :            :                  * otherwise, clean from old_start; this is done to not touch
     620                 :            :                  * the address space in [new_end, old_start) some architectures
     621                 :            :                  * have constraints on va-space that make this illegal (IA64) -
     622                 :            :                  * for the others its just a little faster.
     623                 :            :                  */
     624         [ -  + ]:      26989 :                 free_pgd_range(&tlb, old_start, old_end, new_end,
     625                 :      26989 :                         vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING);
     626                 :            :         }
     627                 :            :         tlb_finish_mmu(&tlb, old_start, old_end);
     628                 :            : 
     629                 :            :         /*
     630                 :            :          * Shrink the vma to just the new range.  Always succeeds.
     631                 :            :          */
     632                 :      27240 :         vma_adjust(vma, new_start, new_end, vma->vm_pgoff, NULL);
     633                 :            : 
     634                 :      27240 :         return 0;
     635                 :            : }
     636                 :            : 
     637                 :            : /*
     638                 :            :  * Finalizes the stack vm_area_struct. The flags and permissions are updated,
     639                 :            :  * the stack is optionally relocated, and some extra space is added.
     640                 :            :  */
     641                 :          0 : int setup_arg_pages(struct linux_binprm *bprm,
     642                 :            :                     unsigned long stack_top,
     643                 :            :                     int executable_stack)
     644                 :            : {
     645                 :            :         unsigned long ret;
     646                 :            :         unsigned long stack_shift;
     647                 :      27241 :         struct mm_struct *mm = current->mm;
     648                 :      27241 :         struct vm_area_struct *vma = bprm->vma;
     649                 :      27241 :         struct vm_area_struct *prev = NULL;
     650                 :            :         unsigned long vm_flags;
     651                 :            :         unsigned long stack_base;
     652                 :            :         unsigned long stack_size;
     653                 :            :         unsigned long stack_expand;
     654                 :            :         unsigned long rlim_stack;
     655                 :            : 
     656                 :            : #ifdef CONFIG_STACK_GROWSUP
     657                 :            :         /* Limit stack size to 1GB */
     658                 :            :         stack_base = rlimit_max(RLIMIT_STACK);
     659                 :            :         if (stack_base > (1 << 30))
     660                 :            :                 stack_base = 1 << 30;
     661                 :            : 
     662                 :            :         /* Make sure we didn't let the argument array grow too large. */
     663                 :            :         if (vma->vm_end - vma->vm_start > stack_base)
     664                 :            :                 return -ENOMEM;
     665                 :            : 
     666                 :            :         stack_base = PAGE_ALIGN(stack_top - stack_base);
     667                 :            : 
     668                 :            :         stack_shift = vma->vm_start - stack_base;
     669                 :            :         mm->arg_start = bprm->p - stack_shift;
     670                 :            :         bprm->p = vma->vm_end - stack_shift;
     671                 :            : #else
     672                 :            :         stack_top = arch_align_stack(stack_top);
     673                 :      27241 :         stack_top = PAGE_ALIGN(stack_top);
     674                 :            : 
     675       [ + ][ + ]:      27241 :         if (unlikely(stack_top < mmap_min_addr) ||
     676                 :      27242 :             unlikely(vma->vm_end - vma->vm_start >= stack_top - mmap_min_addr))
     677                 :            :                 return -ENOMEM;
     678                 :            : 
     679                 :      27244 :         stack_shift = vma->vm_end - stack_top;
     680                 :            : 
     681                 :      27244 :         bprm->p -= stack_shift;
     682                 :      27244 :         mm->arg_start = bprm->p;
     683                 :            : #endif
     684                 :            : 
     685         [ -  + ]:      27244 :         if (bprm->loader)
     686                 :          0 :                 bprm->loader -= stack_shift;
     687                 :      27244 :         bprm->exec -= stack_shift;
     688                 :            : 
     689                 :      27244 :         down_write(&mm->mmap_sem);
     690         [ +  + ]:      27244 :         vm_flags = VM_STACK_FLAGS;
     691                 :            : 
     692                 :            :         /*
     693                 :            :          * Adjust stack execute permissions; explicitly enable for
     694                 :            :          * EXSTACK_ENABLE_X, disable for EXSTACK_DISABLE_X and leave alone
     695                 :            :          * (arch default) otherwise.
     696                 :            :          */
     697         [ +  + ]:      27244 :         if (unlikely(executable_stack == EXSTACK_ENABLE_X))
     698                 :            :                 vm_flags |= VM_EXEC;
     699         [ +  + ]:      27242 :         else if (executable_stack == EXSTACK_DISABLE_X)
     700                 :            :                 vm_flags &= ~VM_EXEC;
     701                 :      27244 :         vm_flags |= mm->def_flags;
     702                 :      27244 :         vm_flags |= VM_STACK_INCOMPLETE_SETUP;
     703                 :            : 
     704                 :      27244 :         ret = mprotect_fixup(vma, &prev, vma->vm_start, vma->vm_end,
     705                 :            :                         vm_flags);
     706            [ + ]:      27237 :         if (ret)
     707                 :            :                 goto out_unlock;
     708         [ -  + ]:      27241 :         BUG_ON(prev != vma);
     709                 :            : 
     710                 :            :         /* Move stack pages down in memory. */
     711         [ +  + ]:      27241 :         if (stack_shift) {
     712                 :      27235 :                 ret = shift_arg_pages(vma, stack_shift);
     713         [ +  - ]:      27240 :                 if (ret)
     714                 :            :                         goto out_unlock;
     715                 :            :         }
     716                 :            : 
     717                 :            :         /* mprotect_fixup is overkill to remove the temporary stack flags */
     718                 :      27246 :         vma->vm_flags &= ~VM_STACK_INCOMPLETE_SETUP;
     719                 :            : 
     720                 :            :         stack_expand = 131072UL; /* randomly 32*4k (or 2*64k) pages */
     721                 :      27246 :         stack_size = vma->vm_end - vma->vm_start;
     722                 :            :         /*
     723                 :            :          * Align this down to a page boundary as expand_stack
     724                 :            :          * will align it up.
     725                 :            :          */
     726                 :      27246 :         rlim_stack = rlimit(RLIMIT_STACK) & PAGE_MASK;
     727                 :            : #ifdef CONFIG_STACK_GROWSUP
     728                 :            :         if (stack_size + stack_expand > rlim_stack)
     729                 :            :                 stack_base = vma->vm_start + rlim_stack;
     730                 :            :         else
     731                 :            :                 stack_base = vma->vm_end + stack_expand;
     732                 :            : #else
     733         [ -  + ]:      27246 :         if (stack_size + stack_expand > rlim_stack)
     734                 :          0 :                 stack_base = vma->vm_end - rlim_stack;
     735                 :            :         else
     736                 :      27246 :                 stack_base = vma->vm_start - stack_expand;
     737                 :            : #endif
     738                 :      27246 :         current->mm->start_stack = bprm->p;
     739                 :      27246 :         ret = expand_stack(vma, stack_base);
     740         [ -  + ]:      27246 :         if (ret)
     741                 :            :                 ret = -EFAULT;
     742                 :            : 
     743                 :            : out_unlock:
     744                 :      27242 :         up_write(&mm->mmap_sem);
     745                 :      27246 :         return ret;
     746                 :            : }
     747                 :            : EXPORT_SYMBOL(setup_arg_pages);
     748                 :            : 
     749                 :            : #endif /* CONFIG_MMU */
     750                 :            : 
     751                 :          0 : static struct file *do_open_exec(struct filename *name)
     752                 :            : {
     753                 :      54853 :         struct file *file;
     754                 :            :         int err;
     755                 :            :         static const struct open_flags open_exec_flags = {
     756                 :            :                 .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC,
     757                 :            :                 .acc_mode = MAY_EXEC | MAY_OPEN,
     758                 :            :                 .intent = LOOKUP_OPEN,
     759                 :            :                 .lookup_flags = LOOKUP_FOLLOW,
     760                 :            :         };
     761                 :            : 
     762                 :      78282 :         file = do_filp_open(AT_FDCWD, name, &open_exec_flags);
     763         [ +  + ]:      78283 :         if (IS_ERR(file))
     764                 :            :                 goto out;
     765                 :            : 
     766                 :            :         err = -EACCES;
     767         [ +  + ]:      54853 :         if (!S_ISREG(file_inode(file)->i_mode))
     768                 :            :                 goto exit;
     769                 :            : 
     770         [ +  - ]:      54850 :         if (file->f_path.mnt->mnt_flags & MNT_NOEXEC)
     771                 :            :                 goto exit;
     772                 :            : 
     773                 :            :         fsnotify_open(file);
     774                 :            : 
     775                 :            :         err = deny_write_access(file);
     776            [ + ]:      54851 :         if (err)
     777                 :            :                 goto exit;
     778                 :            : 
     779                 :            : out:
     780                 :      78280 :         return file;
     781                 :            : 
     782                 :            : exit:
     783                 :          0 :         fput(file);
     784                 :          2 :         return ERR_PTR(err);
     785                 :            : }
     786                 :            : 
     787                 :          0 : struct file *open_exec(const char *name)
     788                 :            : {
     789                 :      27597 :         struct filename tmp = { .name = name };
     790                 :      27597 :         return do_open_exec(&tmp);
     791                 :            : }
     792                 :            : EXPORT_SYMBOL(open_exec);
     793                 :            : 
     794                 :          0 : int kernel_read(struct file *file, loff_t offset,
     795                 :            :                 char *addr, unsigned long count)
     796                 :            : {
     797                 :            :         mm_segment_t old_fs;
     798                 :     136565 :         loff_t pos = offset;
     799                 :            :         int result;
     800                 :            : 
     801                 :     136565 :         old_fs = get_fs();
     802                 :            :         set_fs(get_ds());
     803                 :            :         /* The cast to a user pointer is valid due to the set_fs() */
     804                 :     136565 :         result = vfs_read(file, (void __user *)addr, count, &pos);
     805                 :            :         set_fs(old_fs);
     806                 :     136576 :         return result;
     807                 :            : }
     808                 :            : 
     809                 :            : EXPORT_SYMBOL(kernel_read);
     810                 :            : 
     811                 :          0 : ssize_t read_code(struct file *file, unsigned long addr, loff_t pos, size_t len)
     812                 :            : {
     813                 :          0 :         ssize_t res = file->f_op->read(file, (void __user *)addr, len, &pos);
     814         [ #  # ]:          0 :         if (res > 0)
     815                 :          0 :                 flush_icache_range(addr, addr + len);
     816                 :          0 :         return res;
     817                 :            : }
     818                 :            : EXPORT_SYMBOL(read_code);
     819                 :            : 
     820                 :          0 : static int exec_mmap(struct mm_struct *mm)
     821                 :            : {
     822                 :            :         struct task_struct *tsk;
     823                 :            :         struct mm_struct * old_mm, *active_mm;
     824                 :            : 
     825                 :            :         /* Notify parent that we're no longer interested in the old VM */
     826                 :      27242 :         tsk = current;
     827                 :      27242 :         old_mm = current->mm;
     828                 :      27242 :         mm_release(tsk, old_mm);
     829                 :            : 
     830         [ +  + ]:      27228 :         if (old_mm) {
     831                 :      27205 :                 sync_mm_rss(old_mm);
     832                 :            :                 /*
     833                 :            :                  * Make sure that if there is a core dump in progress
     834                 :            :                  * for the old mm, we get out and die instead of going
     835                 :            :                  * through with the exec.  We must hold mmap_sem around
     836                 :            :                  * checking core_state and changing tsk->mm.
     837                 :            :                  */
     838                 :      27219 :                 down_read(&old_mm->mmap_sem);
     839         [ -  + ]:      27220 :                 if (unlikely(old_mm->core_state)) {
     840                 :          0 :                         up_read(&old_mm->mmap_sem);
     841                 :          0 :                         return -EINTR;
     842                 :            :                 }
     843                 :            :         }
     844                 :            :         task_lock(tsk);
     845                 :      27246 :         active_mm = tsk->active_mm;
     846                 :      27246 :         tsk->mm = mm;
     847                 :      27246 :         tsk->active_mm = mm;
     848                 :            :         activate_mm(active_mm, mm);
     849                 :            :         task_unlock(tsk);
     850         [ +  + ]:      27246 :         if (old_mm) {
     851                 :      27221 :                 up_read(&old_mm->mmap_sem);
     852         [ -  + ]:      27221 :                 BUG_ON(active_mm != old_mm);
     853                 :      27221 :                 setmax_mm_hiwater_rss(&tsk->signal->maxrss, old_mm);
     854                 :            :                 mm_update_next_owner(old_mm);
     855                 :      27221 :                 mmput(old_mm);
     856                 :      27221 :                 return 0;
     857                 :            :         }
     858                 :            :         mmdrop(active_mm);
     859                 :            :         return 0;
     860                 :            : }
     861                 :            : 
     862                 :            : /*
     863                 :            :  * This function makes sure the current process has its own signal table,
     864                 :            :  * so that flush_signal_handlers can later reset the handlers without
     865                 :            :  * disturbing other processes.  (Other processes might share the signal
     866                 :            :  * table via the CLONE_SIGHAND option to clone().)
     867                 :            :  */
     868                 :          0 : static int de_thread(struct task_struct *tsk)
     869                 :            : {
     870                 :      27243 :         struct signal_struct *sig = tsk->signal;
     871                 :      27243 :         struct sighand_struct *oldsighand = tsk->sighand;
     872                 :            :         spinlock_t *lock = &oldsighand->siglock;
     873                 :            : 
     874         [ -  + ]:      27243 :         if (thread_group_empty(tsk))
     875                 :            :                 goto no_thread_group;
     876                 :            : 
     877                 :            :         /*
     878                 :            :          * Kill all other threads in the thread group.
     879                 :            :          */
     880                 :            :         spin_lock_irq(lock);
     881         [ #  # ]:          0 :         if (signal_group_exit(sig)) {
     882                 :            :                 /*
     883                 :            :                  * Another group action in progress, just
     884                 :            :                  * return so that the signal is processed.
     885                 :            :                  */
     886                 :            :                 spin_unlock_irq(lock);
     887                 :          0 :                 return -EAGAIN;
     888                 :            :         }
     889                 :            : 
     890                 :          0 :         sig->group_exit_task = tsk;
     891                 :          0 :         sig->notify_count = zap_other_threads(tsk);
     892         [ #  # ]:          0 :         if (!thread_group_leader(tsk))
     893                 :          0 :                 sig->notify_count--;
     894                 :            : 
     895         [ #  # ]:          0 :         while (sig->notify_count) {
     896                 :          0 :                 __set_current_state(TASK_KILLABLE);
     897                 :            :                 spin_unlock_irq(lock);
     898                 :          0 :                 schedule();
     899         [ #  # ]:          0 :                 if (unlikely(__fatal_signal_pending(tsk)))
     900                 :            :                         goto killed;
     901                 :            :                 spin_lock_irq(lock);
     902                 :            :         }
     903                 :            :         spin_unlock_irq(lock);
     904                 :            : 
     905                 :            :         /*
     906                 :            :          * At this point all other threads have exited, all we have to
     907                 :            :          * do is to wait for the thread group leader to become inactive,
     908                 :            :          * and to assume its PID:
     909                 :            :          */
     910         [ #  # ]:          0 :         if (!thread_group_leader(tsk)) {
     911                 :          0 :                 struct task_struct *leader = tsk->group_leader;
     912                 :            : 
     913                 :          0 :                 sig->notify_count = -1;      /* for exit_notify() */
     914                 :            :                 for (;;) {
     915                 :            :                         threadgroup_change_begin(tsk);
     916                 :          0 :                         write_lock_irq(&tasklist_lock);
     917         [ #  # ]:      27243 :                         if (likely(leader->exit_state))
     918                 :            :                                 break;
     919                 :          0 :                         __set_current_state(TASK_KILLABLE);
     920                 :            :                         write_unlock_irq(&tasklist_lock);
     921                 :            :                         threadgroup_change_end(tsk);
     922                 :          0 :                         schedule();
     923         [ #  # ]:          0 :                         if (unlikely(__fatal_signal_pending(tsk)))
     924                 :            :                                 goto killed;
     925                 :            :                 }
     926                 :            : 
     927                 :            :                 /*
     928                 :            :                  * The only record we have of the real-time age of a
     929                 :            :                  * process, regardless of execs it's done, is start_time.
     930                 :            :                  * All the past CPU time is accumulated in signal_struct
     931                 :            :                  * from sister threads now dead.  But in this non-leader
     932                 :            :                  * exec, nothing survives from the original leader thread,
     933                 :            :                  * whose birth marks the true age of this process now.
     934                 :            :                  * When we take on its identity by switching to its PID, we
     935                 :            :                  * also take its birthdate (always earlier than our own).
     936                 :            :                  */
     937                 :          0 :                 tsk->start_time = leader->start_time;
     938                 :          0 :                 tsk->real_start_time = leader->real_start_time;
     939                 :            : 
     940         [ #  # ]:          0 :                 BUG_ON(!same_thread_group(leader, tsk));
     941         [ #  # ]:          0 :                 BUG_ON(has_group_leader_pid(tsk));
     942                 :            :                 /*
     943                 :            :                  * An exec() starts a new thread group with the
     944                 :            :                  * TGID of the previous thread group. Rehash the
     945                 :            :                  * two threads with a switched PID, and release
     946                 :            :                  * the former thread group leader:
     947                 :            :                  */
     948                 :            : 
     949                 :            :                 /* Become a process group leader with the old leader's pid.
     950                 :            :                  * The old leader becomes a thread of the this thread group.
     951                 :            :                  * Note: The old leader also uses this pid until release_task
     952                 :            :                  *       is called.  Odd but simple and correct.
     953                 :            :                  */
     954                 :          0 :                 tsk->pid = leader->pid;
     955                 :          0 :                 change_pid(tsk, PIDTYPE_PID, task_pid(leader));
     956                 :          0 :                 transfer_pid(leader, tsk, PIDTYPE_PGID);
     957                 :          0 :                 transfer_pid(leader, tsk, PIDTYPE_SID);
     958                 :            : 
     959                 :          0 :                 list_replace_rcu(&leader->tasks, &tsk->tasks);
     960                 :          0 :                 list_replace_init(&leader->sibling, &tsk->sibling);
     961                 :            : 
     962                 :          0 :                 tsk->group_leader = tsk;
     963                 :          0 :                 leader->group_leader = tsk;
     964                 :            : 
     965                 :          0 :                 tsk->exit_signal = SIGCHLD;
     966                 :          0 :                 leader->exit_signal = -1;
     967                 :            : 
     968         [ #  # ]:          0 :                 BUG_ON(leader->exit_state != EXIT_ZOMBIE);
     969                 :          0 :                 leader->exit_state = EXIT_DEAD;
     970                 :            : 
     971                 :            :                 /*
     972                 :            :                  * We are going to release_task()->ptrace_unlink() silently,
     973                 :            :                  * the tracer can sleep in do_wait(). EXIT_DEAD guarantees
     974                 :            :                  * the tracer wont't block again waiting for this thread.
     975                 :            :                  */
     976         [ #  # ]:          0 :                 if (unlikely(leader->ptrace))
     977                 :          0 :                         __wake_up_parent(leader, leader->parent);
     978                 :            :                 write_unlock_irq(&tasklist_lock);
     979                 :            :                 threadgroup_change_end(tsk);
     980                 :            : 
     981                 :          0 :                 release_task(leader);
     982                 :            :         }
     983                 :            : 
     984                 :          0 :         sig->group_exit_task = NULL;
     985                 :          0 :         sig->notify_count = 0;
     986                 :            : 
     987                 :            : no_thread_group:
     988                 :            :         /* we have changed execution domain */
     989                 :      27243 :         tsk->exit_signal = SIGCHLD;
     990                 :            : 
     991                 :      27243 :         exit_itimers(sig);
     992                 :      27243 :         flush_itimer_signals();
     993                 :            : 
     994         [ -  + ]:      27244 :         if (atomic_read(&oldsighand->count) != 1) {
     995                 :            :                 struct sighand_struct *newsighand;
     996                 :            :                 /*
     997                 :            :                  * This ->sighand is shared with the CLONE_SIGHAND
     998                 :            :                  * but not CLONE_THREAD task, switch to the new one.
     999                 :            :                  */
    1000                 :          0 :                 newsighand = kmem_cache_alloc(sighand_cachep, GFP_KERNEL);
    1001         [ #  # ]:          0 :                 if (!newsighand)
    1002                 :            :                         return -ENOMEM;
    1003                 :            : 
    1004                 :          0 :                 atomic_set(&newsighand->count, 1);
    1005                 :          0 :                 memcpy(newsighand->action, oldsighand->action,
    1006                 :            :                        sizeof(newsighand->action));
    1007                 :            : 
    1008                 :          0 :                 write_lock_irq(&tasklist_lock);
    1009                 :            :                 spin_lock(&oldsighand->siglock);
    1010                 :          0 :                 rcu_assign_pointer(tsk->sighand, newsighand);
    1011                 :            :                 spin_unlock(&oldsighand->siglock);
    1012                 :            :                 write_unlock_irq(&tasklist_lock);
    1013                 :            : 
    1014                 :          0 :                 __cleanup_sighand(oldsighand);
    1015                 :            :         }
    1016                 :            : 
    1017         [ -  + ]:      27241 :         BUG_ON(!thread_group_leader(tsk));
    1018                 :            :         return 0;
    1019                 :            : 
    1020                 :            : killed:
    1021                 :            :         /* protects against exit_notify() and __exit_signal() */
    1022                 :          0 :         read_lock(&tasklist_lock);
    1023                 :          0 :         sig->group_exit_task = NULL;
    1024                 :          0 :         sig->notify_count = 0;
    1025                 :            :         read_unlock(&tasklist_lock);
    1026                 :          0 :         return -EAGAIN;
    1027                 :            : }
    1028                 :            : 
    1029                 :          0 : char *get_task_comm(char *buf, struct task_struct *tsk)
    1030                 :            : {
    1031                 :            :         /* buf must be at least sizeof(tsk->comm) in size */
    1032                 :            :         task_lock(tsk);
    1033                 :      49382 :         strncpy(buf, tsk->comm, sizeof(tsk->comm));
    1034                 :            :         task_unlock(tsk);
    1035                 :      49382 :         return buf;
    1036                 :            : }
    1037                 :            : EXPORT_SYMBOL_GPL(get_task_comm);
    1038                 :            : 
    1039                 :            : /*
    1040                 :            :  * These functions flushes out all traces of the currently running executable
    1041                 :            :  * so that a new one can be started
    1042                 :            :  */
    1043                 :            : 
    1044                 :          0 : void set_task_comm(struct task_struct *tsk, char *buf)
    1045                 :            : {
    1046                 :            :         task_lock(tsk);
    1047                 :            :         trace_task_rename(tsk, buf);
    1048                 :      27266 :         strlcpy(tsk->comm, buf, sizeof(tsk->comm));
    1049                 :            :         task_unlock(tsk);
    1050                 :      27276 :         perf_event_comm(tsk);
    1051                 :      27275 : }
    1052                 :            : 
    1053                 :            : static void filename_to_taskname(char *tcomm, const char *fn, unsigned int len)
    1054                 :            : {
    1055                 :            :         int i, ch;
    1056                 :            : 
    1057                 :            :         /* Copies the binary name from after last slash */
    1058         [ +  + ]:     353721 :         for (i = 0; (ch = *(fn++)) != '\0';) {
    1059         [ +  + ]:     326479 :                 if (ch == '/')
    1060                 :            :                         i = 0; /* overwrite what we wrote */
    1061                 :            :                 else
    1062         [ +  + ]:     261505 :                         if (i < len - 1)
    1063                 :     326479 :                                 tcomm[i++] = ch;
    1064                 :            :         }
    1065                 :      27242 :         tcomm[i] = '\0';
    1066                 :            : }
    1067                 :            : 
    1068                 :          0 : int flush_old_exec(struct linux_binprm * bprm)
    1069                 :            : {
    1070                 :            :         int retval;
    1071                 :            : 
    1072                 :            :         /*
    1073                 :            :          * Make sure we have a private signal table and that
    1074                 :            :          * we are unassociated from the previous thread group.
    1075                 :            :          */
    1076                 :      27240 :         retval = de_thread(current);
    1077         [ +  - ]:      27231 :         if (retval)
    1078                 :            :                 goto out;
    1079                 :            : 
    1080                 :      27231 :         set_mm_exe_file(bprm->mm, bprm->file);
    1081                 :            : 
    1082                 :      54482 :         filename_to_taskname(bprm->tcomm, bprm->filename, sizeof(bprm->tcomm));
    1083                 :            :         /*
    1084                 :            :          * Release all of the old mmap stuff
    1085                 :            :          */
    1086                 :      27242 :         acct_arg_size(bprm, 0);
    1087                 :      27228 :         retval = exec_mmap(bprm->mm);
    1088         [ +  - ]:      27246 :         if (retval)
    1089                 :            :                 goto out;
    1090                 :            : 
    1091                 :      27246 :         bprm->mm = NULL;             /* We're using it now */
    1092                 :            : 
    1093                 :            :         set_fs(USER_DS);
    1094                 :      27246 :         current->flags &= ~(PF_RANDOMIZE | PF_FORKNOEXEC | PF_KTHREAD |
    1095                 :            :                                         PF_NOFREEZE | PF_NO_SETAFFINITY);
    1096                 :      27246 :         flush_thread();
    1097                 :      27246 :         current->personality &= ~bprm->per_clear;
    1098                 :            : 
    1099                 :      27246 :         return 0;
    1100                 :            : 
    1101                 :            : out:
    1102                 :          0 :         return retval;
    1103                 :            : }
    1104                 :            : EXPORT_SYMBOL(flush_old_exec);
    1105                 :            : 
    1106                 :          0 : void would_dump(struct linux_binprm *bprm, struct file *file)
    1107                 :            : {
    1108         [ -  + ]:      54488 :         if (inode_permission(file_inode(file), MAY_READ) < 0)
    1109                 :          0 :                 bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP;
    1110                 :          0 : }
    1111                 :            : EXPORT_SYMBOL(would_dump);
    1112                 :            : 
    1113                 :          0 : void setup_new_exec(struct linux_binprm * bprm)
    1114                 :            : {
    1115                 :      27241 :         arch_pick_mmap_layout(current->mm);
    1116                 :            : 
    1117                 :            :         /* This is the point of no return */
    1118                 :      27241 :         current->sas_ss_sp = current->sas_ss_size = 0;
    1119                 :            : 
    1120    [ + ][ +  + ]:      27241 :         if (uid_eq(current_euid(), current_uid()) && gid_eq(current_egid(), current_gid()))
    1121                 :      27239 :                 set_dumpable(current->mm, SUID_DUMP_USER);
    1122                 :            :         else
    1123                 :          2 :                 set_dumpable(current->mm, suid_dumpable);
    1124                 :            : 
    1125                 :      27243 :         set_task_comm(current, bprm->tcomm);
    1126                 :            : 
    1127                 :            :         /* Set the new mm task size. We have to do that late because it may
    1128                 :            :          * depend on TIF_32BIT which is only updated in flush_thread() on
    1129                 :            :          * some architectures like powerpc
    1130                 :            :          */
    1131                 :      27243 :         current->mm->task_size = TASK_SIZE;
    1132                 :            : 
    1133                 :            :         /* install the new credentials */
    1134    [ + ][ +  + ]:      27243 :         if (!uid_eq(bprm->cred->uid, current_euid()) ||
    1135                 :            :             !gid_eq(bprm->cred->gid, current_egid())) {
    1136                 :          0 :                 current->pdeath_signal = 0;
    1137                 :            :         } else {
    1138                 :      27243 :                 would_dump(bprm, bprm->file);
    1139         [ -  + ]:      27245 :                 if (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP)
    1140                 :          0 :                         set_dumpable(current->mm, suid_dumpable);
    1141                 :            :         }
    1142                 :            : 
    1143                 :            :         /* An exec changes our domain. We are no longer part of the thread
    1144                 :            :            group */
    1145                 :      27245 :         current->self_exec_id++;
    1146                 :      27245 :         flush_signal_handlers(current, 0);
    1147                 :      27246 :         do_close_on_exec(current->files);
    1148                 :      27246 : }
    1149                 :            : EXPORT_SYMBOL(setup_new_exec);
    1150                 :            : 
    1151                 :            : /*
    1152                 :            :  * Prepare credentials and lock ->cred_guard_mutex.
    1153                 :            :  * install_exec_creds() commits the new creds and drops the lock.
    1154                 :            :  * Or, if exec fails before, free_bprm() should release ->cred and
    1155                 :            :  * and unlock.
    1156                 :            :  */
    1157                 :          0 : int prepare_bprm_creds(struct linux_binprm *bprm)
    1158                 :            : {
    1159         [ +  - ]:      50685 :         if (mutex_lock_interruptible(&current->signal->cred_guard_mutex))
    1160                 :            :                 return -ERESTARTNOINTR;
    1161                 :            : 
    1162                 :      50685 :         bprm->cred = prepare_exec_creds();
    1163         [ -  + ]:      50684 :         if (likely(bprm->cred))
    1164                 :            :                 return 0;
    1165                 :            : 
    1166                 :          0 :         mutex_unlock(&current->signal->cred_guard_mutex);
    1167                 :          0 :         return -ENOMEM;
    1168                 :            : }
    1169                 :            : 
    1170                 :          0 : static void free_bprm(struct linux_binprm *bprm)
    1171                 :            : {
    1172                 :            :         free_arg_pages(bprm);
    1173         [ +  + ]:      50685 :         if (bprm->cred) {
    1174                 :      23439 :                 mutex_unlock(&current->signal->cred_guard_mutex);
    1175                 :      23439 :                 abort_creds(bprm->cred);
    1176                 :            :         }
    1177         [ +  + ]:     101369 :         if (bprm->file) {
    1178                 :            :                 allow_write_access(bprm->file);
    1179                 :      27252 :                 fput(bprm->file);
    1180                 :            :         }
    1181                 :            :         /* If a binfmt changed the interp, free it. */
    1182         [ +  + ]:      50685 :         if (bprm->interp != bprm->filename)
    1183                 :        354 :                 kfree(bprm->interp);
    1184                 :      50685 :         kfree(bprm);
    1185                 :      50685 : }
    1186                 :            : 
    1187                 :          0 : int bprm_change_interp(char *interp, struct linux_binprm *bprm)
    1188                 :            : {
    1189                 :            :         /* If a binfmt changed the interp, free it first. */
    1190         [ -  + ]:        354 :         if (bprm->interp != bprm->filename)
    1191                 :          0 :                 kfree(bprm->interp);
    1192                 :        354 :         bprm->interp = kstrdup(interp, GFP_KERNEL);
    1193         [ +  - ]:        354 :         if (!bprm->interp)
    1194                 :            :                 return -ENOMEM;
    1195                 :        354 :         return 0;
    1196                 :            : }
    1197                 :            : EXPORT_SYMBOL(bprm_change_interp);
    1198                 :            : 
    1199                 :            : /*
    1200                 :            :  * install the new credentials for this executable
    1201                 :            :  */
    1202                 :          0 : void install_exec_creds(struct linux_binprm *bprm)
    1203                 :            : {
    1204                 :      27246 :         security_bprm_committing_creds(bprm);
    1205                 :            : 
    1206                 :      27246 :         commit_creds(bprm->cred);
    1207                 :      27246 :         bprm->cred = NULL;
    1208                 :            : 
    1209                 :            :         /*
    1210                 :            :          * Disable monitoring for regular users
    1211                 :            :          * when executing setuid binaries. Must
    1212                 :            :          * wait until new credentials are committed
    1213                 :            :          * by commit_creds() above
    1214                 :            :          */
    1215         [ +  + ]:      27246 :         if (get_dumpable(current->mm) != SUID_DUMP_USER)
    1216                 :         24 :                 perf_event_exit_task(current);
    1217                 :            :         /*
    1218                 :            :          * cred_guard_mutex must be held at least to this point to prevent
    1219                 :            :          * ptrace_attach() from altering our determination of the task's
    1220                 :            :          * credentials; any time after this it may be unlocked.
    1221                 :            :          */
    1222                 :      27246 :         security_bprm_committed_creds(bprm);
    1223                 :      27245 :         mutex_unlock(&current->signal->cred_guard_mutex);
    1224                 :      27246 : }
    1225                 :            : EXPORT_SYMBOL(install_exec_creds);
    1226                 :            : 
    1227                 :            : /*
    1228                 :            :  * determine how safe it is to execute the proposed program
    1229                 :            :  * - the caller must hold ->cred_guard_mutex to protect against
    1230                 :            :  *   PTRACE_ATTACH
    1231                 :            :  */
    1232                 :      50685 : static void check_unsafe_exec(struct linux_binprm *bprm)
    1233                 :            : {
    1234                 :      50685 :         struct task_struct *p = current, *t;
    1235                 :            :         unsigned n_fs;
    1236                 :            : 
    1237         [ +  + ]:      50685 :         if (p->ptrace) {
    1238         [ -  + ]:        159 :                 if (p->ptrace & PT_PTRACE_CAP)
    1239                 :          0 :                         bprm->unsafe |= LSM_UNSAFE_PTRACE_CAP;
    1240                 :            :                 else
    1241                 :        159 :                         bprm->unsafe |= LSM_UNSAFE_PTRACE;
    1242                 :            :         }
    1243                 :            : 
    1244                 :            :         /*
    1245                 :            :          * This isn't strictly necessary, but it makes it harder for LSMs to
    1246                 :            :          * mess up.
    1247                 :            :          */
    1248         [ -  + ]:      50685 :         if (current->no_new_privs)
    1249                 :          0 :                 bprm->unsafe |= LSM_UNSAFE_NO_NEW_PRIVS;
    1250                 :            : 
    1251                 :            :         t = p;
    1252                 :            :         n_fs = 1;
    1253                 :          0 :         spin_lock(&p->fs->lock);
    1254                 :            :         rcu_read_lock();
    1255         [ -  + ]:      50685 :         while_each_thread(p, t) {
    1256         [ #  # ]:          0 :                 if (t->fs == p->fs)
    1257                 :          0 :                         n_fs++;
    1258                 :            :         }
    1259                 :            :         rcu_read_unlock();
    1260                 :            : 
    1261         [ -  + ]:      50685 :         if (p->fs->users > n_fs)
    1262                 :          0 :                 bprm->unsafe |= LSM_UNSAFE_SHARE;
    1263                 :            :         else
    1264                 :      50685 :                 p->fs->in_exec = 1;
    1265                 :      50685 :         spin_unlock(&p->fs->lock);
    1266                 :      50685 : }
    1267                 :            : 
    1268                 :            : /*
    1269                 :            :  * Fill the binprm structure from the inode.
    1270                 :            :  * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
    1271                 :            :  *
    1272                 :            :  * This may be called multiple times for binary chains (scripts for example).
    1273                 :            :  */
    1274                 :          0 : int prepare_binprm(struct linux_binprm *bprm)
    1275                 :            : {
    1276                 :      27605 :         struct inode *inode = file_inode(bprm->file);
    1277                 :      27605 :         umode_t mode = inode->i_mode;
    1278                 :            :         int retval;
    1279                 :            : 
    1280                 :            : 
    1281                 :            :         /* clear any previous set[ug]id data from a previous binary */
    1282                 :      55210 :         bprm->cred->euid = current_euid();
    1283                 :      27605 :         bprm->cred->egid = current_egid();
    1284                 :            : 
    1285    [ +  + ][ + ]:      27605 :         if (!(bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) &&
    1286                 :      27603 :             !current->no_new_privs &&
    1287                 :            :             kuid_has_mapping(bprm->cred->user_ns, inode->i_uid) &&
    1288                 :            :             kgid_has_mapping(bprm->cred->user_ns, inode->i_gid)) {
    1289                 :            :                 /* Set-uid? */
    1290         [ +  + ]:      27604 :                 if (mode & S_ISUID) {
    1291                 :       6800 :                         bprm->per_clear |= PER_CLEAR_ON_SETID;
    1292                 :       6800 :                         bprm->cred->euid = inode->i_uid;
    1293                 :            :                 }
    1294                 :            : 
    1295                 :            :                 /* Set-gid? */
    1296                 :            :                 /*
    1297                 :            :                  * If setgid is set but no group execute bit then this
    1298                 :            :                  * is a candidate for mandatory locking, not a setgid
    1299                 :            :                  * executable.
    1300                 :            :                  */
    1301         [ +  + ]:      27604 :                 if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
    1302                 :         24 :                         bprm->per_clear |= PER_CLEAR_ON_SETID;
    1303                 :         24 :                         bprm->cred->egid = inode->i_gid;
    1304                 :            :                 }
    1305                 :            :         }
    1306                 :            : 
    1307                 :            :         /* fill in binprm security blob */
    1308                 :      27605 :         retval = security_bprm_set_creds(bprm);
    1309         [ +  + ]:      27606 :         if (retval)
    1310                 :            :                 return retval;
    1311                 :      27603 :         bprm->cred_prepared = 1;
    1312                 :            : 
    1313                 :      27603 :         memset(bprm->buf, 0, BINPRM_BUF_SIZE);
    1314                 :      27602 :         return kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE);
    1315                 :            : }
    1316                 :            : 
    1317                 :            : EXPORT_SYMBOL(prepare_binprm);
    1318                 :            : 
    1319                 :            : /*
    1320                 :            :  * Arguments are '\0' separated strings found at the location bprm->p
    1321                 :            :  * points to; chop off the first by relocating brpm->p to right after
    1322                 :            :  * the first '\0' encountered.
    1323                 :            :  */
    1324                 :          0 : int remove_arg_zero(struct linux_binprm *bprm)
    1325                 :            : {
    1326                 :            :         int ret = 0;
    1327                 :            :         unsigned long offset;
    1328                 :            :         char *kaddr;
    1329                 :            :         struct page *page;
    1330                 :            : 
    1331         [ +  - ]:        354 :         if (!bprm->argc)
    1332                 :            :                 return 0;
    1333                 :            : 
    1334                 :            :         do {
    1335                 :        354 :                 offset = bprm->p & ~PAGE_MASK;
    1336                 :        354 :                 page = get_arg_page(bprm, bprm->p, 0);
    1337         [ +  - ]:        354 :                 if (!page) {
    1338                 :            :                         ret = -EFAULT;
    1339                 :            :                         goto out;
    1340                 :            :                 }
    1341                 :        354 :                 kaddr = kmap_atomic(page);
    1342                 :            : 
    1343 [ +  - ][ +  + ]:       7669 :                 for (; offset < PAGE_SIZE && kaddr[offset];
    1344                 :       7315 :                                 offset++, bprm->p++)
    1345                 :            :                         ;
    1346                 :            : 
    1347                 :        354 :                 kunmap_atomic(kaddr);
    1348                 :            :                 put_arg_page(page);
    1349                 :            : 
    1350                 :            :                 if (offset == PAGE_SIZE)
    1351                 :            :                         free_arg_page(bprm, (bprm->p >> PAGE_SHIFT) - 1);
    1352         [ -  + ]:        354 :         } while (offset == PAGE_SIZE);
    1353                 :            : 
    1354                 :        354 :         bprm->p++;
    1355                 :        354 :         bprm->argc--;
    1356                 :            :         ret = 0;
    1357                 :            : 
    1358                 :            : out:
    1359                 :        354 :         return ret;
    1360                 :            : }
    1361                 :            : EXPORT_SYMBOL(remove_arg_zero);
    1362                 :            : 
    1363                 :            : #define printable(c) (((c)=='\t') || ((c)=='\n') || (0x20<=(c) && (c)<=0x7e))
    1364                 :            : /*
    1365                 :            :  * cycle the list of binary formats handler, until one recognizes the image
    1366                 :            :  */
    1367                 :          0 : int search_binary_handler(struct linux_binprm *bprm)
    1368                 :            : {
    1369                 :            :         bool need_retry = IS_ENABLED(CONFIG_MODULES);
    1370                 :      82477 :         struct linux_binfmt *fmt;
    1371                 :            :         int retval;
    1372                 :            : 
    1373                 :            :         /* This allows 4 levels of binfmt rewrites before failing hard. */
    1374         [ +  - ]:      27607 :         if (bprm->recursion_depth > 5)
    1375                 :            :                 return -ELOOP;
    1376                 :            : 
    1377                 :      27607 :         retval = security_bprm_check(bprm);
    1378         [ +  + ]:      27604 :         if (retval)
    1379                 :            :                 return retval;
    1380                 :            : 
    1381                 :            :         retval = -ENOENT;
    1382                 :            :  retry:
    1383                 :      27608 :         read_lock(&binfmt_lock);
    1384         [ +  + ]:      82485 :         list_for_each_entry(fmt, &formats, lh) {
    1385         [ -  + ]:      82473 :                 if (!try_module_get(fmt->module))
    1386                 :          0 :                         continue;
    1387                 :            :                 read_unlock(&binfmt_lock);
    1388                 :      82482 :                 bprm->recursion_depth++;
    1389                 :      82482 :                 retval = fmt->load_binary(bprm);
    1390                 :      82471 :                 bprm->recursion_depth--;
    1391    [ +  + ][ + ]:      82471 :                 if (retval >= 0 || retval != -ENOEXEC ||
    1392            [ + ]:      54871 :                     bprm->mm == NULL || bprm->file == NULL) {
    1393                 :            :                         put_binfmt(fmt);
    1394                 :      27600 :                         return retval;
    1395                 :            :                 }
    1396                 :      54872 :                 read_lock(&binfmt_lock);
    1397                 :            :                 put_binfmt(fmt);
    1398                 :            :         }
    1399                 :            :         read_unlock(&binfmt_lock);
    1400                 :            : 
    1401         [ +  + ]:         12 :         if (need_retry && retval == -ENOEXEC) {
    1402 [ +  + ][ +  - ]:          7 :                 if (printable(bprm->buf[0]) && printable(bprm->buf[1]) &&
                 [ +  - ]
    1403         [ -  + ]:          2 :                     printable(bprm->buf[2]) && printable(bprm->buf[3]))
    1404                 :            :                         return retval;
    1405         [ +  - ]:          5 :                 if (request_module("binfmt-%04x", *(ushort *)(bprm->buf + 2)) < 0)
    1406                 :            :                         return retval;
    1407                 :            :                 need_retry = false;
    1408                 :            :                 goto retry;
    1409                 :            :         }
    1410                 :            : 
    1411                 :            :         return retval;
    1412                 :            : }
    1413                 :            : EXPORT_SYMBOL(search_binary_handler);
    1414                 :            : 
    1415                 :          0 : static int exec_binprm(struct linux_binprm *bprm)
    1416                 :            : {
    1417                 :            :         pid_t old_pid, old_vpid;
    1418                 :            :         int ret;
    1419                 :            : 
    1420                 :            :         /* Need to fetch pid before load_binary changes it */
    1421                 :      27253 :         old_pid = current->pid;
    1422                 :            :         rcu_read_lock();
    1423                 :      27253 :         old_vpid = task_pid_nr_ns(current, task_active_pid_ns(current->parent));
    1424                 :            :         rcu_read_unlock();
    1425                 :            : 
    1426                 :      27253 :         ret = search_binary_handler(bprm);
    1427         [ +  + ]:      27252 :         if (ret >= 0) {
    1428                 :            :                 audit_bprm(bprm);
    1429                 :      27246 :                 trace_sched_process_exec(current, old_pid, bprm);
    1430                 :      27246 :                 ptrace_event(PTRACE_EVENT_EXEC, old_vpid);
    1431                 :      27246 :                 proc_exec_connector(current);
    1432                 :            :         }
    1433                 :            : 
    1434                 :      27252 :         return ret;
    1435                 :            : }
    1436                 :            : 
    1437                 :            : /*
    1438                 :            :  * sys_execve() executes a new program.
    1439                 :            :  */
    1440                 :          0 : static int do_execve_common(struct filename *filename,
    1441                 :            :                                 struct user_arg_ptr argv,
    1442                 :            :                                 struct user_arg_ptr envp)
    1443                 :            : {
    1444                 :            :         struct linux_binprm *bprm;
    1445                 :            :         struct file *file;
    1446                 :            :         struct files_struct *displaced;
    1447                 :            :         int retval;
    1448                 :            : 
    1449         [ +  + ]:      50686 :         if (IS_ERR(filename))
    1450                 :          1 :                 return PTR_ERR(filename);
    1451                 :            : 
    1452                 :            :         /*
    1453                 :            :          * We move the actual failure in case of RLIMIT_NPROC excess from
    1454                 :            :          * set*uid() to execve() because too many poorly written programs
    1455                 :            :          * don't check setuid() return code.  Here we additionally recheck
    1456                 :            :          * whether NPROC limit is still exceeded.
    1457                 :            :          */
    1458 [ -  + ][ #  # ]:      50685 :         if ((current->flags & PF_NPROC_EXCEEDED) &&
    1459                 :          0 :             atomic_read(&current_user()->processes) > rlimit(RLIMIT_NPROC)) {
    1460                 :            :                 retval = -EAGAIN;
    1461                 :            :                 goto out_ret;
    1462                 :            :         }
    1463                 :            : 
    1464                 :            :         /* We're below the limit (still or again), so we don't want to make
    1465                 :            :          * further execve() calls fail. */
    1466                 :      50685 :         current->flags &= ~PF_NPROC_EXCEEDED;
    1467                 :            : 
    1468                 :      50685 :         retval = unshare_files(&displaced);
    1469         [ +  - ]:      50685 :         if (retval)
    1470                 :            :                 goto out_ret;
    1471                 :            : 
    1472                 :            :         retval = -ENOMEM;
    1473                 :            :         bprm = kzalloc(sizeof(*bprm), GFP_KERNEL);
    1474         [ +  - ]:      50684 :         if (!bprm)
    1475                 :            :                 goto out_files;
    1476                 :            : 
    1477                 :      50684 :         retval = prepare_bprm_creds(bprm);
    1478         [ +  - ]:      50685 :         if (retval)
    1479                 :            :                 goto out_free;
    1480                 :            : 
    1481                 :      50685 :         check_unsafe_exec(bprm);
    1482                 :      50684 :         current->in_execve = 1;
    1483                 :            : 
    1484                 :      50684 :         file = do_open_exec(filename);
    1485                 :            :         retval = PTR_ERR(file);
    1486         [ +  + ]:      50685 :         if (IS_ERR(file))
    1487                 :            :                 goto out_unmark;
    1488                 :            : 
    1489                 :      27253 :         sched_exec();
    1490                 :            : 
    1491                 :      27253 :         bprm->file = file;
    1492                 :      27253 :         bprm->filename = bprm->interp = filename->name;
    1493                 :            : 
    1494                 :      27253 :         retval = bprm_mm_init(bprm);
    1495         [ +  - ]:      27250 :         if (retval)
    1496                 :            :                 goto out_unmark;
    1497                 :            : 
    1498                 :      27250 :         bprm->argc = count(argv, MAX_ARG_STRINGS);
    1499         [ +  - ]:      27247 :         if ((retval = bprm->argc) < 0)
    1500                 :            :                 goto out;
    1501                 :            : 
    1502                 :      27247 :         bprm->envc = count(envp, MAX_ARG_STRINGS);
    1503         [ +  + ]:      27252 :         if ((retval = bprm->envc) < 0)
    1504                 :            :                 goto out;
    1505                 :            : 
    1506                 :      27251 :         retval = prepare_binprm(bprm);
    1507         [ +  + ]:      27252 :         if (retval < 0)
    1508                 :            :                 goto out;
    1509                 :            : 
    1510                 :      27251 :         retval = copy_strings_kernel(1, &bprm->filename, bprm);
    1511            [ + ]:      27252 :         if (retval < 0)
    1512                 :            :                 goto out;
    1513                 :            : 
    1514                 :      27253 :         bprm->exec = bprm->p;
    1515                 :      27253 :         retval = copy_strings(bprm->envc, envp, bprm);
    1516         [ +  - ]:      27253 :         if (retval < 0)
    1517                 :            :                 goto out;
    1518                 :            : 
    1519                 :      27253 :         retval = copy_strings(bprm->argc, argv, bprm);
    1520         [ +  - ]:      27253 :         if (retval < 0)
    1521                 :            :                 goto out;
    1522                 :            : 
    1523                 :      27253 :         retval = exec_binprm(bprm);
    1524         [ +  + ]:      27251 :         if (retval < 0)
    1525                 :            :                 goto out;
    1526                 :            : 
    1527                 :            :         /* execve succeeded */
    1528                 :      27244 :         current->fs->in_exec = 0;
    1529                 :      27244 :         current->in_execve = 0;
    1530                 :            :         acct_update_integrals(current);
    1531                 :            :         task_numa_free(current);
    1532                 :      27244 :         free_bprm(bprm);
    1533                 :      27246 :         putname(filename);
    1534         [ -  + ]:      27246 :         if (displaced)
    1535                 :          0 :                 put_files_struct(displaced);
    1536                 :      27246 :         return retval;
    1537                 :            : 
    1538                 :            : out:
    1539            [ + ]:          8 :         if (bprm->mm) {
    1540                 :          7 :                 acct_arg_size(bprm, 0);
    1541                 :          7 :                 mmput(bprm->mm);
    1542                 :            :         }
    1543                 :            : 
    1544                 :            : out_unmark:
    1545                 :      23439 :         current->fs->in_exec = 0;
    1546                 :      23439 :         current->in_execve = 0;
    1547                 :            : 
    1548                 :            : out_free:
    1549                 :      23439 :         free_bprm(bprm);
    1550                 :            : 
    1551                 :            : out_files:
    1552         [ -  + ]:      23439 :         if (displaced)
    1553                 :          0 :                 reset_files_struct(displaced);
    1554                 :            : out_ret:
    1555                 :      23439 :         putname(filename);
    1556                 :      23439 :         return retval;
    1557                 :            : }
    1558                 :            : 
    1559                 :          0 : int do_execve(struct filename *filename,
    1560                 :            :         const char __user *const __user *__argv,
    1561                 :            :         const char __user *const __user *__envp)
    1562                 :            : {
    1563                 :      50686 :         struct user_arg_ptr argv = { .ptr.native = __argv };
    1564                 :      50686 :         struct user_arg_ptr envp = { .ptr.native = __envp };
    1565                 :      50686 :         return do_execve_common(filename, argv, envp);
    1566                 :            : }
    1567                 :            : 
    1568                 :            : #ifdef CONFIG_COMPAT
    1569                 :            : static int compat_do_execve(struct filename *filename,
    1570                 :            :         const compat_uptr_t __user *__argv,
    1571                 :            :         const compat_uptr_t __user *__envp)
    1572                 :            : {
    1573                 :            :         struct user_arg_ptr argv = {
    1574                 :            :                 .is_compat = true,
    1575                 :            :                 .ptr.compat = __argv,
    1576                 :            :         };
    1577                 :            :         struct user_arg_ptr envp = {
    1578                 :            :                 .is_compat = true,
    1579                 :            :                 .ptr.compat = __envp,
    1580                 :            :         };
    1581                 :            :         return do_execve_common(filename, argv, envp);
    1582                 :            : }
    1583                 :            : #endif
    1584                 :            : 
    1585                 :          0 : void set_binfmt(struct linux_binfmt *new)
    1586                 :            : {
    1587                 :      27246 :         struct mm_struct *mm = current->mm;
    1588                 :            : 
    1589         [ -  + ]:      27246 :         if (mm->binfmt)
    1590                 :          0 :                 module_put(mm->binfmt->module);
    1591                 :            : 
    1592                 :      27246 :         mm->binfmt = new;
    1593         [ +  - ]:      27246 :         if (new)
    1594                 :      27246 :                 __module_get(new->module);
    1595                 :      27246 : }
    1596                 :            : EXPORT_SYMBOL(set_binfmt);
    1597                 :            : 
    1598                 :            : /*
    1599                 :            :  * set_dumpable stores three-value SUID_DUMP_* into mm->flags.
    1600                 :            :  */
    1601                 :          0 : void set_dumpable(struct mm_struct *mm, int value)
    1602                 :            : {
    1603                 :            :         unsigned long old, new;
    1604                 :            : 
    1605 [ -  + ][ +  - ]:      32391 :         if (WARN_ON((unsigned)value > SUID_DUMP_ROOT))
    1606                 :      32395 :                 return;
    1607                 :            : 
    1608                 :            :         do {
    1609                 :      32390 :                 old = ACCESS_ONCE(mm->flags);
    1610                 :      32390 :                 new = (old & ~MMF_DUMPABLE_MASK) | value;
    1611            [ + ]:      32394 :         } while (cmpxchg(&mm->flags, old, new) != old);
    1612                 :            : }
    1613                 :            : 
    1614                 :          0 : SYSCALL_DEFINE3(execve,
    1615                 :            :                 const char __user *, filename,
    1616                 :            :                 const char __user *const __user *, argv,
    1617                 :            :                 const char __user *const __user *, envp)
    1618                 :            : {
    1619                 :      50344 :         return do_execve(getname(filename), argv, envp);
    1620                 :            : }
    1621                 :            : #ifdef CONFIG_COMPAT
    1622                 :            : asmlinkage long compat_sys_execve(const char __user * filename,
    1623                 :            :         const compat_uptr_t __user * argv,
    1624                 :            :         const compat_uptr_t __user * envp)
    1625                 :            : {
    1626                 :            :         return compat_do_execve(getname(filename), argv, envp);
    1627                 :            : }
    1628                 :            : #endif

Generated by: LCOV version 1.9