On Sat, Dec 19, 2009 at 06:42:12PM +0000, Ed Schouten wrote: > Author: ed > Date: Sat Dec 19 18:42:12 2009 > New Revision: 200732 > URL: http://svn.freebsd.org/changeset/base/200732 > > Log: > Let access overriding to TTYs depend on the cdev_priv, not the vnode. > > Basically this commit changes two things, which improves access to TTYs > in exceptional conditions. Basically the problem was that when you ran > jexec(8) to attach to a jail, you couldn't use /dev/tty (well, also the > node of the actual TTY, e.g. /dev/pts/X). This is very inconvenient if > you want to attach to screens quickly, use ssh(1), etc. > > The fixes: > > - Cache the cdev_priv of the controlling TTY in struct session. Change > devfs_access() to compare against the cdev_priv instead of the vnode. > This allows you to bypass UNIX permissions, even across different > mounts of devfs. > > - Extend devfs_prison_check() to unconditionally expose the device node > of the controlling TTY, even if normal prison nesting rules normally > don't allow this. This actually allows you to interact with this > device node. > > To be honest, I'm not really happy with this solution. We now have to > store three pointers to a controlling TTY (s_ttyp, s_ttyvp, s_ttydp). > In an ideal world, we should just get rid of the latter two and only use > s_ttyp, but this makes certian pieces of code very impractical (e.g. > devfs, kern_exit.c).
Note that struct devfs_dirent is available as vp->v_data, and devfs_dirent' de_cdp member contains pointer to cdev_priv. I think this would allow to remove s_ttydp.
pgp7At5GjUuEl.pgp
Description: PGP signature
