mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 14:12:07 +02:00
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:
parent
f557474ca3
commit
a8f3a29718
|
|
@ -2260,10 +2260,11 @@ static int __tty_fasync(int fd, struct file *filp, int on)
|
|||
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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user