|
@@ -448,48 +448,6 @@ err:
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * pty_open_peer - open the peer of a pty
|
|
|
- * @tty: the peer of the pty being opened
|
|
|
- *
|
|
|
- * Open the cached dentry in tty->link, providing a safe way for userspace
|
|
|
- * to get the slave end of a pty (where they have the master fd and cannot
|
|
|
- * access or trust the mount namespace /dev/pts was mounted inside).
|
|
|
- */
|
|
|
-static struct file *pty_open_peer(struct tty_struct *tty, int flags)
|
|
|
-{
|
|
|
- if (tty->driver->subtype != PTY_TYPE_MASTER)
|
|
|
- return ERR_PTR(-EIO);
|
|
|
- return dentry_open(tty->link->driver_data, flags, current_cred());
|
|
|
-}
|
|
|
-
|
|
|
-static int pty_get_peer(struct tty_struct *tty, int flags)
|
|
|
-{
|
|
|
- int fd = -1;
|
|
|
- struct file *filp = NULL;
|
|
|
- int retval = -EINVAL;
|
|
|
-
|
|
|
- fd = get_unused_fd_flags(0);
|
|
|
- if (fd < 0) {
|
|
|
- retval = fd;
|
|
|
- goto err;
|
|
|
- }
|
|
|
-
|
|
|
- filp = pty_open_peer(tty, flags);
|
|
|
- if (IS_ERR(filp)) {
|
|
|
- retval = PTR_ERR(filp);
|
|
|
- goto err_put;
|
|
|
- }
|
|
|
-
|
|
|
- fd_install(fd, filp);
|
|
|
- return fd;
|
|
|
-
|
|
|
-err_put:
|
|
|
- put_unused_fd(fd);
|
|
|
-err:
|
|
|
- return retval;
|
|
|
-}
|
|
|
-
|
|
|
static void pty_cleanup(struct tty_struct *tty)
|
|
|
{
|
|
|
tty_port_put(tty->port);
|
|
@@ -646,9 +604,50 @@ static inline void legacy_pty_init(void) { }
|
|
|
|
|
|
/* Unix98 devices */
|
|
|
#ifdef CONFIG_UNIX98_PTYS
|
|
|
-
|
|
|
static struct cdev ptmx_cdev;
|
|
|
|
|
|
+/**
|
|
|
+ * pty_open_peer - open the peer of a pty
|
|
|
+ * @tty: the peer of the pty being opened
|
|
|
+ *
|
|
|
+ * Open the cached dentry in tty->link, providing a safe way for userspace
|
|
|
+ * to get the slave end of a pty (where they have the master fd and cannot
|
|
|
+ * access or trust the mount namespace /dev/pts was mounted inside).
|
|
|
+ */
|
|
|
+static struct file *pty_open_peer(struct tty_struct *tty, int flags)
|
|
|
+{
|
|
|
+ if (tty->driver->subtype != PTY_TYPE_MASTER)
|
|
|
+ return ERR_PTR(-EIO);
|
|
|
+ return dentry_open(tty->link->driver_data, flags, current_cred());
|
|
|
+}
|
|
|
+
|
|
|
+static int pty_get_peer(struct tty_struct *tty, int flags)
|
|
|
+{
|
|
|
+ int fd = -1;
|
|
|
+ struct file *filp = NULL;
|
|
|
+ int retval = -EINVAL;
|
|
|
+
|
|
|
+ fd = get_unused_fd_flags(0);
|
|
|
+ if (fd < 0) {
|
|
|
+ retval = fd;
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
+ filp = pty_open_peer(tty, flags);
|
|
|
+ if (IS_ERR(filp)) {
|
|
|
+ retval = PTR_ERR(filp);
|
|
|
+ goto err_put;
|
|
|
+ }
|
|
|
+
|
|
|
+ fd_install(fd, filp);
|
|
|
+ return fd;
|
|
|
+
|
|
|
+err_put:
|
|
|
+ put_unused_fd(fd);
|
|
|
+err:
|
|
|
+ return retval;
|
|
|
+}
|
|
|
+
|
|
|
static int pty_unix98_ioctl(struct tty_struct *tty,
|
|
|
unsigned int cmd, unsigned long arg)
|
|
|
{
|