diff options
| -rw-r--r-- | drivers/char/tty_io.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index f24c26d2dba1..e45326856680 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -1901,6 +1901,20 @@ static int init_dev(struct tty_driver *driver, int idx, | |||
| 1901 | /* check whether we're reopening an existing tty */ | 1901 | /* check whether we're reopening an existing tty */ |
| 1902 | if (driver->flags & TTY_DRIVER_DEVPTS_MEM) { | 1902 | if (driver->flags & TTY_DRIVER_DEVPTS_MEM) { |
| 1903 | tty = devpts_get_tty(idx); | 1903 | tty = devpts_get_tty(idx); |
| 1904 | /* | ||
| 1905 | * If we don't have a tty here on a slave open, it's because | ||
| 1906 | * the master already started the close process and there's | ||
| 1907 | * no relation between devpts file and tty anymore. | ||
| 1908 | */ | ||
| 1909 | if (!tty && driver->subtype == PTY_TYPE_SLAVE) { | ||
| 1910 | retval = -EIO; | ||
| 1911 | goto end_init; | ||
| 1912 | } | ||
| 1913 | /* | ||
| 1914 | * It's safe from now on because init_dev() is called with | ||
| 1915 | * tty_mutex held and release_dev() won't change tty->count | ||
| 1916 | * or tty->flags without having to grab tty_mutex | ||
| 1917 | */ | ||
| 1904 | if (tty && driver->subtype == PTY_TYPE_MASTER) | 1918 | if (tty && driver->subtype == PTY_TYPE_MASTER) |
| 1905 | tty = tty->link; | 1919 | tty = tty->link; |
| 1906 | } else { | 1920 | } else { |
