Commit 15582d36 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

pty: If the administrator creates a device for a ptmx slave we should not error

The open path for ptmx slaves is via the ptmx device. Opening them any
other way is not allowed. Vegard Nossum found that previously this was not
the case and mknod foo c 128 42; cat foo would produce nasty diagnostics
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dbda4c0b
...@@ -1227,7 +1227,8 @@ static void tty_line_name(struct tty_driver *driver, int index, char *p) ...@@ -1227,7 +1227,8 @@ static void tty_line_name(struct tty_driver *driver, int index, char *p)
* init_dev - initialise a tty device * init_dev - initialise a tty device
* @driver: tty driver we are opening a device on * @driver: tty driver we are opening a device on
* @idx: device index * @idx: device index
* @tty: returned tty structure * @ret_tty: returned tty structure
* @first_ok: ok to open a new device (used by ptmx)
* *
* Prepare a tty device. This may not be a "new" clean device but * Prepare a tty device. This may not be a "new" clean device but
* could also be an active device. The pty drivers require special * could also be an active device. The pty drivers require special
...@@ -1248,7 +1249,7 @@ static void tty_line_name(struct tty_driver *driver, int index, char *p) ...@@ -1248,7 +1249,7 @@ static void tty_line_name(struct tty_driver *driver, int index, char *p)
*/ */
static int init_dev(struct tty_driver *driver, int idx, static int init_dev(struct tty_driver *driver, int idx,
struct tty_struct **ret_tty) struct tty_struct **ret_tty, int first_ok)
{ {
struct tty_struct *tty, *o_tty; struct tty_struct *tty, *o_tty;
struct ktermios *tp, **tp_loc, *o_tp, **o_tp_loc; struct ktermios *tp, **tp_loc, *o_tp, **o_tp_loc;
...@@ -1279,6 +1280,11 @@ static int init_dev(struct tty_driver *driver, int idx, ...@@ -1279,6 +1280,11 @@ static int init_dev(struct tty_driver *driver, int idx,
} }
if (tty) goto fast_track; if (tty) goto fast_track;
if (driver->subtype == PTY_TYPE_MASTER &&
(driver->flags & TTY_DRIVER_DEVPTS_MEM) && !first_ok) {
retval = -EIO;
goto end_init;
}
/* /*
* First time open is complex, especially for PTY devices. * First time open is complex, especially for PTY devices.
* This code guarantees that either everything succeeds and the * This code guarantees that either everything succeeds and the
...@@ -1795,7 +1801,7 @@ static void release_dev(struct file *filp) ...@@ -1795,7 +1801,7 @@ static void release_dev(struct file *filp)
} }
/** /**
* tty_open - open a tty device * __tty_open - open a tty device
* @inode: inode of device file * @inode: inode of device file
* @filp: file pointer to tty * @filp: file pointer to tty
* *
...@@ -1874,7 +1880,7 @@ static int __tty_open(struct inode *inode, struct file *filp) ...@@ -1874,7 +1880,7 @@ static int __tty_open(struct inode *inode, struct file *filp)
return -ENODEV; return -ENODEV;
} }
got_driver: got_driver:
retval = init_dev(driver, index, &tty); retval = init_dev(driver, index, &tty, 0);
mutex_unlock(&tty_mutex); mutex_unlock(&tty_mutex);
if (retval) if (retval)
return retval; return retval;
...@@ -1971,7 +1977,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp) ...@@ -1971,7 +1977,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp)
return index; return index;
mutex_lock(&tty_mutex); mutex_lock(&tty_mutex);
retval = init_dev(ptm_driver, index, &tty); retval = init_dev(ptm_driver, index, &tty, 1);
mutex_unlock(&tty_mutex); mutex_unlock(&tty_mutex);
if (retval) if (retval)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment