From ae670dad61d0e714d076ece40302fe694d1bd382 Mon Sep 17 00:00:00 2001 From: Maksim Yevmenkin Date: Sun, 16 Nov 2008 22:39:04 +0000 Subject: [PATCH] More locking for syscons(4). This should prevent races with sckbdevent(). PR: kern/127446 Submitted by: Eygene Ryabinkin rea-fbsd at codelabs dot ru --- sys/dev/syscons/syscons.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index 37b08b6b24e..90b5afaa2dc 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -1572,6 +1572,7 @@ sccngetch(int flags) int s = spltty(); /* block sckbdevent and scrn_timer while we poll */ int c; + mtx_lock(&Giant); /* assert(sc_console != NULL) */ /* @@ -1583,11 +1584,13 @@ sccngetch(int flags) sccnupdate(scp); if (fkeycp < fkey.len) { + mtx_unlock(&Giant); splx(s); return fkey.str[fkeycp++]; } if (scp->sc->kbd == NULL) { + mtx_unlock(&Giant); splx(s); return -1; } @@ -1610,6 +1613,7 @@ sccngetch(int flags) scp->kbd_mode = cur_mode; kbdd_ioctl(scp->sc->kbd, KDSKBMODE, (caddr_t)&scp->kbd_mode); kbdd_disable(scp->sc->kbd); + mtx_unlock(&Giant); splx(s); switch (KEYFLAGS(c)) {