History

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

Konstantin Khlebnikov committed 14 years ago

Commit 593a27c1 parent dcd6c923 files · +6 −17Browse files

Unified · Split

3 files
  1. drivers/tty/pty.c +3 −5
  2. drivers/tty/tty_io.c +2 −10
  3. include/linux/tty.h +1 −2
drivers/tty/pty.c+3−5
@@ -515,10 +515,8 @@ static int pty_unix98_ioctl(struct tty_struct *tty, · 514 unmodified lines
515static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,515static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
516 struct inode *ptm_inode, int idx)516 struct inode *ptm_inode, int idx)
517{517{
518 struct tty_struct *tty = devpts_get_tty(ptm_inode, idx);518 /* Master must be open via /dev/ptmx */
519 if (tty)519 return ERR_PTR(-EIO);
520 tty = tty->link;
521 return tty;
522}520}
523 521
524/**522/**
@@ -677,7 +675,7 @@ static int ptmx_open(struct inode *inode, struct file *filp) · 152 unmodified lines
677 675
678 mutex_lock(&tty_mutex);676 mutex_lock(&tty_mutex);
679 tty_lock();677 tty_lock();
680 tty = tty_init_dev(ptm_driver, index, 1);678 tty = tty_init_dev(ptm_driver, index);
681 mutex_unlock(&tty_mutex);679 mutex_unlock(&tty_mutex);
682 680
683 if (IS_ERR(tty)) {681 if (IS_ERR(tty)) {
drivers/tty/tty_io.c+2−10
@@ -1365,7 +1365,6 @@ static int tty_reopen(struct tty_struct *tty) · 1364 unmodified lines
1365 * @driver: tty driver we are opening a device on1365 * @driver: tty driver we are opening a device on
1366 * @idx: device index1366 * @idx: device index
1367 * @ret_tty: returned tty structure1367 * @ret_tty: returned tty structure
1368 * @first_ok: ok to open a new device (used by ptmx)
1369 *1368 *
1370 * Prepare a tty device. This may not be a "new" clean device but1369 * Prepare a tty device. This may not be a "new" clean device but
1371 * could also be an active device. The pty drivers require special1370 * could also be an active device. The pty drivers require special
@@ -1385,18 +1384,11 @@ static int tty_reopen(struct tty_struct *tty) · 13 unmodified lines
1385 * relaxed for the (most common) case of reopening a tty.1384 * relaxed for the (most common) case of reopening a tty.
1386 */1385 */
1387 1386
1388struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,1387struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
1389 int first_ok)
1390{1388{
1391 struct tty_struct *tty;1389 struct tty_struct *tty;
1392 int retval;1390 int retval;
1393 1391
1394 /* Check if pty master is being opened multiple times */
1395 if (driver->subtype == PTY_TYPE_MASTER &&
1396 (driver->flags & TTY_DRIVER_DEVPTS_MEM) && !first_ok) {
1397 return ERR_PTR(-EIO);
1398 }
1399
1400 /*1392 /*
1401 * First time open is complex, especially for PTY devices.1393 * First time open is complex, especially for PTY devices.
1402 * This code guarantees that either everything succeeds and the1394 * This code guarantees that either everything succeeds and the
@@ -1950,7 +1942,7 @@ retry_open: · 547 unmodified lines
1950 if (retval)1942 if (retval)
1951 tty = ERR_PTR(retval);1943 tty = ERR_PTR(retval);
1952 } else1944 } else
1953 tty = tty_init_dev(driver, index, 0);1945 tty = tty_init_dev(driver, index);
1954 1946
1955 mutex_unlock(&tty_mutex);1947 mutex_unlock(&tty_mutex);
1956 if (driver)1948 if (driver)
include/linux/tty.h+1−2
@@ -480,8 +480,7 @@ extern void free_tty_struct(struct tty_struct *tty); · 479 unmodified lines
480extern void initialize_tty_struct(struct tty_struct *tty,480extern void initialize_tty_struct(struct tty_struct *tty,
481 struct tty_driver *driver, int idx);481 struct tty_driver *driver, int idx);
482extern void deinitialize_tty_struct(struct tty_struct *tty);482extern void deinitialize_tty_struct(struct tty_struct *tty);
483extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,483extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx);
484 int first_ok);
485extern int tty_release(struct inode *inode, struct file *filp);484extern int tty_release(struct inode *inode, struct file *filp);
486extern int tty_init_termios(struct tty_struct *tty);485extern int tty_init_termios(struct tty_struct *tty);
487 486