tty: Fix ioctl(FIOASYNC) on hungup file
A small race window exists which allows signal-driven async i/o to be enabled for the tty when the file ptr has already been hungup and signal-driven i/o has been disabled: CPU 0 CPU 1 ----- ------ ioctl_fioasync(on) filp->f_op->fasync(on) __tty_hangup() tty_fasync(on) tty_lock() tty_lock() ... . filp->f_op = &hung_up_tty_fops; (waiting) __tty_fasync(off) . tty_unlock() /* gets tty lock */ /* enables FASYNC */ Check the tty has not been hungup while holding tty_lock. Signed-off-by: Peter Hurley <peter@hurleysoftware.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
f557474ca3
Коммит
a8f3a29718
|
@ -2260,10 +2260,11 @@ out:
|
|||
static int tty_fasync(int fd, struct file *filp, int on)
|
||||
{
|
||||
struct tty_struct *tty = file_tty(filp);
|
||||
int retval;
|
||||
int retval = -ENOTTY;
|
||||
|
||||
tty_lock(tty);
|
||||
retval = __tty_fasync(fd, filp, on);
|
||||
if (!tty_hung_up_p(filp))
|
||||
retval = __tty_fasync(fd, filp, on);
|
||||
tty_unlock(tty);
|
||||
|
||||
return retval;
|
||||
|
|
Загрузка…
Ссылка в новой задаче