summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorart <art@openbsd.org>2002-07-11 22:48:51 +0000
committerart <art@openbsd.org>2002-07-11 22:48:51 +0000
commit7823c95f00a881bcbe54eb06e292186da9894a90 (patch)
treee61b3f333c4e42bccd6ce732065ecca52a5281d6
parentsync (diff)
downloadwireguard-openbsd-7823c95f00a881bcbe54eb06e292186da9894a90.tar.xz
wireguard-openbsd-7823c95f00a881bcbe54eb06e292186da9894a90.zip
Make sure to protect ttypend with spltty all the time.
Implemented with paranoia.
-rw-r--r--sys/kern/tty.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index 4092140d961..be858982f4f 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.53 2002/07/03 21:19:08 miod Exp $ */
+/* $OpenBSD: tty.c,v 1.54 2002/07/11 22:48:51 art Exp $ */
/* $NetBSD: tty.c,v 1.68.4.2 1996/06/06 16:04:52 thorpej Exp $ */
/*-
@@ -236,6 +236,7 @@ ttyinput(c, tp)
register int iflag, lflag;
register u_char *cc;
int i, error;
+ int s;
add_tty_randomness(tp->t_dev << 8 | c);
/*
@@ -243,12 +244,15 @@ ttyinput(c, tp)
*/
if (!ISSET(tp->t_cflag, CREAD))
return (0);
+
/*
* If input is pending take it first.
*/
lflag = tp->t_lflag;
+ s = spltty();
if (ISSET(lflag, PENDIN))
ttypend(tp);
+ splx(s);
/*
* Gather stats.
*/
@@ -779,7 +783,9 @@ ttioctl(tp, cmd, data, flag, p)
case FIONBIO: /* set/clear non-blocking i/o */
break; /* XXX: delete. */
case FIONREAD: /* get # bytes to read */
+ s = spltty();
*(int *)data = ttnread(tp);
+ splx(s);
break;
case TIOCEXCL: /* set exclusive use of tty */
s = spltty();
@@ -1101,8 +1107,11 @@ filt_ttyread(struct knote *kn, long hint)
{
dev_t dev = (dev_t)((u_long)kn->kn_hook);
struct tty *tp = (*cdevsw[major(dev)].d_tty)(dev);
+ int s;
+ s = spltty();
kn->kn_data = ttnread(tp);
+ splx(s);
if (!ISSET(tp->t_state, CLOCAL) && !ISSET(tp->t_state, TS_CARR_ON)) {
kn->kn_flags |= EV_EOF;
return (1);
@@ -1139,6 +1148,8 @@ ttnread(tp)
{
int nread;
+ splassert(IPL_TTY);
+
if (ISSET(tp->t_lflag, PENDIN))
ttypend(tp);
nread = tp->t_canq.c_cc;