diff -upr gdm-2.19.5-pre/daemon/getvt.c gdm-2.19.5-post/daemon/getvt.c --- gdm-2.19.5-pre/daemon/getvt.c 2007-07-30 13:51:14.000000000 -0500 +++ gdm-2.19.5-post/daemon/getvt.c 2007-08-03 20:14:13.000000000 -0500 @@ -181,8 +181,10 @@ get_free_vt_sys (int *vtfd) int vtno; unsigned short vtmask; struct vt_stat vtstat; + guint v_state; *vtfd = -1; + fdv = -1; do { errno = 0; @@ -193,26 +195,33 @@ get_free_vt_sys (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_daemon_config_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_daemon_config_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; } Only in gdm-2.19.5-post: error.21177