Commit 593a27c4 authored by Konstantin Khlebnikov's avatar Konstantin Khlebnikov Committed by Greg Kroah-Hartman

tty: cleanup prohibition of direct opening for unix98 pty master

cleanup hack added in v2.6.27-3203-g15582d36

comment from that patch:

: 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: Alan Cox <alan@redhat.com>
: Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

devpts_get_tty() returns non-null only for inodes on devpts, but there is no
inodes for master-devices, /dev/ptmx (/dev/pts/ptmx) is the only way to open them.
Thus we can completely forbid lookup for master-devices and eliminate that hack in
tty_init_dev() because tty_open() will get EIO from tty_driver_lookup_tty().
Signed-off-by: default avatarKonstantin Khlebnikov <khlebnikov@openvz.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent dcd6c922
...@@ -515,10 +515,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty, ...@@ -515,10 +515,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty,
static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver, static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
struct inode *ptm_inode, int idx) struct inode *ptm_inode, int idx)
{ {
struct tty_struct *tty = devpts_get_tty(ptm_inode, idx); /* Master must be open via /dev/ptmx */
if (tty) return ERR_PTR(-EIO);
tty = tty->link;
return tty;
} }
/** /**
...@@ -677,7 +675,7 @@ static int ptmx_open(struct inode *inode, struct file *filp) ...@@ -677,7 +675,7 @@ static int ptmx_open(struct inode *inode, struct file *filp)
mutex_lock(&tty_mutex); mutex_lock(&tty_mutex);
tty_lock(); tty_lock();
tty = tty_init_dev(ptm_driver, index, 1); tty = tty_init_dev(ptm_driver, index);
mutex_unlock(&tty_mutex); mutex_unlock(&tty_mutex);
if (IS_ERR(tty)) { if (IS_ERR(tty)) {
......
...@@ -1365,7 +1365,6 @@ static int tty_reopen(struct tty_struct *tty) ...@@ -1365,7 +1365,6 @@ static int tty_reopen(struct tty_struct *tty)
* @driver: tty driver we are opening a device on * @driver: tty driver we are opening a device on
* @idx: device index * @idx: device index
* @ret_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
...@@ -1385,18 +1384,11 @@ static int tty_reopen(struct tty_struct *tty) ...@@ -1385,18 +1384,11 @@ static int tty_reopen(struct tty_struct *tty)
* relaxed for the (most common) case of reopening a tty. * relaxed for the (most common) case of reopening a tty.
*/ */
struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx, struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
int first_ok)
{ {
struct tty_struct *tty; struct tty_struct *tty;
int retval; int retval;
/* Check if pty master is being opened multiple times */
if (driver->subtype == PTY_TYPE_MASTER &&
(driver->flags & TTY_DRIVER_DEVPTS_MEM) && !first_ok) {
return ERR_PTR(-EIO);
}
/* /*
* 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
...@@ -1950,7 +1942,7 @@ static int tty_open(struct inode *inode, struct file *filp) ...@@ -1950,7 +1942,7 @@ static int tty_open(struct inode *inode, struct file *filp)
if (retval) if (retval)
tty = ERR_PTR(retval); tty = ERR_PTR(retval);
} else } else
tty = tty_init_dev(driver, index, 0); tty = tty_init_dev(driver, index);
mutex_unlock(&tty_mutex); mutex_unlock(&tty_mutex);
if (driver) if (driver)
......
...@@ -480,8 +480,7 @@ extern void free_tty_struct(struct tty_struct *tty); ...@@ -480,8 +480,7 @@ extern void free_tty_struct(struct tty_struct *tty);
extern void initialize_tty_struct(struct tty_struct *tty, extern void initialize_tty_struct(struct tty_struct *tty,
struct tty_driver *driver, int idx); struct tty_driver *driver, int idx);
extern void deinitialize_tty_struct(struct tty_struct *tty); extern void deinitialize_tty_struct(struct tty_struct *tty);
extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx, extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx);
int first_ok);
extern int tty_release(struct inode *inode, struct file *filp); extern int tty_release(struct inode *inode, struct file *filp);
extern int tty_init_termios(struct tty_struct *tty); extern int tty_init_termios(struct tty_struct *tty);
......
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