311fc65c9f
The implementation of TIOCGPTPEER has two issues. When /dev/ptmx (as opposed to /dev/pts/ptmx) is opened the wrong vfsmount is passed to dentry_open. Which results in the kernel displaying the wrong pathname for the peer. The second is simply by caching the vfsmount and dentry of the peer it leaves them open, in a way they were not previously Which because of the inreased reference counts can cause unnecessary behaviour differences resulting in regressions. To fix these move the ioctl into tty_io.c at a generic level allowing the ioctl to have access to the struct file on which the ioctl is being called. This allows the path of the slave to be derived when opening the slave through TIOCGPTPEER instead of requiring the path to the slave be cached. Thus removing the need for caching the path. A new function devpts_ptmx_path is factored out of devpts_acquire and used to implement a function devpts_mntget. The new function devpts_mntget takes a filp to perform the lookup on and fsi so that it can confirm that the superblock that is found by devpts_ptmx_path is the proper superblock. v2: Lots of fixes to make the code actually work v3: Suggestions by Linus - Removed the unnecessary initialization of filp in ptm_open_peer - Simplified devpts_ptmx_path as gotos are no longer required [ This is the fix for the issue that was reverted in commit143c97cc65
, but this time without breaking 'pbuilder' due to increased reference counts - Linus ] Fixes:54ebbfb160
("tty: add TIOCGPTPEER ioctl") Reported-by: Christian Brauner <christian.brauner@canonical.com> Reported-and-tested-by: Stefan Lippers-Hollmann <s.l-h@gmx.de> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
48 lines
1.3 KiB
C
48 lines
1.3 KiB
C
/* -*- linux-c -*- --------------------------------------------------------- *
|
|
*
|
|
* linux/include/linux/devpts_fs.h
|
|
*
|
|
* Copyright 1998-2004 H. Peter Anvin -- All Rights Reserved
|
|
*
|
|
* This file is part of the Linux kernel and is made available under
|
|
* the terms of the GNU General Public License, version 2, or at your
|
|
* option, any later version, incorporated herein by reference.
|
|
*
|
|
* ------------------------------------------------------------------------- */
|
|
|
|
#ifndef _LINUX_DEVPTS_FS_H
|
|
#define _LINUX_DEVPTS_FS_H
|
|
|
|
#include <linux/errno.h>
|
|
|
|
#ifdef CONFIG_UNIX98_PTYS
|
|
|
|
struct pts_fs_info;
|
|
|
|
struct vfsmount *devpts_mntget(struct file *, struct pts_fs_info *);
|
|
struct pts_fs_info *devpts_acquire(struct file *);
|
|
void devpts_release(struct pts_fs_info *);
|
|
|
|
int devpts_new_index(struct pts_fs_info *);
|
|
void devpts_kill_index(struct pts_fs_info *, int);
|
|
|
|
/* mknod in devpts */
|
|
struct dentry *devpts_pty_new(struct pts_fs_info *, int, void *);
|
|
/* get private structure */
|
|
void *devpts_get_priv(struct dentry *);
|
|
/* unlink */
|
|
void devpts_pty_kill(struct dentry *);
|
|
|
|
/* in pty.c */
|
|
int ptm_open_peer(struct file *master, struct tty_struct *tty, int flags);
|
|
|
|
#else
|
|
static inline int
|
|
ptm_open_peer(struct file *master, struct tty_struct *tty, int flags)
|
|
{
|
|
return -EIO;
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif /* _LINUX_DEVPTS_FS_H */
|