diff -upr gdm-2.17.7-pre/daemon/getvt.c gdm-2.17.7-post/daemon/getvt.c --- gdm-2.17.7-pre/daemon/getvt.c 2007-02-11 23:40:19.000000000 -0600 +++ gdm-2.17.7-post/daemon/getvt.c 2007-03-20 16:25:35.000000000 -0600 @@ -90,8 +90,10 @@ get_free_vt_linux (int *vtfd) int vtno; unsigned short vtmask; struct vt_stat vtstat; + guint v_state; *vtfd = -1; + fdv = -1; do { errno = 0; @@ -101,26 +103,33 @@ get_free_vt_linux (int *vtfd) #endif , 0); } while G_UNLIKELY (errno == EINTR); - if (fd < 0) - return -1; - if (ioctl (fd, VT_GETSTATE, &vtstat) < 0) { - VE_IGNORE_EINTR (close (fd)); - return -1; - } + if (fd >= 0 && ioctl (fd, VT_GETSTATE, &vtstat) >= 0) + v_state = vtstat.v_state; + else + v_state = 0; - for (vtno = gdm_get_value_int (GDM_KEY_FIRST_VT), vtmask = 1 << vtno; - vtstat.v_state & vtmask; vtno++, vtmask <<= 1); - if (!vtmask) { - VE_IGNORE_EINTR (close (fd)); - return -1; + for (vtno = gdm_get_value_int (GDM_KEY_FIRST_VT), vtmask = 1 << vtno; vtmask; vtno++, vtmask <<= 1) { + /* Is this console in use? */ + if (v_state & vtmask) + continue; + + /* No, try to open it */ + fdv = open_vt (vtno); + if (fdv >= 0) + break; + + /* If we're here, kernel indicated that the console was free, + * but we failed to open it. Just go on to higher VTs. */ } - fdv = open_vt (vtno); - if (fdv < 0) { + if (fdv < 0) + vtno = -1; + + if (fd >= 0) { VE_IGNORE_EINTR (close (fd)); - return -1; } + *vtfd = fdv; return vtno; }