Revert "exec: Add exec_update_mutex to replace cred_guard_mutex"
This reverts commit b796d94921
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 <gregkh@google.com>
Change-Id: Id9ad3c76420db75d11b0276ec89668b9a0809436
This commit is contained in:
parent
70187595b8
commit
7c6aaa0349
22
fs/exec.c
22
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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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 = {
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user