linux/drivers/tty/pty.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *  Copyright (C) 1991, 1992  Linus Torvalds
   4 *
   5 *  Added support for a Unix98-style ptmx device.
   6 *    -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
   7 *
   8 */
   9
  10#include <linux/module.h>
  11#include <linux/errno.h>
  12#include <linux/interrupt.h>
  13#include <linux/tty.h>
  14#include <linux/tty_flip.h>
  15#include <linux/fcntl.h>
  16#include <linux/sched/signal.h>
  17#include <linux/string.h>
  18#include <linux/major.h>
  19#include <linux/mm.h>
  20#include <linux/init.h>
  21#include <linux/device.h>
  22#include <linux/uaccess.h>
  23#include <linux/bitops.h>
  24#include <linux/devpts_fs.h>
  25#include <linux/slab.h>
  26#include <linux/mutex.h>
  27#include <linux/poll.h>
  28#include <linux/mount.h>
  29#include <linux/file.h>
  30#include <linux/ioctl.h>
  31#include <linux/compat.h>
  32#include "tty.h"
  33
  34#undef TTY_DEBUG_HANGUP
  35#ifdef TTY_DEBUG_HANGUP
  36# define tty_debug_hangup(tty, f, args...)      tty_debug(tty, f, ##args)
  37#else
  38# define tty_debug_hangup(tty, f, args...)      do {} while (0)
  39#endif
  40
  41#ifdef CONFIG_UNIX98_PTYS
  42static struct tty_driver *ptm_driver;
  43static struct tty_driver *pts_driver;
  44static DEFINE_MUTEX(devpts_mutex);
  45#endif
  46
  47static void pty_close(struct tty_struct *tty, struct file *filp)
  48{
  49        if (tty->driver->subtype == PTY_TYPE_MASTER)
  50                WARN_ON(tty->count > 1);
  51        else {
  52                if (tty_io_error(tty))
  53                        return;
  54                if (tty->count > 2)
  55                        return;
  56        }
  57        set_bit(TTY_IO_ERROR, &tty->flags);
  58        wake_up_interruptible(&tty->read_wait);
  59        wake_up_interruptible(&tty->write_wait);
  60        spin_lock_irq(&tty->ctrl_lock);
  61        tty->packet = 0;
  62        spin_unlock_irq(&tty->ctrl_lock);
  63        /* Review - krefs on tty_link ?? */
  64        if (!tty->link)
  65                return;
  66        set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
  67        wake_up_interruptible(&tty->link->read_wait);
  68        wake_up_interruptible(&tty->link->write_wait);
  69        if (tty->driver->subtype == PTY_TYPE_MASTER) {
  70                set_bit(TTY_OTHER_CLOSED, &tty->flags);
  71#ifdef CONFIG_UNIX98_PTYS
  72                if (tty->driver == ptm_driver) {
  73                        mutex_lock(&devpts_mutex);
  74                        if (tty->link->driver_data)
  75                                devpts_pty_kill(tty->link->driver_data);
  76                        mutex_unlock(&devpts_mutex);
  77                }
  78#endif
  79                tty_vhangup(tty->link);
  80        }
  81}
  82
  83/*
  84 * The unthrottle routine is called by the line discipline to signal
  85 * that it can receive more characters.  For PTY's, the TTY_THROTTLED
  86 * flag is always set, to force the line discipline to always call the
  87 * unthrottle routine when there are fewer than TTY_THRESHOLD_UNTHROTTLE
  88 * characters in the queue.  This is necessary since each time this
  89 * happens, we need to wake up any sleeping processes that could be
  90 * (1) trying to send data to the pty, or (2) waiting in wait_until_sent()
  91 * for the pty buffer to be drained.
  92 */
  93static void pty_unthrottle(struct tty_struct *tty)
  94{
  95        tty_wakeup(tty->link);
  96        set_bit(TTY_THROTTLED, &tty->flags);
  97}
  98
  99/**
 100 *      pty_write               -       write to a pty
 101 *      @tty: the tty we write from
 102 *      @buf: kernel buffer of data
 103 *      @c: bytes to write
 104 *
 105 *      Our "hardware" write method. Data is coming from the ldisc which
 106 *      may be in a non sleeping state. We simply throw this at the other
 107 *      end of the link as if we were an IRQ handler receiving stuff for
 108 *      the other side of the pty/tty pair.
 109 */
 110
 111static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
 112{
 113        struct tty_struct *to = tty->link;
 114        unsigned long flags;
 115
 116        if (tty->stopped)
 117                return 0;
 118
 119        if (c > 0) {
 120                spin_lock_irqsave(&to->port->lock, flags);
 121                /* Stuff the data into the input queue of the other end */
 122                c = tty_insert_flip_string(to->port, buf, c);
 123                spin_unlock_irqrestore(&to->port->lock, flags);
 124                /* And shovel */
 125                if (c)
 126                        tty_flip_buffer_push(to->port);
 127        }
 128        return c;
 129}
 130
 131/**
 132 *      pty_write_room  -       write space
 133 *      @tty: tty we are writing from
 134 *
 135 *      Report how many bytes the ldisc can send into the queue for
 136 *      the other device.
 137 */
 138
 139static int pty_write_room(struct tty_struct *tty)
 140{
 141        if (tty->stopped)
 142                return 0;
 143        return tty_buffer_space_avail(tty->link->port);
 144}
 145
 146/**
 147 *      pty_chars_in_buffer     -       characters currently in our tx queue
 148 *      @tty: our tty
 149 *
 150 *      Report how much we have in the transmit queue. As everything is
 151 *      instantly at the other end this is easy to implement.
 152 */
 153
 154static int pty_chars_in_buffer(struct tty_struct *tty)
 155{
 156        return 0;
 157}
 158
 159/* Set the lock flag on a pty */
 160static int pty_set_lock(struct tty_struct *tty, int __user *arg)
 161{
 162        int val;
 163
 164        if (get_user(val, arg))
 165                return -EFAULT;
 166        if (val)
 167                set_bit(TTY_PTY_LOCK, &tty->flags);
 168        else
 169                clear_bit(TTY_PTY_LOCK, &tty->flags);
 170        return 0;
 171}
 172
 173static int pty_get_lock(struct tty_struct *tty, int __user *arg)
 174{
 175        int locked = test_bit(TTY_PTY_LOCK, &tty->flags);
 176
 177        return put_user(locked, arg);
 178}
 179
 180/* Set the packet mode on a pty */
 181static int pty_set_pktmode(struct tty_struct *tty, int __user *arg)
 182{
 183        int pktmode;
 184
 185        if (get_user(pktmode, arg))
 186                return -EFAULT;
 187
 188        spin_lock_irq(&tty->ctrl_lock);
 189        if (pktmode) {
 190                if (!tty->packet) {
 191                        tty->link->ctrl_status = 0;
 192                        smp_mb();
 193                        tty->packet = 1;
 194                }
 195        } else
 196                tty->packet = 0;
 197        spin_unlock_irq(&tty->ctrl_lock);
 198
 199        return 0;
 200}
 201
 202/* Get the packet mode of a pty */
 203static int pty_get_pktmode(struct tty_struct *tty, int __user *arg)
 204{
 205        int pktmode = tty->packet;
 206
 207        return put_user(pktmode, arg);
 208}
 209
 210/* Send a signal to the slave */
 211static int pty_signal(struct tty_struct *tty, int sig)
 212{
 213        struct pid *pgrp;
 214
 215        if (sig != SIGINT && sig != SIGQUIT && sig != SIGTSTP)
 216                return -EINVAL;
 217
 218        if (tty->link) {
 219                pgrp = tty_get_pgrp(tty->link);
 220                if (pgrp)
 221                        kill_pgrp(pgrp, sig, 1);
 222                put_pid(pgrp);
 223        }
 224        return 0;
 225}
 226
 227static void pty_flush_buffer(struct tty_struct *tty)
 228{
 229        struct tty_struct *to = tty->link;
 230
 231        if (!to)
 232                return;
 233
 234        tty_buffer_flush(to, NULL);
 235        if (to->packet) {
 236                spin_lock_irq(&tty->ctrl_lock);
 237                tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
 238                wake_up_interruptible(&to->read_wait);
 239                spin_unlock_irq(&tty->ctrl_lock);
 240        }
 241}
 242
 243static int pty_open(struct tty_struct *tty, struct file *filp)
 244{
 245        if (!tty || !tty->link)
 246                return -ENODEV;
 247
 248        if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
 249                goto out;
 250        if (test_bit(TTY_PTY_LOCK, &tty->link->flags))
 251                goto out;
 252        if (tty->driver->subtype == PTY_TYPE_SLAVE && tty->link->count != 1)
 253                goto out;
 254
 255        clear_bit(TTY_IO_ERROR, &tty->flags);
 256        clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 257        set_bit(TTY_THROTTLED, &tty->flags);
 258        return 0;
 259
 260out:
 261        set_bit(TTY_IO_ERROR, &tty->flags);
 262        return -EIO;
 263}
 264
 265static void pty_set_termios(struct tty_struct *tty,
 266                                        struct ktermios *old_termios)
 267{
 268        /* See if packet mode change of state. */
 269        if (tty->link && tty->link->packet) {
 270                int extproc = (old_termios->c_lflag & EXTPROC) | L_EXTPROC(tty);
 271                int old_flow = ((old_termios->c_iflag & IXON) &&
 272                                (old_termios->c_cc[VSTOP] == '\023') &&
 273                                (old_termios->c_cc[VSTART] == '\021'));
 274                int new_flow = (I_IXON(tty) &&
 275                                STOP_CHAR(tty) == '\023' &&
 276                                START_CHAR(tty) == '\021');
 277                if ((old_flow != new_flow) || extproc) {
 278                        spin_lock_irq(&tty->ctrl_lock);
 279                        if (old_flow != new_flow) {
 280                                tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
 281                                if (new_flow)
 282                                        tty->ctrl_status |= TIOCPKT_DOSTOP;
 283                                else
 284                                        tty->ctrl_status |= TIOCPKT_NOSTOP;
 285                        }
 286                        if (extproc)
 287                                tty->ctrl_status |= TIOCPKT_IOCTL;
 288                        spin_unlock_irq(&tty->ctrl_lock);
 289                        wake_up_interruptible(&tty->link->read_wait);
 290                }
 291        }
 292
 293        tty->termios.c_cflag &= ~(CSIZE | PARENB);
 294        tty->termios.c_cflag |= (CS8 | CREAD);
 295}
 296
 297/**
 298 *      pty_do_resize           -       resize event
 299 *      @tty: tty being resized
 300 *      @ws: window size being set.
 301 *
 302 *      Update the termios variables and send the necessary signals to
 303 *      peform a terminal resize correctly
 304 */
 305
 306static int pty_resize(struct tty_struct *tty,  struct winsize *ws)
 307{
 308        struct pid *pgrp, *rpgrp;
 309        struct tty_struct *pty = tty->link;
 310
 311        /* For a PTY we need to lock the tty side */
 312        mutex_lock(&tty->winsize_mutex);
 313        if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
 314                goto done;
 315
 316        /* Signal the foreground process group of both ptys */
 317        pgrp = tty_get_pgrp(tty);
 318        rpgrp = tty_get_pgrp(pty);
 319
 320        if (pgrp)
 321                kill_pgrp(pgrp, SIGWINCH, 1);
 322        if (rpgrp != pgrp && rpgrp)
 323                kill_pgrp(rpgrp, SIGWINCH, 1);
 324
 325        put_pid(pgrp);
 326        put_pid(rpgrp);
 327
 328        tty->winsize = *ws;
 329        pty->winsize = *ws;     /* Never used so will go away soon */
 330done:
 331        mutex_unlock(&tty->winsize_mutex);
 332        return 0;
 333}
 334
 335/**
 336 *      pty_start - start() handler
 337 *      pty_stop  - stop() handler
 338 *      @tty: tty being flow-controlled
 339 *
 340 *      Propagates the TIOCPKT status to the master pty.
 341 *
 342 *      NB: only the master pty can be in packet mode so only the slave
 343 *          needs start()/stop() handlers
 344 */
 345static void pty_start(struct tty_struct *tty)
 346{
 347        unsigned long flags;
 348
 349        if (tty->link && tty->link->packet) {
 350                spin_lock_irqsave(&tty->ctrl_lock, flags);
 351                tty->ctrl_status &= ~TIOCPKT_STOP;
 352                tty->ctrl_status |= TIOCPKT_START;
 353                spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 354                wake_up_interruptible_poll(&tty->link->read_wait, EPOLLIN);
 355        }
 356}
 357
 358static void pty_stop(struct tty_struct *tty)
 359{
 360        unsigned long flags;
 361
 362        if (tty->link && tty->link->packet) {
 363                spin_lock_irqsave(&tty->ctrl_lock, flags);
 364                tty->ctrl_status &= ~TIOCPKT_START;
 365                tty->ctrl_status |= TIOCPKT_STOP;
 366                spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 367                wake_up_interruptible_poll(&tty->link->read_wait, EPOLLIN);
 368        }
 369}
 370
 371/**
 372 *      pty_common_install              -       set up the pty pair
 373 *      @driver: the pty driver
 374 *      @tty: the tty being instantiated
 375 *      @legacy: true if this is BSD style
 376 *
 377 *      Perform the initial set up for the tty/pty pair. Called from the
 378 *      tty layer when the port is first opened.
 379 *
 380 *      Locking: the caller must hold the tty_mutex
 381 */
 382static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
 383                bool legacy)
 384{
 385        struct tty_struct *o_tty;
 386        struct tty_port *ports[2];
 387        int idx = tty->index;
 388        int retval = -ENOMEM;
 389
 390        /* Opening the slave first has always returned -EIO */
 391        if (driver->subtype != PTY_TYPE_MASTER)
 392                return -EIO;
 393
 394        ports[0] = kmalloc(sizeof **ports, GFP_KERNEL);
 395        ports[1] = kmalloc(sizeof **ports, GFP_KERNEL);
 396        if (!ports[0] || !ports[1])
 397                goto err;
 398        if (!try_module_get(driver->other->owner)) {
 399                /* This cannot in fact currently happen */
 400                goto err;
 401        }
 402        o_tty = alloc_tty_struct(driver->other, idx);
 403        if (!o_tty)
 404                goto err_put_module;
 405
 406        tty_set_lock_subclass(o_tty);
 407        lockdep_set_subclass(&o_tty->termios_rwsem, TTY_LOCK_SLAVE);
 408
 409        if (legacy) {
 410                /* We always use new tty termios data so we can do this
 411                   the easy way .. */
 412                tty_init_termios(tty);
 413                tty_init_termios(o_tty);
 414
 415                driver->other->ttys[idx] = o_tty;
 416                driver->ttys[idx] = tty;
 417        } else {
 418                memset(&tty->termios_locked, 0, sizeof(tty->termios_locked));
 419                tty->termios = driver->init_termios;
 420                memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked));
 421                o_tty->termios = driver->other->init_termios;
 422        }
 423
 424        /*
 425         * Everything allocated ... set up the o_tty structure.
 426         */
 427        tty_driver_kref_get(driver->other);
 428        /* Establish the links in both directions */
 429        tty->link   = o_tty;
 430        o_tty->link = tty;
 431        tty_port_init(ports[0]);
 432        tty_port_init(ports[1]);
 433        tty_buffer_set_limit(ports[0], 8192);
 434        tty_buffer_set_limit(ports[1], 8192);
 435        o_tty->port = ports[0];
 436        tty->port = ports[1];
 437        o_tty->port->itty = o_tty;
 438
 439        tty_buffer_set_lock_subclass(o_tty->port);
 440
 441        tty_driver_kref_get(driver);
 442        tty->count++;
 443        o_tty->count++;
 444        return 0;
 445
 446err_put_module:
 447        module_put(driver->other->owner);
 448err:
 449        kfree(ports[0]);
 450        kfree(ports[1]);
 451        return retval;
 452}
 453
 454static void pty_cleanup(struct tty_struct *tty)
 455{
 456        tty_port_put(tty->port);
 457}
 458
 459/* Traditional BSD devices */
 460#ifdef CONFIG_LEGACY_PTYS
 461
 462static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
 463{
 464        return pty_common_install(driver, tty, true);
 465}
 466
 467static void pty_remove(struct tty_driver *driver, struct tty_struct *tty)
 468{
 469        struct tty_struct *pair = tty->link;
 470
 471        driver->ttys[tty->index] = NULL;
 472        if (pair)
 473                pair->driver->ttys[pair->index] = NULL;
 474}
 475
 476static int pty_bsd_ioctl(struct tty_struct *tty,
 477                         unsigned int cmd, unsigned long arg)
 478{
 479        switch (cmd) {
 480        case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 481                return pty_set_lock(tty, (int __user *) arg);
 482        case TIOCGPTLCK: /* Get PT Lock status */
 483                return pty_get_lock(tty, (int __user *)arg);
 484        case TIOCPKT: /* Set PT packet mode */
 485                return pty_set_pktmode(tty, (int __user *)arg);
 486        case TIOCGPKT: /* Get PT packet mode */
 487                return pty_get_pktmode(tty, (int __user *)arg);
 488        case TIOCSIG:    /* Send signal to other side of pty */
 489                return pty_signal(tty, (int) arg);
 490        case TIOCGPTN: /* TTY returns ENOTTY, but glibc expects EINVAL here */
 491                return -EINVAL;
 492        }
 493        return -ENOIOCTLCMD;
 494}
 495
 496#ifdef CONFIG_COMPAT
 497static long pty_bsd_compat_ioctl(struct tty_struct *tty,
 498                                 unsigned int cmd, unsigned long arg)
 499{
 500        /*
 501         * PTY ioctls don't require any special translation between 32-bit and
 502         * 64-bit userspace, they are already compatible.
 503         */
 504        return pty_bsd_ioctl(tty, cmd, (unsigned long)compat_ptr(arg));
 505}
 506#else
 507#define pty_bsd_compat_ioctl NULL
 508#endif
 509
 510static int legacy_count = CONFIG_LEGACY_PTY_COUNT;
 511/*
 512 * not really modular, but the easiest way to keep compat with existing
 513 * bootargs behaviour is to continue using module_param here.
 514 */
 515module_param(legacy_count, int, 0);
 516
 517/*
 518 * The master side of a pty can do TIOCSPTLCK and thus
 519 * has pty_bsd_ioctl.
 520 */
 521static const struct tty_operations master_pty_ops_bsd = {
 522        .install = pty_install,
 523        .open = pty_open,
 524        .close = pty_close,
 525        .write = pty_write,
 526        .write_room = pty_write_room,
 527        .flush_buffer = pty_flush_buffer,
 528        .chars_in_buffer = pty_chars_in_buffer,
 529        .unthrottle = pty_unthrottle,
 530        .ioctl = pty_bsd_ioctl,
 531        .compat_ioctl = pty_bsd_compat_ioctl,
 532        .cleanup = pty_cleanup,
 533        .resize = pty_resize,
 534        .remove = pty_remove
 535};
 536
 537static const struct tty_operations slave_pty_ops_bsd = {
 538        .install = pty_install,
 539        .open = pty_open,
 540        .close = pty_close,
 541        .write = pty_write,
 542        .write_room = pty_write_room,
 543        .flush_buffer = pty_flush_buffer,
 544        .chars_in_buffer = pty_chars_in_buffer,
 545        .unthrottle = pty_unthrottle,
 546        .set_termios = pty_set_termios,
 547        .cleanup = pty_cleanup,
 548        .resize = pty_resize,
 549        .start = pty_start,
 550        .stop = pty_stop,
 551        .remove = pty_remove
 552};
 553
 554static void __init legacy_pty_init(void)
 555{
 556        struct tty_driver *pty_driver, *pty_slave_driver;
 557
 558        if (legacy_count <= 0)
 559                return;
 560
 561        pty_driver = tty_alloc_driver(legacy_count,
 562                        TTY_DRIVER_RESET_TERMIOS |
 563                        TTY_DRIVER_REAL_RAW |
 564                        TTY_DRIVER_DYNAMIC_ALLOC);
 565        if (IS_ERR(pty_driver))
 566                panic("Couldn't allocate pty driver");
 567
 568        pty_slave_driver = tty_alloc_driver(legacy_count,
 569                        TTY_DRIVER_RESET_TERMIOS |
 570                        TTY_DRIVER_REAL_RAW |
 571                        TTY_DRIVER_DYNAMIC_ALLOC);
 572        if (IS_ERR(pty_slave_driver))
 573                panic("Couldn't allocate pty slave driver");
 574
 575        pty_driver->driver_name = "pty_master";
 576        pty_driver->name = "pty";
 577        pty_driver->major = PTY_MASTER_MAJOR;
 578        pty_driver->minor_start = 0;
 579        pty_driver->type = TTY_DRIVER_TYPE_PTY;
 580        pty_driver->subtype = PTY_TYPE_MASTER;
 581        pty_driver->init_termios = tty_std_termios;
 582        pty_driver->init_termios.c_iflag = 0;
 583        pty_driver->init_termios.c_oflag = 0;
 584        pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 585        pty_driver->init_termios.c_lflag = 0;
 586        pty_driver->init_termios.c_ispeed = 38400;
 587        pty_driver->init_termios.c_ospeed = 38400;
 588        pty_driver->other = pty_slave_driver;
 589        tty_set_operations(pty_driver, &master_pty_ops_bsd);
 590
 591        pty_slave_driver->driver_name = "pty_slave";
 592        pty_slave_driver->name = "ttyp";
 593        pty_slave_driver->major = PTY_SLAVE_MAJOR;
 594        pty_slave_driver->minor_start = 0;
 595        pty_slave_driver->type = TTY_DRIVER_TYPE_PTY;
 596        pty_slave_driver->subtype = PTY_TYPE_SLAVE;
 597        pty_slave_driver->init_termios = tty_std_termios;
 598        pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 599        pty_slave_driver->init_termios.c_ispeed = 38400;
 600        pty_slave_driver->init_termios.c_ospeed = 38400;
 601        pty_slave_driver->other = pty_driver;
 602        tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd);
 603
 604        if (tty_register_driver(pty_driver))
 605                panic("Couldn't register pty driver");
 606        if (tty_register_driver(pty_slave_driver))
 607                panic("Couldn't register pty slave driver");
 608}
 609#else
 610static inline void legacy_pty_init(void) { }
 611#endif
 612
 613/* Unix98 devices */
 614#ifdef CONFIG_UNIX98_PTYS
 615static struct cdev ptmx_cdev;
 616
 617/**
 618 *      ptm_open_peer - open the peer of a pty
 619 *      @master: the open struct file of the ptmx device node
 620 *      @tty: the master of the pty being opened
 621 *      @flags: the flags for open
 622 *
 623 *      Provide a race free way for userspace to open the slave end of a pty
 624 *      (where they have the master fd and cannot access or trust the mount
 625 *      namespace /dev/pts was mounted inside).
 626 */
 627int ptm_open_peer(struct file *master, struct tty_struct *tty, int flags)
 628{
 629        int fd = -1;
 630        struct file *filp;
 631        int retval = -EINVAL;
 632        struct path path;
 633
 634        if (tty->driver != ptm_driver)
 635                return -EIO;
 636
 637        fd = get_unused_fd_flags(flags);
 638        if (fd < 0) {
 639                retval = fd;
 640                goto err;
 641        }
 642
 643        /* Compute the slave's path */
 644        path.mnt = devpts_mntget(master, tty->driver_data);
 645        if (IS_ERR(path.mnt)) {
 646                retval = PTR_ERR(path.mnt);
 647                goto err_put;
 648        }
 649        path.dentry = tty->link->driver_data;
 650
 651        filp = dentry_open(&path, flags, current_cred());
 652        mntput(path.mnt);
 653        if (IS_ERR(filp)) {
 654                retval = PTR_ERR(filp);
 655                goto err_put;
 656        }
 657
 658        fd_install(fd, filp);
 659        return fd;
 660
 661err_put:
 662        put_unused_fd(fd);
 663err:
 664        return retval;
 665}
 666
 667static int pty_unix98_ioctl(struct tty_struct *tty,
 668                            unsigned int cmd, unsigned long arg)
 669{
 670        switch (cmd) {
 671        case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 672                return pty_set_lock(tty, (int __user *)arg);
 673        case TIOCGPTLCK: /* Get PT Lock status */
 674                return pty_get_lock(tty, (int __user *)arg);
 675        case TIOCPKT: /* Set PT packet mode */
 676                return pty_set_pktmode(tty, (int __user *)arg);
 677        case TIOCGPKT: /* Get PT packet mode */
 678                return pty_get_pktmode(tty, (int __user *)arg);
 679        case TIOCGPTN: /* Get PT Number */
 680                return put_user(tty->index, (unsigned int __user *)arg);
 681        case TIOCSIG:    /* Send signal to other side of pty */
 682                return pty_signal(tty, (int) arg);
 683        }
 684
 685        return -ENOIOCTLCMD;
 686}
 687
 688#ifdef CONFIG_COMPAT
 689static long pty_unix98_compat_ioctl(struct tty_struct *tty,
 690                                 unsigned int cmd, unsigned long arg)
 691{
 692        /*
 693         * PTY ioctls don't require any special translation between 32-bit and
 694         * 64-bit userspace, they are already compatible.
 695         */
 696        return pty_unix98_ioctl(tty, cmd,
 697                cmd == TIOCSIG ? arg : (unsigned long)compat_ptr(arg));
 698}
 699#else
 700#define pty_unix98_compat_ioctl NULL
 701#endif
 702
 703/**
 704 *      ptm_unix98_lookup       -       find a pty master
 705 *      @driver: ptm driver
 706 *      @file: unused
 707 *      @idx: tty index
 708 *
 709 *      Look up a pty master device. Called under the tty_mutex for now.
 710 *      This provides our locking.
 711 */
 712
 713static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
 714                struct file *file, int idx)
 715{
 716        /* Master must be open via /dev/ptmx */
 717        return ERR_PTR(-EIO);
 718}
 719
 720/**
 721 *      pts_unix98_lookup       -       find a pty slave
 722 *      @driver: pts driver
 723 *      @file: file pointer to tty
 724 *      @idx: tty index
 725 *
 726 *      Look up a pty master device. Called under the tty_mutex for now.
 727 *      This provides our locking for the tty pointer.
 728 */
 729
 730static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
 731                struct file *file, int idx)
 732{
 733        struct tty_struct *tty;
 734
 735        mutex_lock(&devpts_mutex);
 736        tty = devpts_get_priv(file->f_path.dentry);
 737        mutex_unlock(&devpts_mutex);
 738        /* Master must be open before slave */
 739        if (!tty)
 740                return ERR_PTR(-EIO);
 741        return tty;
 742}
 743
 744static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
 745{
 746        return pty_common_install(driver, tty, false);
 747}
 748
 749/* this is called once with whichever end is closed last */
 750static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
 751{
 752        struct pts_fs_info *fsi;
 753
 754        if (tty->driver->subtype == PTY_TYPE_MASTER)
 755                fsi = tty->driver_data;
 756        else
 757                fsi = tty->link->driver_data;
 758
 759        if (fsi) {
 760                devpts_kill_index(fsi, tty->index);
 761                devpts_release(fsi);
 762        }
 763}
 764
 765static void pty_show_fdinfo(struct tty_struct *tty, struct seq_file *m)
 766{
 767        seq_printf(m, "tty-index:\t%d\n", tty->index);
 768}
 769
 770static const struct tty_operations ptm_unix98_ops = {
 771        .lookup = ptm_unix98_lookup,
 772        .install = pty_unix98_install,
 773        .remove = pty_unix98_remove,
 774        .open = pty_open,
 775        .close = pty_close,
 776        .write = pty_write,
 777        .write_room = pty_write_room,
 778        .flush_buffer = pty_flush_buffer,
 779        .chars_in_buffer = pty_chars_in_buffer,
 780        .unthrottle = pty_unthrottle,
 781        .ioctl = pty_unix98_ioctl,
 782        .compat_ioctl = pty_unix98_compat_ioctl,
 783        .resize = pty_resize,
 784        .cleanup = pty_cleanup,
 785        .show_fdinfo = pty_show_fdinfo,
 786};
 787
 788static const struct tty_operations pty_unix98_ops = {
 789        .lookup = pts_unix98_lookup,
 790        .install = pty_unix98_install,
 791        .remove = pty_unix98_remove,
 792        .open = pty_open,
 793        .close = pty_close,
 794        .write = pty_write,
 795        .write_room = pty_write_room,
 796        .flush_buffer = pty_flush_buffer,
 797        .chars_in_buffer = pty_chars_in_buffer,
 798        .unthrottle = pty_unthrottle,
 799        .set_termios = pty_set_termios,
 800        .start = pty_start,
 801        .stop = pty_stop,
 802        .cleanup = pty_cleanup,
 803};
 804
 805/**
 806 *      ptmx_open               -       open a unix 98 pty master
 807 *      @inode: inode of device file
 808 *      @filp: file pointer to tty
 809 *
 810 *      Allocate a unix98 pty master device from the ptmx driver.
 811 *
 812 *      Locking: tty_mutex protects the init_dev work. tty->count should
 813 *              protect the rest.
 814 *              allocated_ptys_lock handles the list of free pty numbers
 815 */
 816
 817static int ptmx_open(struct inode *inode, struct file *filp)
 818{
 819        struct pts_fs_info *fsi;
 820        struct tty_struct *tty;
 821        struct dentry *dentry;
 822        int retval;
 823        int index;
 824
 825        nonseekable_open(inode, filp);
 826
 827        /* We refuse fsnotify events on ptmx, since it's a shared resource */
 828        filp->f_mode |= FMODE_NONOTIFY;
 829
 830        retval = tty_alloc_file(filp);
 831        if (retval)
 832                return retval;
 833
 834        fsi = devpts_acquire(filp);
 835        if (IS_ERR(fsi)) {
 836                retval = PTR_ERR(fsi);
 837                goto out_free_file;
 838        }
 839
 840        /* find a device that is not in use. */
 841        mutex_lock(&devpts_mutex);
 842        index = devpts_new_index(fsi);
 843        mutex_unlock(&devpts_mutex);
 844
 845        retval = index;
 846        if (index < 0)
 847                goto out_put_fsi;
 848
 849
 850        mutex_lock(&tty_mutex);
 851        tty = tty_init_dev(ptm_driver, index);
 852        /* The tty returned here is locked so we can safely
 853           drop the mutex */
 854        mutex_unlock(&tty_mutex);
 855
 856        retval = PTR_ERR(tty);
 857        if (IS_ERR(tty))
 858                goto out;
 859
 860        /*
 861         * From here on out, the tty is "live", and the index and
 862         * fsi will be killed/put by the tty_release()
 863         */
 864        set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
 865        tty->driver_data = fsi;
 866
 867        tty_add_file(tty, filp);
 868
 869        dentry = devpts_pty_new(fsi, index, tty->link);
 870        if (IS_ERR(dentry)) {
 871                retval = PTR_ERR(dentry);
 872                goto err_release;
 873        }
 874        tty->link->driver_data = dentry;
 875
 876        retval = ptm_driver->ops->open(tty, filp);
 877        if (retval)
 878                goto err_release;
 879
 880        tty_debug_hangup(tty, "opening (count=%d)\n", tty->count);
 881
 882        tty_unlock(tty);
 883        return 0;
 884err_release:
 885        tty_unlock(tty);
 886        // This will also put-ref the fsi
 887        tty_release(inode, filp);
 888        return retval;
 889out:
 890        devpts_kill_index(fsi, index);
 891out_put_fsi:
 892        devpts_release(fsi);
 893out_free_file:
 894        tty_free_file(filp);
 895        return retval;
 896}
 897
 898static struct file_operations ptmx_fops __ro_after_init;
 899
 900static void __init unix98_pty_init(void)
 901{
 902        ptm_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
 903                        TTY_DRIVER_RESET_TERMIOS |
 904                        TTY_DRIVER_REAL_RAW |
 905                        TTY_DRIVER_DYNAMIC_DEV |
 906                        TTY_DRIVER_DEVPTS_MEM |
 907                        TTY_DRIVER_DYNAMIC_ALLOC);
 908        if (IS_ERR(ptm_driver))
 909                panic("Couldn't allocate Unix98 ptm driver");
 910        pts_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
 911                        TTY_DRIVER_RESET_TERMIOS |
 912                        TTY_DRIVER_REAL_RAW |
 913                        TTY_DRIVER_DYNAMIC_DEV |
 914                        TTY_DRIVER_DEVPTS_MEM |
 915                        TTY_DRIVER_DYNAMIC_ALLOC);
 916        if (IS_ERR(pts_driver))
 917                panic("Couldn't allocate Unix98 pts driver");
 918
 919        ptm_driver->driver_name = "pty_master";
 920        ptm_driver->name = "ptm";
 921        ptm_driver->major = UNIX98_PTY_MASTER_MAJOR;
 922        ptm_driver->minor_start = 0;
 923        ptm_driver->type = TTY_DRIVER_TYPE_PTY;
 924        ptm_driver->subtype = PTY_TYPE_MASTER;
 925        ptm_driver->init_termios = tty_std_termios;
 926        ptm_driver->init_termios.c_iflag = 0;
 927        ptm_driver->init_termios.c_oflag = 0;
 928        ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 929        ptm_driver->init_termios.c_lflag = 0;
 930        ptm_driver->init_termios.c_ispeed = 38400;
 931        ptm_driver->init_termios.c_ospeed = 38400;
 932        ptm_driver->other = pts_driver;
 933        tty_set_operations(ptm_driver, &ptm_unix98_ops);
 934
 935        pts_driver->driver_name = "pty_slave";
 936        pts_driver->name = "pts";
 937        pts_driver->major = UNIX98_PTY_SLAVE_MAJOR;
 938        pts_driver->minor_start = 0;
 939        pts_driver->type = TTY_DRIVER_TYPE_PTY;
 940        pts_driver->subtype = PTY_TYPE_SLAVE;
 941        pts_driver->init_termios = tty_std_termios;
 942        pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 943        pts_driver->init_termios.c_ispeed = 38400;
 944        pts_driver->init_termios.c_ospeed = 38400;
 945        pts_driver->other = ptm_driver;
 946        tty_set_operations(pts_driver, &pty_unix98_ops);
 947
 948        if (tty_register_driver(ptm_driver))
 949                panic("Couldn't register Unix98 ptm driver");
 950        if (tty_register_driver(pts_driver))
 951                panic("Couldn't register Unix98 pts driver");
 952
 953        /* Now create the /dev/ptmx special device */
 954        tty_default_fops(&ptmx_fops);
 955        ptmx_fops.open = ptmx_open;
 956
 957        cdev_init(&ptmx_cdev, &ptmx_fops);
 958        if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
 959            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
 960                panic("Couldn't register /dev/ptmx driver");
 961        device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
 962}
 963
 964#else
 965static inline void unix98_pty_init(void) { }
 966#endif
 967
 968static int __init pty_init(void)
 969{
 970        legacy_pty_init();
 971        unix98_pty_init();
 972        return 0;
 973}
 974device_initcall(pty_init);
 975