From 7c6aaa0349cd12e17cca546fb5be66f8565fcd18 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 1 Oct 2020 18:06:51 +0200 Subject: [PATCH] Revert "exec: Add exec_update_mutex to replace cred_guard_mutex" This reverts commit b796d94921ce2adffcb30d25381bcb88a9d77f60 which is commit eea9673250db4e854e9998ef9da6d4584857f0ea. It breaks the API and we don't need it right now in the 5.4 tree. Bug: 161946584 Signed-off-by: Greg Kroah-Hartman Change-Id: Id9ad3c76420db75d11b0276ec89668b9a0809436 --- fs/exec.c | 22 +++------------------- include/linux/binfmts.h | 8 +------- include/linux/sched/signal.h | 9 +-------- init/init_task.c | 1 - kernel/fork.c | 1 - 5 files changed, 5 insertions(+), 36 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index 2441eb1a1e2d0..53b640e362c53 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1007,26 +1007,16 @@ ssize_t read_code(struct file *file, unsigned long addr, loff_t pos, size_t len) } EXPORT_SYMBOL(read_code); -/* - * Maps the mm_struct mm into the current task struct. - * On success, this function returns with the mutex - * exec_update_mutex locked. - */ static int exec_mmap(struct mm_struct *mm) { struct task_struct *tsk; struct mm_struct *old_mm, *active_mm; - int ret; /* Notify parent that we're no longer interested in the old VM */ tsk = current; old_mm = current->mm; exec_mm_release(tsk, old_mm); - ret = mutex_lock_killable(&tsk->signal->exec_update_mutex); - if (ret) - return ret; - if (old_mm) { sync_mm_rss(old_mm); /* @@ -1038,11 +1028,9 @@ static int exec_mmap(struct mm_struct *mm) down_read(&old_mm->mmap_sem); if (unlikely(old_mm->core_state)) { up_read(&old_mm->mmap_sem); - mutex_unlock(&tsk->signal->exec_update_mutex); return -EINTR; } } - task_lock(tsk); membarrier_exec_mmap(mm); @@ -1310,12 +1298,11 @@ int flush_old_exec(struct linux_binprm * bprm) goto out; /* - * After setting bprm->called_exec_mmap (to mark that current is - * using the prepared mm now), we have nothing left of the original + * After clearing bprm->mm (to mark that current is using the + * prepared mm now), we have nothing left of the original * process. If anything from here on returns an error, the check * in search_binary_handler() will SEGV current. */ - bprm->called_exec_mmap = 1; bprm->mm = NULL; set_fs(USER_DS); @@ -1449,8 +1436,6 @@ static void free_bprm(struct linux_binprm *bprm) { free_arg_pages(bprm); if (bprm->cred) { - if (bprm->called_exec_mmap) - mutex_unlock(¤t->signal->exec_update_mutex); mutex_unlock(¤t->signal->cred_guard_mutex); abort_creds(bprm->cred); } @@ -1500,7 +1485,6 @@ void install_exec_creds(struct linux_binprm *bprm) * credentials; any time after this it may be unlocked. */ security_bprm_committed_creds(bprm); - mutex_unlock(¤t->signal->exec_update_mutex); mutex_unlock(¤t->signal->cred_guard_mutex); } EXPORT_SYMBOL(install_exec_creds); @@ -1692,7 +1676,7 @@ int search_binary_handler(struct linux_binprm *bprm) read_lock(&binfmt_lock); put_binfmt(fmt); - if (retval < 0 && bprm->called_exec_mmap) { + if (retval < 0 && !bprm->mm) { /* we got to flush_old_exec() and failed after it */ read_unlock(&binfmt_lock); force_sigsegv(SIGSEGV); diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index a345d9fed3d8d..b40fc633f3be6 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -44,13 +44,7 @@ struct linux_binprm { * exec has happened. Used to sanitize execution environment * and to set AT_SECURE auxv for glibc. */ - secureexec:1, - /* - * Set by flush_old_exec, when exec_mmap has been called. - * This is past the point of no return, when the - * exec_update_mutex has been taken. - */ - called_exec_mmap:1; + secureexec:1; #ifdef __alpha__ unsigned int taso:1; #endif diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h index f71475f0004d0..f7d3466b4259d 100644 --- a/include/linux/sched/signal.h +++ b/include/linux/sched/signal.h @@ -225,14 +225,7 @@ struct signal_struct { struct mutex cred_guard_mutex; /* guard against foreign influences on * credential calculations - * (notably. ptrace) - * Deprecated do not use in new code. - * Use exec_update_mutex instead. - */ - struct mutex exec_update_mutex; /* Held while task_struct is being - * updated during exec, and may have - * inconsistent permissions. - */ + * (notably. ptrace) */ ANDROID_KABI_RESERVE(1); ANDROID_KABI_RESERVE(2); ANDROID_KABI_RESERVE(3); diff --git a/init/init_task.c b/init/init_task.c index aaa71366d162e..cbd40460e9036 100644 --- a/init/init_task.c +++ b/init/init_task.c @@ -27,7 +27,6 @@ static struct signal_struct init_signals = { .multiprocess = HLIST_HEAD_INIT, .rlim = INIT_RLIMITS, .cred_guard_mutex = __MUTEX_INITIALIZER(init_signals.cred_guard_mutex), - .exec_update_mutex = __MUTEX_INITIALIZER(init_signals.exec_update_mutex), #ifdef CONFIG_POSIX_TIMERS .posix_timers = LIST_HEAD_INIT(init_signals.posix_timers), .cputimer = { diff --git a/kernel/fork.c b/kernel/fork.c index 4c232ef67740a..c8fb52e0a0a5b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1597,7 +1597,6 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) sig->oom_score_adj_min = current->signal->oom_score_adj_min; mutex_init(&sig->cred_guard_mutex); - mutex_init(&sig->exec_update_mutex); return 0; }