summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Terry <michael.terry@canonical.com>2016-07-25 17:12:10 -0400
committerMichael Terry <michael.terry@canonical.com>2016-07-25 17:12:10 -0400
commit1283985fdb64f037b752c7f77b787b4d6415dd6a (patch)
treecd74899c36bfca5acac709f0c740c4a4060155c5
parent8f2387361b3e1e4b74b6b98fc0981758d364f5fd (diff)
downloadlightdm-git-1283985fdb64f037b752c7f77b787b4d6415dd6a.tar.gz
Watch authentication session in case seat closes it; prevents segfault in some cases
-rw-r--r--src/greeter.c12
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/scripts/session-greeter-twice.conf54
-rwxr-xr-xtests/test-session-greeter-twice2
4 files changed, 69 insertions, 0 deletions
diff --git a/src/greeter.c b/src/greeter.c
index b81bb216..d6616948 100644
--- a/src/greeter.c
+++ b/src/greeter.c
@@ -441,6 +441,16 @@ authentication_complete_cb (Session *session, Greeter *greeter)
}
static void
+session_stopped_cb (Session *session, Greeter *greeter)
+{
+ if (session == greeter->priv->authentication_session)
+ {
+ g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter);
+ g_clear_object (&greeter->priv->authentication_session);
+ }
+}
+
+static void
reset_session (Greeter *greeter)
{
g_free (greeter->priv->remote_session);
@@ -486,6 +496,7 @@ handle_authenticate (Greeter *greeter, guint32 sequence_number, const gchar *use
g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_GOT_MESSAGES, G_CALLBACK (pam_messages_cb), greeter);
g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter);
+ g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_STOPPED, G_CALLBACK (session_stopped_cb), greeter);
/* Use non-interactive service for autologin user */
autologin_username = g_hash_table_lookup (greeter->priv->hints, "autologin-user");
@@ -590,6 +601,7 @@ handle_authenticate_remote (Greeter *greeter, const gchar *session_name, const g
{
g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_GOT_MESSAGES, G_CALLBACK (pam_messages_cb), greeter);
g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter);
+ g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_STOPPED, G_CALLBACK (session_stopped_cb), greeter);
/* Run the session process */
session_set_pam_service (greeter->priv->authentication_session, service);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4a7f4a77..f27d6386 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -171,6 +171,7 @@ TESTS = \
test-session-greeter \
test-session-greeter-autologin \
test-session-greeter-reconnect \
+ test-session-greeter-twice \
test-session-greeter-unlock \
test-vnc-login \
test-vnc-command \
diff --git a/tests/scripts/session-greeter-twice.conf b/tests/scripts/session-greeter-twice.conf
new file mode 100644
index 00000000..fc6d053f
--- /dev/null
+++ b/tests/scripts/session-greeter-twice.conf
@@ -0,0 +1,54 @@
+#
+# Check can unlock user with an in-session greeter and re-lock again
+#
+
+[Seat:*]
+autologin-user=have-password1
+user-session=greeter
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7 SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=have-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Start greeter inside session
+#?*SESSION-X-0 GREETER-START
+#?SESSION-X-0 GREETER-STARTED
+
+# Log into our account
+#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password1
+#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:"
+#?*SESSION-X-0 GREETER-RESPOND TEXT="password"
+#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
+#?*SESSION-X-0 GREETER-START-SESSION
+
+# We are reactivated
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+
+# Authenticate again
+#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password1
+#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:"
+#?*SESSION-X-0 GREETER-RESPOND TEXT="password"
+#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
+#?*SESSION-X-0 GREETER-START-SESSION
+
+# We are reactivated
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/test-session-greeter-twice b/tests/test-session-greeter-twice
new file mode 100755
index 00000000..4cc68de7
--- /dev/null
+++ b/tests/test-session-greeter-twice
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner session-greeter-twice test-gobject-greeter