Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e19f247a authored by Oren Laadan's avatar Oren Laadan Committed by Linus Torvalds
Browse files

[PATCH] setpgid: should work for sub-threads



setsid() does not work unless the calling process is a
thread_group_leader().

'man setpgid' does not tell anything about that, so I consider this
behaviour is a bug.

Signed-off-by: default avatarOren Laadan <orenl@cs.columbia.edu>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Roland McGrath <roland@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ee0acf90
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -257,7 +257,7 @@ static inline void reparent_to_init(void)

void __set_special_pids(pid_t session, pid_t pgrp)
{
	struct task_struct *curr = current;
	struct task_struct *curr = current->group_leader;

	if (curr->signal->session != session) {
		detach_pid(curr, PIDTYPE_SID);
+7 −9
Original line number Diff line number Diff line
@@ -1215,24 +1215,22 @@ asmlinkage long sys_getsid(pid_t pid)

asmlinkage long sys_setsid(void)
{
	struct task_struct *group_leader = current->group_leader;
	struct pid *pid;
	int err = -EPERM;

	if (!thread_group_leader(current))
		return -EINVAL;

	down(&tty_sem);
	write_lock_irq(&tasklist_lock);

	pid = find_pid(PIDTYPE_PGID, current->pid);
	pid = find_pid(PIDTYPE_PGID, group_leader->pid);
	if (pid)
		goto out;

	current->signal->leader = 1;
	__set_special_pids(current->pid, current->pid);
	current->signal->tty = NULL;
	current->signal->tty_old_pgrp = 0;
	err = process_group(current);
	group_leader->signal->leader = 1;
	__set_special_pids(group_leader->pid, group_leader->pid);
	group_leader->signal->tty = NULL;
	group_leader->signal->tty_old_pgrp = 0;
	err = process_group(group_leader);
out:
	write_unlock_irq(&tasklist_lock);
	up(&tty_sem);