tty: Add a kref count
Introduce a kref to the tty structure and use it to protect the tty->signal tty references. For now we don't introduce it for anything else. Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@ -802,6 +802,7 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
|
||||
|
||||
sig->leader = 0; /* session leadership doesn't inherit */
|
||||
sig->tty_old_pgrp = NULL;
|
||||
sig->tty = NULL;
|
||||
|
||||
sig->utime = sig->stime = sig->cutime = sig->cstime = cputime_zero;
|
||||
sig->gtime = cputime_zero;
|
||||
@ -838,6 +839,7 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
|
||||
void __cleanup_signal(struct signal_struct *sig)
|
||||
{
|
||||
exit_thread_group_keys(sig);
|
||||
tty_kref_put(sig->tty);
|
||||
kmem_cache_free(signal_cachep, sig);
|
||||
}
|
||||
|
||||
@ -1227,7 +1229,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
||||
p->nsproxy->pid_ns->child_reaper = p;
|
||||
|
||||
p->signal->leader_pid = pid;
|
||||
p->signal->tty = current->signal->tty;
|
||||
tty_kref_put(p->signal->tty);
|
||||
p->signal->tty = tty_kref_get(current->signal->tty);
|
||||
set_task_pgrp(p, task_pgrp_nr(current));
|
||||
set_task_session(p, task_session_nr(current));
|
||||
attach_pid(p, PIDTYPE_PGID, task_pgrp(current));
|
||||
|
@ -1060,9 +1060,7 @@ asmlinkage long sys_setsid(void)
|
||||
group_leader->signal->leader = 1;
|
||||
__set_special_pids(sid);
|
||||
|
||||
spin_lock(&group_leader->sighand->siglock);
|
||||
group_leader->signal->tty = NULL;
|
||||
spin_unlock(&group_leader->sighand->siglock);
|
||||
proc_clear_tty(group_leader);
|
||||
|
||||
err = session;
|
||||
out:
|
||||
|
Reference in New Issue
Block a user