exec: kill task_struct->did_exec
We can kill either task->did_exec or PF_FORKNOEXEC, they are mutually exclusive. The patch kills ->did_exec because it has a single user. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Kees Cook <keescook@chromium.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
63e46b95e9
Коммит
98611e4e6a
|
@ -1424,7 +1424,6 @@ static int exec_binprm(struct linux_binprm *bprm)
|
||||||
audit_bprm(bprm);
|
audit_bprm(bprm);
|
||||||
trace_sched_process_exec(current, old_pid, bprm);
|
trace_sched_process_exec(current, old_pid, bprm);
|
||||||
ptrace_event(PTRACE_EVENT_EXEC, old_vpid);
|
ptrace_event(PTRACE_EVENT_EXEC, old_vpid);
|
||||||
current->did_exec = 1;
|
|
||||||
proc_exec_connector(current);
|
proc_exec_connector(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1239,7 +1239,6 @@ struct task_struct {
|
||||||
/* Used for emulating ABI behavior of previous Linux versions */
|
/* Used for emulating ABI behavior of previous Linux versions */
|
||||||
unsigned int personality;
|
unsigned int personality;
|
||||||
|
|
||||||
unsigned did_exec:1;
|
|
||||||
unsigned in_execve:1; /* Tell the LSMs that the process is doing an
|
unsigned in_execve:1; /* Tell the LSMs that the process is doing an
|
||||||
* execve */
|
* execve */
|
||||||
unsigned in_iowait:1;
|
unsigned in_iowait:1;
|
||||||
|
|
|
@ -1226,7 +1226,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
||||||
if (!try_module_get(task_thread_info(p)->exec_domain->module))
|
if (!try_module_get(task_thread_info(p)->exec_domain->module))
|
||||||
goto bad_fork_cleanup_count;
|
goto bad_fork_cleanup_count;
|
||||||
|
|
||||||
p->did_exec = 0;
|
|
||||||
delayacct_tsk_init(p); /* Must remain after dup_task_struct() */
|
delayacct_tsk_init(p); /* Must remain after dup_task_struct() */
|
||||||
copy_flags(clone_flags, p);
|
copy_flags(clone_flags, p);
|
||||||
INIT_LIST_HEAD(&p->children);
|
INIT_LIST_HEAD(&p->children);
|
||||||
|
|
|
@ -895,8 +895,7 @@ SYSCALL_DEFINE1(times, struct tms __user *, tbuf)
|
||||||
* only important on a multi-user system anyway, to make sure one user
|
* only important on a multi-user system anyway, to make sure one user
|
||||||
* can't send a signal to a process owned by another. -TYT, 12/12/91
|
* can't send a signal to a process owned by another. -TYT, 12/12/91
|
||||||
*
|
*
|
||||||
* Auch. Had to add the 'did_exec' flag to conform completely to POSIX.
|
* !PF_FORKNOEXEC check to conform completely to POSIX.
|
||||||
* LBT 04.03.94
|
|
||||||
*/
|
*/
|
||||||
SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
|
SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
|
||||||
{
|
{
|
||||||
|
@ -932,7 +931,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
|
||||||
if (task_session(p) != task_session(group_leader))
|
if (task_session(p) != task_session(group_leader))
|
||||||
goto out;
|
goto out;
|
||||||
err = -EACCES;
|
err = -EACCES;
|
||||||
if (p->did_exec)
|
if (!(p->flags & PF_FORKNOEXEC))
|
||||||
goto out;
|
goto out;
|
||||||
} else {
|
} else {
|
||||||
err = -ESRCH;
|
err = -ESRCH;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче