summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/gdm-session-worker.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index f2581ae0..b97c688a 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -963,6 +963,32 @@ _get_xauth_for_pam (const char *x11_authority_file)
#endif
static gboolean
+ensure_login_vt (GdmSessionWorker *worker)
+{
+ int fd;
+ struct vt_stat vt_state = { 0 };
+ gboolean got_login_vt = FALSE;
+
+ fd = open ("/dev/tty0", O_RDWR | O_NOCTTY);
+
+ if (fd < 0) {
+ g_debug ("GdmSessionWorker: couldn't open VT master: %m");
+ return FALSE;
+ }
+
+ if (ioctl (fd, VT_GETSTATE, &vt_state) < 0) {
+ g_debug ("GdmSessionWorker: couldn't get current VT: %m");
+ goto out;
+ }
+
+ worker->priv->login_vt = vt_state.v_active;
+ got_login_vt = TRUE;
+out:
+ close (fd);
+ return got_login_vt;
+}
+
+static gboolean
gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
const char *service,
const char *username,
@@ -976,6 +1002,7 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
{
struct pam_conv pam_conversation;
int error_code;
+ char tty_string[256];
g_assert (worker->priv->pam_handle == NULL);
@@ -1048,6 +1075,12 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
g_debug ("GdmSessionWorker: state SETUP_COMPLETE");
worker->priv->state = GDM_SESSION_WORKER_STATE_SETUP_COMPLETE;
+ /* Temporarily set PAM_TTY with the currently active VT (login screen)
+ PAM_TTY will be reset with the users VT right before the user session is opened */
+ ensure_login_vt (worker);
+ g_snprintf (tty_string, 256, "/dev/tty%d", worker->priv->login_vt);
+ pam_set_item (worker->priv->pam_handle, PAM_TTY, tty_string);
+
out:
if (error_code != PAM_SUCCESS) {
gdm_session_worker_uninitialize_pam (worker, error_code);
@@ -2020,7 +2053,6 @@ set_up_for_new_vt (GdmSessionWorker *worker)
{
int fd;
char vt_string[256], tty_string[256];
- struct vt_stat vt_state = { 0 };
int session_vt = 0;
fd = open ("/dev/tty0", O_RDWR | O_NOCTTY);
@@ -2030,11 +2062,6 @@ set_up_for_new_vt (GdmSessionWorker *worker)
return FALSE;
}
- if (ioctl (fd, VT_GETSTATE, &vt_state) < 0) {
- g_debug ("GdmSessionWorker: couldn't get current VT: %m");
- goto fail;
- }
-
if (worker->priv->display_is_initial) {
session_vt = atoi (GDM_INITIAL_VT);
} else {
@@ -2044,7 +2071,6 @@ set_up_for_new_vt (GdmSessionWorker *worker)
}
}
- worker->priv->login_vt = vt_state.v_active;
worker->priv->session_vt = session_vt;
close (fd);