Skip to contentSkip to conversation

tty: cleanup prohibition of direct opening for unix98 pty master

PATCH In review Konstantin Khlebnikov 4 participants 10 messages Jan 2, 2012 – Jan 5, 2012 TTY layer and serial drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 tty: cleanup prohibition of direct opening for unix98 pty master

cleanup hack added in v2.6.27-3203-g15582d3

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 <[email protected]>
: Signed-off-by: Linus Torvalds <[email protected]>

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().

---
 drivers/tty/pty.c    |    8 +++-----
 drivers/tty/tty_io.c |   12 ++----------
 include/linux/tty.h  |    3 +--
 3 files changed, 6 insertions(+), 17 deletions(-)
drivers/tty/pty.c +3 -5
index e18604b..d2bf3c1 100644
@@ -526,10 +526,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty,
 static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
 		struct inode *ptm_inode, int idx)
 {
-	struct tty_struct *tty = devpts_get_tty(ptm_inode, idx);
-	if (tty)
-		tty = tty->link;
-	return tty;
+	/* Master must be open via /dev/ptmx */
+	return ERR_PTR(-EIO);
 }
 
 /**
@@ -685,7 +683,7 @@ static int ptmx_open(struct inode *inode, struct file *filp)
 
 	mutex_lock(&tty_mutex);
 	tty_lock();
-	tty = tty_init_dev(ptm_driver, index, 1);
+	tty = tty_init_dev(ptm_driver, index);
 	mutex_unlock(&tty_mutex);
 
 	if (IS_ERR(tty)) {
drivers/tty/tty_io.c +2 -10
index 05085be..7cddf91 100644
@@ -1366,7 +1366,6 @@ static int tty_reopen(struct tty_struct *tty)
  *	@driver: tty driver we are opening a device on
  *	@idx: device index
  *	@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
  *	could also be an active device. The pty drivers require special
@@ -1386,18 +1385,11 @@ static int tty_reopen(struct tty_struct *tty)
  * relaxed for the (most common) case of reopening a tty.
  */
 
-struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
-								int first_ok)
+struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
 {
 	struct tty_struct *tty;
 	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.
 	 * This code guarantees that either everything succeeds and the
@@ -1909,7 +1901,7 @@ got_driver:
 		if (retval)
 			tty = ERR_PTR(retval);
 	} else
-		tty = tty_init_dev(driver, index, 0);
+		tty = tty_init_dev(driver, index);
 
 	mutex_unlock(&tty_mutex);
 	tty_driver_kref_put(driver);
include/linux/tty.h +1 -2
index 5dbb3cb..d3ebd76 100644
@@ -480,8 +480,7 @@ extern void free_tty_struct(struct tty_struct *tty);
 extern void initialize_tty_struct(struct tty_struct *tty,
 		struct tty_driver *driver, int idx);
 extern void deinitialize_tty_struct(struct tty_struct *tty);
-extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
-								int first_ok);
+extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx);
 extern int tty_release(struct inode *inode, struct file *filp);
 extern int tty_init_termios(struct tty_struct *tty);
 
#1 lore raw
Quoted 4 lines · Konstantin Khlebnikov

cleanup hack added in v2.6.27-3203-g15582d3

comment from that patch:

Quoted 8 lines

: 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 <[email protected]>
: Signed-off-by: Linus Torvalds <[email protected]>

Any reason why you didn't include these two people on this patch? Perhaps they might wish to review it...

greg k-h

#2 lore raw
Quoted 14 lines · Greg KH
Quoted 4 lines · Konstantin Khlebnikov

cleanup hack added in v2.6.27-3203-g15582d3

comment from that patch:

Quoted 8 lines

: 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<[email protected]>
: Signed-off-by: Linus Torvalds<[email protected]>

Quoted 2 lines

Any reason why you didn't include these two people on this patch? Perhaps they might wish to review it...

This is just simple cleanup patch.

Quoted 2 lines

greg k-h

#3 lore raw
Quoted 15 lines · Konstantin Khlebnikov
Quoted 14 lines · Greg KH
Quoted 12 lines · Konstantin Khlebnikov

cleanup hack added in v2.6.27-3203-g15582d3

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<[email protected]>
: Signed-off-by: Linus Torvalds<[email protected]>

Quoted 4 lines
Quoted 2 lines

Any reason why you didn't include these two people on this patch? Perhaps they might wish to review it...

This is just simple cleanup patch.

Even so, please resend and copy them.

greg k-h

#4 lore raw

PATCH 1/1 tty: cleanup prohibition of direct opening for unix98 pty master

In reply to Konstantin Khlebnikov

cleanup hack added in v2.6.27-3203-g15582d3

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 <[email protected]>
: Signed-off-by: Linus Torvalds <[email protected]>

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().

---
 drivers/tty/pty.c    |    8 +++-----
 drivers/tty/tty_io.c |   12 ++----------
 include/linux/tty.h  |    3 +--
 3 files changed, 6 insertions(+), 17 deletions(-)
drivers/tty/pty.c +3 -5
index e18604b..d2bf3c1 100644
@@ -526,10 +526,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty,
 static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
 		struct inode *ptm_inode, int idx)
 {
-	struct tty_struct *tty = devpts_get_tty(ptm_inode, idx);
-	if (tty)
-		tty = tty->link;
-	return tty;
+	/* Master must be open via /dev/ptmx */
+	return ERR_PTR(-EIO);
 }
 
 /**
@@ -685,7 +683,7 @@ static int ptmx_open(struct inode *inode, struct file *filp)
 
 	mutex_lock(&tty_mutex);
 	tty_lock();
-	tty = tty_init_dev(ptm_driver, index, 1);
+	tty = tty_init_dev(ptm_driver, index);
 	mutex_unlock(&tty_mutex);
 
 	if (IS_ERR(tty)) {
drivers/tty/tty_io.c +2 -10
index 05085be..7cddf91 100644
@@ -1366,7 +1366,6 @@ static int tty_reopen(struct tty_struct *tty)
  *	@driver: tty driver we are opening a device on
  *	@idx: device index
  *	@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
  *	could also be an active device. The pty drivers require special
@@ -1386,18 +1385,11 @@ static int tty_reopen(struct tty_struct *tty)
  * relaxed for the (most common) case of reopening a tty.
  */
 
-struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
-								int first_ok)
+struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
 {
 	struct tty_struct *tty;
 	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.
 	 * This code guarantees that either everything succeeds and the
@@ -1909,7 +1901,7 @@ got_driver:
 		if (retval)
 			tty = ERR_PTR(retval);
 	} else
-		tty = tty_init_dev(driver, index, 0);
+		tty = tty_init_dev(driver, index);
 
 	mutex_unlock(&tty_mutex);
 	tty_driver_kref_put(driver);
include/linux/tty.h +1 -2
index 5dbb3cb..d3ebd76 100644
@@ -480,8 +480,7 @@ extern void free_tty_struct(struct tty_struct *tty);
 extern void initialize_tty_struct(struct tty_struct *tty,
 		struct tty_driver *driver, int idx);
 extern void deinitialize_tty_struct(struct tty_struct *tty);
-extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
-								int first_ok);
+extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx);
 extern int tty_release(struct inode *inode, struct file *filp);
 extern int tty_init_termios(struct tty_struct *tty);
 
#5 lore raw

Looks ok as far as I can tell, and does indeed clean things up. I assume somebody tested the case that we used to have issues with?

Linus

Quoted 107 lines · Konstantin Khlebnikov

cleanup hack added in v2.6.27-3203-g15582d3

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 <[email protected]>
: Signed-off-by: Linus Torvalds <[email protected]>

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().

---
 drivers/tty/pty.c    |    8 +++-----
 drivers/tty/tty_io.c |   12 ++----------
 include/linux/tty.h  |    3 +--

 3 files changed, 6 insertions(+), 17 deletions(-)
drivers/tty/pty.c +3 -5
index e18604b..d2bf3c1 100644
@@ -526,10 +526,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty,
  static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
                struct inode *ptm_inode, int idx)
  {
-       struct tty_struct *tty = devpts_get_tty(ptm_inode, idx);
-       if (tty)
-               tty = tty->link;
-       return tty;
+       /* Master must be open via /dev/ptmx */
+       return ERR_PTR(-EIO);
  }
 
  /**
@@ -685,7 +683,7 @@ static int ptmx_open(struct inode *inode, struct file *filp)
 
        mutex_lock(&tty_mutex);
        tty_lock();
-       tty = tty_init_dev(ptm_driver, index, 1);
+       tty = tty_init_dev(ptm_driver, index);
        mutex_unlock(&tty_mutex);
 
        if (IS_ERR(tty)) {
drivers/tty/tty_io.c +2 -10
index 05085be..7cddf91 100644
@@ -1366,7 +1366,6 @@ static int tty_reopen(struct tty_struct *tty)
  *     @driver: tty driver we are opening a device on
  *     @idx: device index
  *     @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
  *     could also be an active device. The pty drivers require special
@@ -1386,18 +1385,11 @@ static int tty_reopen(struct tty_struct *tty)
  * relaxed for the (most common) case of reopening a tty.
  */
 
-struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
-                                                               int first_ok)
+struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
  {
        struct tty_struct *tty;
        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.
         * This code guarantees that either everything succeeds and the
@@ -1909,7 +1901,7 @@ got_driver:
                if (retval)
                        tty = ERR_PTR(retval);
        } else
-               tty = tty_init_dev(driver, index, 0);
+               tty = tty_init_dev(driver, index);
 
        mutex_unlock(&tty_mutex);
        tty_driver_kref_put(driver);
include/linux/tty.h +1 -2
index 5dbb3cb..d3ebd76 100644
@@ -480,8 +480,7 @@ extern void free_tty_struct(struct tty_struct *tty);
  extern void initialize_tty_struct(struct tty_struct *tty,
                struct tty_driver *driver, int idx);
  extern void deinitialize_tty_struct(struct tty_struct *tty);
-extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
-                                                               int first_ok);
+extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx);
  extern int tty_release(struct inode *inode, struct file *filp);
  extern int tty_init_termios(struct tty_struct *tty);
 
#6 lore raw
Quoted 2 lines · Linus Torvalds

Looks ok as far as I can tell, and does indeed clean things up. I assume somebody tested the case that we used to have issues with?

Yes of course I tested it.

Quoted 24 lines

Linus

Quoted 19 lines · Konstantin Khlebnikov

cleanup hack added in v2.6.27-3203-g15582d3

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<[email protected]>
: Signed-off-by: Linus Torvalds<[email protected]>

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().

#7 lore raw
In reply to Konstantin Khlebnikov
Quoted 13 lines · Konstantin Khlebnikov

cleanup hack added in v2.6.27-3203-g15582d3

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 <[email protected]>
: Signed-off-by: Linus Torvalds <[email protected]>

Quoted 6 lines

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().

What tree did you make this patch against? I get fuzz warnings when applying it to the tty-next branch (it's in the linux-next releases).

Please rediff it and resend it.

thanks,

greg k-h

#8 lore raw

PATCH 1/1 tty: cleanup prohibition of direct opening for unix98 pty master

cleanup hack added in v2.6.27-3203-g15582d3

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 <[email protected]>
: Signed-off-by: Linus Torvalds <[email protected]>

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().

---
 drivers/tty/pty.c    |    8 +++-----
 drivers/tty/tty_io.c |   12 ++----------
 include/linux/tty.h  |    3 +--
 3 files changed, 6 insertions(+), 17 deletions(-)
drivers/tty/pty.c +3 -5
index d8653ab..03147fa 100644
@@ -515,10 +515,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty,
 static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
 		struct inode *ptm_inode, int idx)
 {
-	struct tty_struct *tty = devpts_get_tty(ptm_inode, idx);
-	if (tty)
-		tty = tty->link;
-	return tty;
+	/* Master must be open via /dev/ptmx */
+	return ERR_PTR(-EIO);
 }
 
 /**
@@ -677,7 +675,7 @@ static int ptmx_open(struct inode *inode, struct file *filp)
 
 	mutex_lock(&tty_mutex);
 	tty_lock();
-	tty = tty_init_dev(ptm_driver, index, 1);
+	tty = tty_init_dev(ptm_driver, index);
 	mutex_unlock(&tty_mutex);
 
 	if (IS_ERR(tty)) {
drivers/tty/tty_io.c +2 -10
index 57c3743..a4fd717 100644
@@ -1365,7 +1365,6 @@ static int tty_reopen(struct tty_struct *tty)
  *	@driver: tty driver we are opening a device on
  *	@idx: device index
  *	@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
  *	could also be an active device. The pty drivers require special
@@ -1385,18 +1384,11 @@ static int tty_reopen(struct tty_struct *tty)
  * relaxed for the (most common) case of reopening a tty.
  */
 
-struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
-								int first_ok)
+struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
 {
 	struct tty_struct *tty;
 	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.
 	 * This code guarantees that either everything succeeds and the
@@ -1950,7 +1942,7 @@ retry_open:
 		if (retval)
 			tty = ERR_PTR(retval);
 	} else
-		tty = tty_init_dev(driver, index, 0);
+		tty = tty_init_dev(driver, index);
 
 	mutex_unlock(&tty_mutex);
 	if (driver)
include/linux/tty.h +1 -2
index 5dbb3cb..d3ebd76 100644
@@ -480,8 +480,7 @@ extern void free_tty_struct(struct tty_struct *tty);
 extern void initialize_tty_struct(struct tty_struct *tty,
 		struct tty_driver *driver, int idx);
 extern void deinitialize_tty_struct(struct tty_struct *tty);
-extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
-								int first_ok);
+extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx);
 extern int tty_release(struct inode *inode, struct file *filp);
 extern int tty_init_termios(struct tty_struct *tty);
 
#9 lore raw
In reply to Greg KH
Quoted 19 lines · Greg KH
Quoted 18 lines · Konstantin Khlebnikov

cleanup hack added in v2.6.27-3203-g15582d3

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<[email protected]>
: Signed-off-by: Linus Torvalds<[email protected]>

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().

Quoted 6 lines
Quoted 1 line

What tree did you make this patch against? I get fuzz warnings when applying it to the tty-next branch (it's in the linux-next releases).

Please rediff it and resend it.

Sorry for that, I did not expect such activity in tty-layer =)

Quoted 4 lines

thanks,

greg k-h