aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/tty.c
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@FreeBSD.org>2002-04-03 10:56:59 +0000
committerRuslan Ermilov <ru@FreeBSD.org>2002-04-03 10:56:59 +0000
commit12c79eb288d23bb81176fe61cad1b7a9ee4b9948 (patch)
tree9b447dfa6bfea969fc320cd5c13abf0255b96726 /sys/kern/tty.c
parent5cb87b0c599244686052ed9c550dc28e9c5844f6 (diff)
downloadsrc-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.c18
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;