tty: fix leakage of -ERESTARTSYS to userland
Spotted by Satoru Takeuchi. kill_pgrp(task_pgrp(current)) sends the signal to the current's thread group, but can choose any sub-thread as a target for signal_wake_up(). This means that job_control() and tty_check_change() may return -ERESTARTSYS without signal_pending(). Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> Cc: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com> Cc: Roland McGrath <roland@redhat.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
13466c8419
commit
040b6362d5
|
@ -1191,6 +1191,7 @@ static int job_control(struct tty_struct *tty, struct file *file)
|
||||||
is_current_pgrp_orphaned())
|
is_current_pgrp_orphaned())
|
||||||
return -EIO;
|
return -EIO;
|
||||||
kill_pgrp(task_pgrp(current), SIGTTIN, 1);
|
kill_pgrp(task_pgrp(current), SIGTTIN, 1);
|
||||||
|
set_thread_flag(TIF_SIGPENDING);
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1148,7 +1148,8 @@ int tty_check_change(struct tty_struct * tty)
|
||||||
return 0;
|
return 0;
|
||||||
if (is_current_pgrp_orphaned())
|
if (is_current_pgrp_orphaned())
|
||||||
return -EIO;
|
return -EIO;
|
||||||
(void) kill_pgrp(task_pgrp(current), SIGTTOU, 1);
|
kill_pgrp(task_pgrp(current), SIGTTOU, 1);
|
||||||
|
set_thread_flag(TIF_SIGPENDING);
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue