svn commit: r233661 - in head/sys: dev/syscons sys
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Mar 29 14:53:15 UTC 2012
Author: hselasky
Date: Thu Mar 29 14:53:14 2012
New Revision: 233661
URL: http://svn.freebsd.org/changeset/base/233661
Log:
Fix for NULL-pointer panic during boot, if keys are pressed too early.
MFC after: 1 week
Modified:
head/sys/dev/syscons/syscons.c
head/sys/sys/tty.h
Modified: head/sys/dev/syscons/syscons.c
==============================================================================
--- head/sys/dev/syscons/syscons.c Thu Mar 29 13:36:53 2012 (r233660)
+++ head/sys/dev/syscons/syscons.c Thu Mar 29 14:53:14 2012 (r233661)
@@ -740,7 +740,7 @@ sckbdevent(keyboard_t *thiskbd, int even
while ((c = scgetc(sc, SCGETC_NONBLOCK)) != NOKEY) {
cur_tty = SC_DEV(sc, sc->cur_scp->index);
- if (!tty_opened(cur_tty))
+ if (!tty_opened_ns(cur_tty))
continue;
if ((*sc->cur_scp->tsw->te_input)(sc->cur_scp, c, cur_tty))
@@ -1134,7 +1134,7 @@ sctty_ioctl(struct tty *tp, u_long cmd,
case VT_OPENQRY: /* return free virtual console */
for (i = sc->first_vty; i < sc->first_vty + sc->vtys; i++) {
tp = SC_DEV(sc, i);
- if (!tty_opened(tp)) {
+ if (!tty_opened_ns(tp)) {
*(int *)data = i + 1;
return 0;
}
@@ -1694,6 +1694,7 @@ sc_cnputc(struct consdev *cd, int c)
* spinlock.
*/
tp = SC_DEV(scp->sc, scp->index);
+ /* XXX "tp" can be NULL */
tty_lock(tp);
if (tty_opened(tp))
sctty_outwakeup(tp);
@@ -2414,7 +2415,7 @@ sc_switch_scr(sc_softc_t *sc, u_int next
*/
tp = SC_DEV(sc, cur_scp->index);
if ((cur_scp->index != next_scr)
- && tty_opened(tp)
+ && tty_opened_ns(tp)
&& (cur_scp->smode.mode == VT_AUTO)
&& ISGRAPHSC(cur_scp)) {
splx(s);
@@ -2431,7 +2432,7 @@ sc_switch_scr(sc_softc_t *sc, u_int next
*/
if ((sc_console == NULL) || (next_scr != sc_console->index)) {
tp = SC_DEV(sc, next_scr);
- if (!tty_opened(tp)) {
+ if (!tty_opened_ns(tp)) {
splx(s);
sc_bell(cur_scp, bios_value.bell_pitch, BELL_DURATION);
DPRINTF(5, ("error 2, requested vty isn't open!\n"));
@@ -3470,7 +3471,7 @@ next_code:
sc_draw_cursor_image(scp);
}
tp = SC_DEV(sc, scp->index);
- if (!kdb_active && tty_opened(tp))
+ if (!kdb_active && tty_opened_ns(tp))
sctty_outwakeup(tp);
#endif
}
@@ -3565,7 +3566,7 @@ next_code:
sc->first_vty + i != this_scr;
i = (i + 1)%sc->vtys) {
struct tty *tp = SC_DEV(sc, sc->first_vty + i);
- if (tty_opened(tp)) {
+ if (tty_opened_ns(tp)) {
sc_switch_scr(scp->sc, sc->first_vty + i);
break;
}
@@ -3578,7 +3579,7 @@ next_code:
sc->first_vty + i != this_scr;
i = (i + sc->vtys - 1)%sc->vtys) {
struct tty *tp = SC_DEV(sc, sc->first_vty + i);
- if (tty_opened(tp)) {
+ if (tty_opened_ns(tp)) {
sc_switch_scr(scp->sc, sc->first_vty + i);
break;
}
@@ -3774,7 +3775,7 @@ sc_paste(scr_stat *scp, const u_char *p,
u_char *rmap;
tp = SC_DEV(scp->sc, scp->sc->cur_scp->index);
- if (!tty_opened(tp))
+ if (!tty_opened_ns(tp))
return;
rmap = scp->sc->scr_rmap;
for (; count > 0; --count)
@@ -3788,7 +3789,7 @@ sc_respond(scr_stat *scp, const u_char *
struct tty *tp;
tp = SC_DEV(scp->sc, scp->sc->cur_scp->index);
- if (!tty_opened(tp))
+ if (!tty_opened_ns(tp))
return;
ttydisc_rint_simple(tp, p, count);
if (wakeup) {
@@ -3830,7 +3831,7 @@ blink_screen(void *arg)
scp->sc->blink_in_progress = 0;
mark_all(scp);
tp = SC_DEV(scp->sc, scp->index);
- if (tty_opened(tp))
+ if (tty_opened_ns(tp))
sctty_outwakeup(tp);
if (scp->sc->delayed_next_scr)
sc_switch_scr(scp->sc, scp->sc->delayed_next_scr - 1);
Modified: head/sys/sys/tty.h
==============================================================================
--- head/sys/sys/tty.h Thu Mar 29 13:36:53 2012 (r233660)
+++ head/sys/sys/tty.h Thu Mar 29 14:53:14 2012 (r233661)
@@ -197,6 +197,8 @@ void tty_hiwat_in_block(struct tty *tp);
void tty_hiwat_in_unblock(struct tty *tp);
dev_t tty_udev(struct tty *tp);
#define tty_opened(tp) ((tp)->t_flags & TF_OPENED)
+/* NULL-safe version of "tty_opened()" */
+#define tty_opened_ns(tp) ((tp) != NULL && tty_opened(tp))
#define tty_gone(tp) ((tp)->t_flags & TF_GONE)
#define tty_softc(tp) ((tp)->t_devswsoftc)
#define tty_devname(tp) devtoname((tp)->t_dev)
More information about the svn-src-head
mailing list