]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
exec: Merge install_exec_creds into setup_new_exec
authorEric W. Biederman <ebiederm@xmission.com>
Sun, 3 May 2020 11:48:17 +0000 (06:48 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Thu, 7 May 2020 21:55:47 +0000 (16:55 -0500)
The two functions are now always called one right after the
other so merge them together to make future maintenance easier.

Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Greg Ungerer <gerg@linux-m68k.org>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
arch/x86/ia32/ia32_aout.c
fs/binfmt_aout.c
fs/binfmt_elf.c
fs/binfmt_elf_fdpic.c
fs/binfmt_flat.c
fs/exec.c
include/linux/binfmts.h
kernel/events/core.c

index 37b36a8ce5fa74ab87c1baa43b50fa55c7e0199a..8255fdc3a027c2afcb9f1b244c92a325ea6f2d5e 100644 (file)
@@ -140,7 +140,6 @@ static int load_aout_binary(struct linux_binprm *bprm)
        set_personality_ia32(false);
 
        setup_new_exec(bprm);
-       install_exec_creds(bprm);
 
        regs->cs = __USER32_CS;
        regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 =
index ace587b66904c855d519fe97d3afdb969b8dc223..c8ba28f285e575bda447c50fb0e4c74b93139cbe 100644 (file)
@@ -162,7 +162,6 @@ static int load_aout_binary(struct linux_binprm * bprm)
        set_personality(PER_LINUX);
 #endif
        setup_new_exec(bprm);
-       install_exec_creds(bprm);
 
        current->mm->end_code = ex.a_text +
                (current->mm->start_code = N_TXTADDR(ex));
index 13f25e241ac46cbd2f5ffa23de45e60a035a0c1a..e6b58662303540adb13365628b01e33b1516d607 100644 (file)
@@ -858,7 +858,6 @@ out_free_interp:
                current->flags |= PF_RANDOMIZE;
 
        setup_new_exec(bprm);
-       install_exec_creds(bprm);
 
        /* Do this so that we can load the interpreter, if need be.  We will
           change some of these later */
index 6c94c6d53d971a852fa6510b89748cc1b4c8fd6d..9a1aa61b4cc3c6e204afc1d6dfca9ac9c6a18c4c 100644 (file)
@@ -353,7 +353,6 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm)
                current->personality |= READ_IMPLIES_EXEC;
 
        setup_new_exec(bprm);
-       install_exec_creds(bprm);
 
        set_binfmt(&elf_fdpic_format);
 
index 1a1d1fcb893f1b0e1df4311cd7eab1a3bc82a541..252878969582abbded335bf8aef7cd295708cce0 100644 (file)
@@ -541,7 +541,6 @@ static int load_flat_file(struct linux_binprm *bprm,
                /* OK, This is the point of no return */
                set_personality(PER_LINUX_32BIT);
                setup_new_exec(bprm);
-               install_exec_creds(bprm);
        }
 
        /*
index 71de9f57ae09c0b0fcf5d9d607e01aa0f1c7cb25..93e40f865523ec3ef98792c7f96b30735cbd3469 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1443,6 +1443,31 @@ void setup_new_exec(struct linux_binprm * bprm)
           group */
        WRITE_ONCE(current->self_exec_id, current->self_exec_id + 1);
        flush_signal_handlers(current, 0);
+
+       /*
+        * install the new credentials for this executable
+        */
+       security_bprm_committing_creds(bprm);
+
+       commit_creds(bprm->cred);
+       bprm->cred = NULL;
+
+       /*
+        * Disable monitoring for regular users
+        * when executing setuid binaries. Must
+        * wait until new credentials are committed
+        * by commit_creds() above
+        */
+       if (get_dumpable(current->mm) != SUID_DUMP_USER)
+               perf_event_exit_task(current);
+       /*
+        * cred_guard_mutex must be held at least to this point to prevent
+        * ptrace_attach() from altering our determination of the task's
+        * credentials; any time after this it may be unlocked.
+        */
+       security_bprm_committed_creds(bprm);
+       mutex_unlock(&current->signal->exec_update_mutex);
+       mutex_unlock(&current->signal->cred_guard_mutex);
 }
 EXPORT_SYMBOL(setup_new_exec);
 
@@ -1458,7 +1483,7 @@ EXPORT_SYMBOL(finalize_exec);
 
 /*
  * Prepare credentials and lock ->cred_guard_mutex.
- * install_exec_creds() commits the new creds and drops the lock.
+ * setup_new_exec() commits the new creds and drops the lock.
  * Or, if exec fails before, free_bprm() should release ->cred and
  * and unlock.
  */
@@ -1504,35 +1529,6 @@ int bprm_change_interp(const char *interp, struct linux_binprm *bprm)
 }
 EXPORT_SYMBOL(bprm_change_interp);
 
-/*
- * install the new credentials for this executable
- */
-void install_exec_creds(struct linux_binprm *bprm)
-{
-       security_bprm_committing_creds(bprm);
-
-       commit_creds(bprm->cred);
-       bprm->cred = NULL;
-
-       /*
-        * Disable monitoring for regular users
-        * when executing setuid binaries. Must
-        * wait until new credentials are committed
-        * by commit_creds() above
-        */
-       if (get_dumpable(current->mm) != SUID_DUMP_USER)
-               perf_event_exit_task(current);
-       /*
-        * cred_guard_mutex must be held at least to this point to prevent
-        * ptrace_attach() from altering our determination of the task's
-        * credentials; any time after this it may be unlocked.
-        */
-       security_bprm_committed_creds(bprm);
-       mutex_unlock(&current->signal->exec_update_mutex);
-       mutex_unlock(&current->signal->cred_guard_mutex);
-}
-EXPORT_SYMBOL(install_exec_creds);
-
 /*
  * determine how safe it is to execute the proposed program
  * - the caller must hold ->cred_guard_mutex to protect against
index 8f479dad7931296b51948a5bb77e0f4b31e7920c..2a8fddf3574aec347c66c429f862299d0bc11c5b 100644 (file)
@@ -145,7 +145,6 @@ extern int transfer_args_to_stack(struct linux_binprm *bprm,
 extern int bprm_change_interp(const char *interp, struct linux_binprm *bprm);
 extern int copy_strings_kernel(int argc, const char *const *argv,
                               struct linux_binprm *bprm);
-extern void install_exec_creds(struct linux_binprm *bprm);
 extern void set_binfmt(struct linux_binfmt *new);
 extern ssize_t read_code(struct file *, unsigned long, loff_t, size_t);
 
index 633b4ae72ed598449f3ba2bb0da24eb92e86b17e..169449b5e56b8aa2cab50e87930d3316477bda4e 100644 (file)
@@ -12217,7 +12217,7 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn)
  * When a child task exits, feed back event values to parent events.
  *
  * Can be called with exec_update_mutex held when called from
- * install_exec_creds().
+ * setup_new_exec().
  */
 void perf_event_exit_task(struct task_struct *child)
 {