diff options
author | Ruslan Ermilov <ru@FreeBSD.org> | 2002-04-03 10:56:59 +0000 |
---|---|---|
committer | Ruslan Ermilov <ru@FreeBSD.org> | 2002-04-03 10:56:59 +0000 |
commit | 12c79eb288d23bb81176fe61cad1b7a9ee4b9948 (patch) | |
tree | 9b447dfa6bfea969fc320cd5c13abf0255b96726 /sys/kern/tty.c | |
parent | 5cb87b0c599244686052ed9c550dc28e9c5844f6 (diff) | |
download | src-12c79eb288d23bb81176fe61cad1b7a9ee4b9948.tar.gz src-12c79eb288d23bb81176fe61cad1b7a9ee4b9948.zip |
Dike out a highly insecure UCONSOLE option.
TIOCCONS must be able to VOP_ACCESS() /dev/console to succeed.
Obtained from: OpenBSD
Notes
Notes:
svn path=/head/; revision=93719
Diffstat (limited to 'sys/kern/tty.c')
-rw-r--r-- | sys/kern/tty.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 3b7739dfe8bb..b698977877b9 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -68,13 +68,13 @@ */ #include "opt_compat.h" -#include "opt_uconsole.h" #include <sys/param.h> #include <sys/systm.h> #include <sys/filio.h> #include <sys/lock.h> #include <sys/mutex.h> +#include <sys/namei.h> #include <sys/sx.h> #if defined(COMPAT_43) || defined(COMPAT_SUNOS) #include <sys/ioctl_compat.h> @@ -849,13 +849,23 @@ ttioctl(tp, cmd, data, flag) } case TIOCCONS: /* become virtual console */ if (*(int *)data) { + struct nameidata nid; + if (constty && constty != tp && ISSET(constty->t_state, TS_CONNECTED)) return (EBUSY); -#ifndef UCONSOLE - if ((error = suser(td)) != 0) + + /* Ensure user can open the real console. */ + NDINIT(&nid, LOOKUP, LOCKLEAF | FOLLOW, UIO_SYSSPACE, + "/dev/console", td); + if ((error = namei(&nid)) != 0) return (error); -#endif + NDFREE(&nid, NDF_ONLY_PNBUF); + error = VOP_ACCESS(nid.ni_vp, VREAD, td->td_ucred, td); + vput(nid.ni_vp); + if (error) + return (error); + constty = tp; } else if (tp == constty) constty = NULL; |