Skip to content

Commit

Permalink
[PATCH] setpgid: should work for sub-threads
Browse files Browse the repository at this point in the history
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: Oren Laadan <orenl@cs.columbia.edu>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Roland McGrath <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Oren Laadan authored and Linus Torvalds committed Jan 9, 2006
1 parent ee0acf9 commit e19f247
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 10 deletions.
2 changes: 1 addition & 1 deletion kernel/exit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
16 changes: 7 additions & 9 deletions kernel/sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit e19f247

Please sign in to comment.