diff options
author | Michael Terry <michael.terry@canonical.com> | 2016-07-25 17:12:10 -0400 |
---|---|---|
committer | Michael Terry <michael.terry@canonical.com> | 2016-07-25 17:12:10 -0400 |
commit | 1283985fdb64f037b752c7f77b787b4d6415dd6a (patch) | |
tree | cd74899c36bfca5acac709f0c740c4a4060155c5 | |
parent | 8f2387361b3e1e4b74b6b98fc0981758d364f5fd (diff) | |
download | lightdm-git-1283985fdb64f037b752c7f77b787b4d6415dd6a.tar.gz |
Watch authentication session in case seat closes it; prevents segfault in some cases
-rw-r--r-- | src/greeter.c | 12 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/scripts/session-greeter-twice.conf | 54 | ||||
-rwxr-xr-x | tests/test-session-greeter-twice | 2 |
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 |