add more spltty() calls around TTY_LOCK/UNLOCK where needed

This commit is contained in:
dbj 2004-03-09 05:30:24 +00:00
parent c2309bcca6
commit 7a30c4a987
2 changed files with 58 additions and 4 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: tty.c,v 1.163 2004/03/05 07:27:22 dbj Exp $ */
/* $NetBSD: tty.c,v 1.164 2004/03/09 05:30:24 dbj Exp $ */
/*-
* Copyright (c) 1982, 1986, 1990, 1991, 1993
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.163 2004/03/05 07:27:22 dbj Exp $");
__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.164 2004/03/09 05:30:24 dbj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -677,6 +677,7 @@ int
ttyinput(int c, struct tty *tp)
{
int error;
int s;
/*
* Unless the receiver is enabled, drop incoming data.
@ -684,9 +685,11 @@ ttyinput(int c, struct tty *tp)
if (!ISSET(tp->t_cflag, CREAD))
return (0);
s = spltty();
TTY_LOCK(tp);
error = ttyinput_wlock(c, tp);
TTY_UNLOCK(tp);
splx(s);
return (error);
}
@ -1521,11 +1524,14 @@ ttylclose(struct tty *tp, int flag)
* Returns 0 if the line should be turned off, otherwise 1.
*
* Must be called at spltty().
* XXX except that it is often isn't, which should be fixed.
*/
int
ttymodem(struct tty *tp, int flag)
{
int s;
s = spltty();
TTY_LOCK(tp);
if (flag == 0) {
if (ISSET(tp->t_state, TS_CARR_ON)) {
@ -1539,6 +1545,7 @@ ttymodem(struct tty *tp, int flag)
SIGHUP);
ttyflush(tp, FREAD | FWRITE);
TTY_UNLOCK(tp);
splx(s);
return (0);
}
}
@ -1552,6 +1559,7 @@ ttymodem(struct tty *tp, int flag)
}
}
TTY_UNLOCK(tp);
splx(s);
return (1);
}
@ -1560,11 +1568,14 @@ ttymodem(struct tty *tp, int flag)
* Return argument flag, to turn off device on carrier drop.
*
* Must be called at spltty().
* XXX except that it is often isn't, which should be fixed.
*/
int
nullmodem(struct tty *tp, int flag)
{
int s;
s = spltty();
TTY_LOCK(tp);
if (flag)
SET(tp->t_state, TS_CARR_ON);
@ -1574,10 +1585,12 @@ nullmodem(struct tty *tp, int flag)
if (tp->t_session && tp->t_session->s_leader)
psignal(tp->t_session->s_leader, SIGHUP);
TTY_UNLOCK(tp);
splx(s);
return (0);
}
}
TTY_UNLOCK(tp);
splx(s);
return (1);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: tty_pty.c,v 1.74 2004/03/05 07:27:22 dbj Exp $ */
/* $NetBSD: tty_pty.c,v 1.75 2004/03/09 05:30:24 dbj Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: tty_pty.c,v 1.74 2004/03/05 07:27:22 dbj Exp $");
__KERNEL_RCSID(0, "$NetBSD: tty_pty.c,v 1.75 2004/03/09 05:30:24 dbj Exp $");
#include "opt_compat_sunos.h"
@ -301,6 +301,7 @@ ptsopen(dev, flag, devtype, p)
struct tty *tp;
int error;
int ptn = minor(dev);
int s;
if ((error = check_pty(ptn)))
return (error);
@ -322,6 +323,7 @@ ptsopen(dev, flag, devtype, p)
SET(tp->t_state, TS_CARR_ON);
if (!ISSET(flag, O_NONBLOCK)) {
s = spltty();
TTY_LOCK(tp);
while (!ISSET(tp->t_state, TS_CARR_ON)) {
tp->t_wopen++;
@ -330,10 +332,12 @@ ptsopen(dev, flag, devtype, p)
tp->t_wopen--;
if (error) {
TTY_UNLOCK(tp);
splx(s);
return (error);
}
}
TTY_UNLOCK(tp);
splx(s);
}
error = (*tp->t_linesw->l_open)(dev, tp);
ptcwakeup(tp, FREAD|FWRITE);
@ -367,6 +371,7 @@ ptsread(dev, uio, flag)
struct tty *tp = pti->pt_tty;
int error = 0;
int cc;
int s;
again:
if (pti->pt_flags & PF_REMOTE) {
@ -376,16 +381,20 @@ again:
p->p_flag & P_PPWAIT)
return (EIO);
pgsignal(p->p_pgrp, SIGTTIN, 1);
s = spltty();
TTY_LOCK(tp);
error = ttysleep(tp, (caddr_t)&lbolt,
TTIPRI | PCATCH | PNORELOCK, ttybg, 0);
splx(s);
if (error)
return (error);
}
s = spltty();
TTY_LOCK(tp);
if (tp->t_canq.c_cc == 0) {
if (flag & IO_NDELAY) {
TTY_UNLOCK(tp);
splx(s);
return (EWOULDBLOCK);
}
error = ttysleep(tp, (caddr_t)&tp->t_canq,
@ -396,7 +405,9 @@ again:
}
while(error == 0 && tp->t_canq.c_cc > 1 && uio->uio_resid > 0) {
TTY_UNLOCK(tp);
splx(s);
error = ureadc(getc(&tp->t_canq), uio);
s = spltty();
TTY_LOCK(tp);
/* Re-check terminal state here? */
}
@ -404,6 +415,7 @@ again:
(void) getc(&tp->t_canq);
cc = tp->t_canq.c_cc;
TTY_UNLOCK(tp);
splx(s);
if (cc)
return (error);
} else
@ -535,6 +547,7 @@ ptcopen(dev, flag, devtype, p)
struct tty *tp;
int error;
int ptn = minor(dev);
int s;
if ((error = check_pty(ptn)))
return (error);
@ -542,13 +555,16 @@ ptcopen(dev, flag, devtype, p)
pti = pt_softc[ptn];
tp = pti->pt_tty;
s = spltty();
TTY_LOCK(tp);
if (tp->t_oproc) {
TTY_UNLOCK(tp);
splx(s);
return (EIO);
}
tp->t_oproc = ptsstart;
TTY_UNLOCK(tp);
splx(s);
(void)(*tp->t_linesw->l_modem)(tp, 1);
CLR(tp->t_lflag, EXTPROC);
pti->pt_flags = 0;
@ -566,12 +582,15 @@ ptcclose(dev, flag, devtype, p)
{
struct pt_softc *pti = pt_softc[minor(dev)];
struct tty *tp = pti->pt_tty;
int s;
(void)(*tp->t_linesw->l_modem)(tp, 0);
CLR(tp->t_state, TS_CARR_ON);
s = spltty();
TTY_LOCK(tp);
tp->t_oproc = 0; /* mark closed */
TTY_UNLOCK(tp);
splx(s);
return (0);
}
@ -585,6 +604,7 @@ ptcread(dev, uio, flag)
struct tty *tp = pti->pt_tty;
u_char buf[BUFSIZ];
int error = 0, cc;
int s;
/*
* We want to block until the slave
@ -592,11 +612,13 @@ ptcread(dev, uio, flag)
* but if we lost the slave or we're NBIO,
* then return the appropriate error instead.
*/
s = spltty();
TTY_LOCK(tp);
for (;;) {
if (ISSET(tp->t_state, TS_ISOPEN)) {
if (pti->pt_flags & PF_PKT && pti->pt_send) {
TTY_UNLOCK(tp);
splx(s);
error = ureadc((int)pti->pt_send, uio);
if (error)
return (error);
@ -617,6 +639,7 @@ ptcread(dev, uio, flag)
}
if (pti->pt_flags & PF_UCNTL && pti->pt_ucntl) {
TTY_UNLOCK(tp);
splx(s);
error = ureadc((int)pti->pt_ucntl, uio);
if (error)
return (error);
@ -642,7 +665,9 @@ ptcread(dev, uio, flag)
if (pti->pt_flags & (PF_PKT|PF_UCNTL)) {
TTY_UNLOCK(tp);
splx(s);
error = ureadc(0, uio);
s = spltty();
TTY_LOCK(tp);
if (error == 0 && !ISSET(tp->t_state, TS_ISOPEN))
error = EIO;
@ -652,7 +677,9 @@ ptcread(dev, uio, flag)
if (cc <= 0)
break;
TTY_UNLOCK(tp);
splx(s);
error = uiomove(buf, cc, uio);
s = spltty();
TTY_LOCK(tp);
if (error == 0 && !ISSET(tp->t_state, TS_ISOPEN))
error = EIO;
@ -667,6 +694,7 @@ ptcread(dev, uio, flag)
}
out:
TTY_UNLOCK(tp);
splx(s);
return (error);
}
@ -684,8 +712,10 @@ ptcwrite(dev, uio, flag)
u_char locbuf[BUFSIZ];
int cnt = 0;
int error = 0;
int s;
again:
s = spltty();
TTY_LOCK(tp);
if (!ISSET(tp->t_state, TS_ISOPEN))
goto block;
@ -698,9 +728,11 @@ again:
cc = min(cc, TTYHOG - 1 - tp->t_canq.c_cc);
cp = locbuf;
TTY_UNLOCK(tp);
splx(s);
error = uiomove((caddr_t)cp, cc, uio);
if (error)
return (error);
s = spltty();
TTY_LOCK(tp);
/* check again for safety */
if (!ISSET(tp->t_state, TS_ISOPEN)) {
@ -723,9 +755,11 @@ again:
cc = min(uio->uio_resid, BUFSIZ);
cp = locbuf;
TTY_UNLOCK(tp);
splx(s);
error = uiomove((caddr_t)cp, cc, uio);
if (error)
return (error);
s = spltty();
TTY_LOCK(tp);
/* check again for safety */
if (!ISSET(tp->t_state, TS_ISOPEN)) {
@ -743,7 +777,9 @@ again:
* see also tty.c:ttyinput_wlock()
*/
TTY_UNLOCK(tp);
splx(s);
(*tp->t_linesw->l_rint)(*cp++, tp);
s = spltty();
TTY_LOCK(tp);
cnt++;
cc--;
@ -770,6 +806,7 @@ block:
}
error = ltsleep((caddr_t)&tp->t_rawq.c_cf, TTOPRI | PCATCH | PNORELOCK,
ttyout, 0, &tp->t_slock);
splx(s);
if (error) {
/* adjust for data copied in but not written */
uio->uio_resid += cc;
@ -779,6 +816,7 @@ block:
out:
TTY_UNLOCK(tp);
splx(s);
return (error);
}
@ -967,6 +1005,7 @@ ptyioctl(dev, cmd, data, flag, p)
const struct cdevsw *cdev;
u_char *cc = tp->t_cc;
int stop, error, sig;
int s;
cdev = cdevsw_lookup(dev);
/*
@ -1030,9 +1069,11 @@ ptyioctl(dev, cmd, data, flag, p)
pti->pt_flags |= PF_REMOTE;
else
pti->pt_flags &= ~PF_REMOTE;
s = spltty();
TTY_LOCK(tp);
ttyflush(tp, FREAD|FWRITE);
TTY_UNLOCK(tp);
splx(s);
return (0);
#ifdef COMPAT_OLDTTY