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);
|
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)
|
static int exec_mmap(struct mm_struct *mm)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk;
|
struct task_struct *tsk;
|
||||||
struct mm_struct *old_mm, *active_mm;
|
struct mm_struct *old_mm, *active_mm;
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* Notify parent that we're no longer interested in the old VM */
|
/* Notify parent that we're no longer interested in the old VM */
|
||||||
tsk = current;
|
tsk = current;
|
||||||
old_mm = current->mm;
|
old_mm = current->mm;
|
||||||
exec_mm_release(tsk, old_mm);
|
exec_mm_release(tsk, old_mm);
|
||||||
|
|
||||||
ret = mutex_lock_killable(&tsk->signal->exec_update_mutex);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (old_mm) {
|
if (old_mm) {
|
||||||
sync_mm_rss(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);
|
down_read(&old_mm->mmap_sem);
|
||||||
if (unlikely(old_mm->core_state)) {
|
if (unlikely(old_mm->core_state)) {
|
||||||
up_read(&old_mm->mmap_sem);
|
up_read(&old_mm->mmap_sem);
|
||||||
mutex_unlock(&tsk->signal->exec_update_mutex);
|
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
task_lock(tsk);
|
task_lock(tsk);
|
||||||
membarrier_exec_mmap(mm);
|
membarrier_exec_mmap(mm);
|
||||||
|
|
||||||
@ -1310,12 +1298,11 @@ int flush_old_exec(struct linux_binprm * bprm)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* After setting bprm->called_exec_mmap (to mark that current is
|
* After clearing bprm->mm (to mark that current is using the
|
||||||
* using the prepared mm now), we have nothing left of the original
|
* prepared mm now), we have nothing left of the original
|
||||||
* process. If anything from here on returns an error, the check
|
* process. If anything from here on returns an error, the check
|
||||||
* in search_binary_handler() will SEGV current.
|
* in search_binary_handler() will SEGV current.
|
||||||
*/
|
*/
|
||||||
bprm->called_exec_mmap = 1;
|
|
||||||
bprm->mm = NULL;
|
bprm->mm = NULL;
|
||||||
|
|
||||||
set_fs(USER_DS);
|
set_fs(USER_DS);
|
||||||
@ -1449,8 +1436,6 @@ static void free_bprm(struct linux_binprm *bprm)
|
|||||||
{
|
{
|
||||||
free_arg_pages(bprm);
|
free_arg_pages(bprm);
|
||||||
if (bprm->cred) {
|
if (bprm->cred) {
|
||||||
if (bprm->called_exec_mmap)
|
|
||||||
mutex_unlock(¤t->signal->exec_update_mutex);
|
|
||||||
mutex_unlock(¤t->signal->cred_guard_mutex);
|
mutex_unlock(¤t->signal->cred_guard_mutex);
|
||||||
abort_creds(bprm->cred);
|
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.
|
* credentials; any time after this it may be unlocked.
|
||||||
*/
|
*/
|
||||||
security_bprm_committed_creds(bprm);
|
security_bprm_committed_creds(bprm);
|
||||||
mutex_unlock(¤t->signal->exec_update_mutex);
|
|
||||||
mutex_unlock(¤t->signal->cred_guard_mutex);
|
mutex_unlock(¤t->signal->cred_guard_mutex);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(install_exec_creds);
|
EXPORT_SYMBOL(install_exec_creds);
|
||||||
@ -1692,7 +1676,7 @@ int search_binary_handler(struct linux_binprm *bprm)
|
|||||||
|
|
||||||
read_lock(&binfmt_lock);
|
read_lock(&binfmt_lock);
|
||||||
put_binfmt(fmt);
|
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 */
|
/* we got to flush_old_exec() and failed after it */
|
||||||
read_unlock(&binfmt_lock);
|
read_unlock(&binfmt_lock);
|
||||||
force_sigsegv(SIGSEGV);
|
force_sigsegv(SIGSEGV);
|
||||||
|
@ -44,13 +44,7 @@ struct linux_binprm {
|
|||||||
* exec has happened. Used to sanitize execution environment
|
* exec has happened. Used to sanitize execution environment
|
||||||
* and to set AT_SECURE auxv for glibc.
|
* and to set AT_SECURE auxv for glibc.
|
||||||
*/
|
*/
|
||||||
secureexec:1,
|
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;
|
|
||||||
#ifdef __alpha__
|
#ifdef __alpha__
|
||||||
unsigned int taso:1;
|
unsigned int taso:1;
|
||||||
#endif
|
#endif
|
||||||
|
@ -225,14 +225,7 @@ struct signal_struct {
|
|||||||
|
|
||||||
struct mutex cred_guard_mutex; /* guard against foreign influences on
|
struct mutex cred_guard_mutex; /* guard against foreign influences on
|
||||||
* credential calculations
|
* credential calculations
|
||||||
* (notably. ptrace)
|
* (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.
|
|
||||||
*/
|
|
||||||
ANDROID_KABI_RESERVE(1);
|
ANDROID_KABI_RESERVE(1);
|
||||||
ANDROID_KABI_RESERVE(2);
|
ANDROID_KABI_RESERVE(2);
|
||||||
ANDROID_KABI_RESERVE(3);
|
ANDROID_KABI_RESERVE(3);
|
||||||
|
@ -27,7 +27,6 @@ static struct signal_struct init_signals = {
|
|||||||
.multiprocess = HLIST_HEAD_INIT,
|
.multiprocess = HLIST_HEAD_INIT,
|
||||||
.rlim = INIT_RLIMITS,
|
.rlim = INIT_RLIMITS,
|
||||||
.cred_guard_mutex = __MUTEX_INITIALIZER(init_signals.cred_guard_mutex),
|
.cred_guard_mutex = __MUTEX_INITIALIZER(init_signals.cred_guard_mutex),
|
||||||
.exec_update_mutex = __MUTEX_INITIALIZER(init_signals.exec_update_mutex),
|
|
||||||
#ifdef CONFIG_POSIX_TIMERS
|
#ifdef CONFIG_POSIX_TIMERS
|
||||||
.posix_timers = LIST_HEAD_INIT(init_signals.posix_timers),
|
.posix_timers = LIST_HEAD_INIT(init_signals.posix_timers),
|
||||||
.cputimer = {
|
.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;
|
sig->oom_score_adj_min = current->signal->oom_score_adj_min;
|
||||||
|
|
||||||
mutex_init(&sig->cred_guard_mutex);
|
mutex_init(&sig->cred_guard_mutex);
|
||||||
mutex_init(&sig->exec_update_mutex);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user