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)
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to