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:
Oleg Nesterov 2014-01-23 15:55:52 -08:00 коммит произвёл Linus Torvalds
Родитель 63e46b95e9
Коммит 98611e4e6a
4 изменённых файлов: 2 добавлений и 6 удалений

Просмотреть файл

@ -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;