Merge lp:~mterry/lightdm/session-issues into lp:lightdm

Proposed by Michael Terry
Status: Merged
Merge reported by: Robert Ancell
Merged at revision: not available
Proposed branch: lp:~mterry/lightdm/session-issues
Merge into: lp:lightdm
Diff against target: 222 lines (+154/-1)
7 files modified
src/greeter.c (+14/-1)
tests/Makefile.am (+2/-0)
tests/data/sessions/greeter-mir.desktop (+6/-0)
tests/scripts/session-greeter-switch.conf (+74/-0)
tests/scripts/session-greeter-twice.conf (+54/-0)
tests/test-session-greeter-switch (+2/-0)
tests/test-session-greeter-twice (+2/-0)
To merge this branch: bzr merge lp:~mterry/lightdm/session-issues
Reviewer Review Type Date Requested Status
LightDM Development Team Pending
Review via email: mp+301206@code.launchpad.net

Commit message

There are two in-session bugs fixed here.

One is a lightdm crash when an in-session greeter tries to authenticate any user a second time.

The second fix stops lightdm from closing a session if a greeter tries to start a new authentication after already succeeding in authenticating a user.

== The crash ==

Fixed by r2378 in this branch. It seemed the seat was shutting down the greeter-session's authentication session. But the greeter wasn't watching its auth session to see when it got closed. And it would try to use it later.

So I've simply added a watch for that signal.

== Closing a session ==

Fixed by r2379 in this branch. If a greeter-session's authentication session becomes a real boy, we don't want to stop that session when doing a new authentication.

So if the auth session is running a command, I've changed the code to not close the session when resetting the greeter state.

Description of the change

About the closing-session bug, I think it would have been a problem with old greeters too, not just in-session ones? But they typically don't start a new auth, and instead get shut down.

I've added a test for that closing-session bug, but I did embed it inside a semi-unrelated test that used a mir greeter session and switched users and all. I didn't try to find a smallest-possible test for it.

Both of these may not be the perfect solution? I just tried to fix what I saw. Maybe you think these issues need more code rethinking?

To post a comment you must log in.
lp:~mterry/lightdm/session-issues updated
2380. By Michael Terry

Whoops, add new tests to master list of tests

Revision history for this message
Robert Ancell (robert-ancell) wrote :

I've looked at the first issue (the segfault) in revision 2378. This turned out to be a reference count issue, I've taken your test and fixed in in trunk revision 2382.

Revision history for this message
Robert Ancell (robert-ancell) wrote :

Fixed the second issue in trunk r2384. When the session is accepted ownership is now taken from the greeter instead of of leaving the reference behind.

Revision history for this message
Robert Ancell (robert-ancell) wrote :

Merged in spirit, if not all the code is the same :)

Revision history for this message
Robert Ancell (robert-ancell) wrote :

Thanks!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/greeter.c'
2--- src/greeter.c 2016-07-14 04:52:08 +0000
3+++ src/greeter.c 2016-07-26 18:38:16 +0000
4@@ -441,6 +441,16 @@
5 }
6
7 static void
8+session_stopped_cb (Session *session, Greeter *greeter)
9+{
10+ if (session == greeter->priv->authentication_session)
11+ {
12+ g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter);
13+ g_clear_object (&greeter->priv->authentication_session);
14+ }
15+}
16+
17+static void
18 reset_session (Greeter *greeter)
19 {
20 g_free (greeter->priv->remote_session);
21@@ -448,7 +458,8 @@
22 if (greeter->priv->authentication_session)
23 {
24 g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter);
25- session_stop (greeter->priv->authentication_session);
26+ if (!session_get_is_run (greeter->priv->authentication_session))
27+ session_stop (greeter->priv->authentication_session);
28 g_clear_object (&greeter->priv->authentication_session);
29 }
30
31@@ -486,6 +497,7 @@
32
33 g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_GOT_MESSAGES, G_CALLBACK (pam_messages_cb), greeter);
34 g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter);
35+ g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_STOPPED, G_CALLBACK (session_stopped_cb), greeter);
36
37 /* Use non-interactive service for autologin user */
38 autologin_username = g_hash_table_lookup (greeter->priv->hints, "autologin-user");
39@@ -590,6 +602,7 @@
40 {
41 g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_GOT_MESSAGES, G_CALLBACK (pam_messages_cb), greeter);
42 g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), greeter);
43+ g_signal_connect (G_OBJECT (greeter->priv->authentication_session), SESSION_SIGNAL_STOPPED, G_CALLBACK (session_stopped_cb), greeter);
44
45 /* Run the session process */
46 session_set_pam_service (greeter->priv->authentication_session, service);
47
48=== modified file 'tests/Makefile.am'
49--- tests/Makefile.am 2016-07-14 03:12:25 +0000
50+++ tests/Makefile.am 2016-07-26 18:38:16 +0000
51@@ -171,6 +171,8 @@
52 test-session-greeter \
53 test-session-greeter-autologin \
54 test-session-greeter-reconnect \
55+ test-session-greeter-switch \
56+ test-session-greeter-twice \
57 test-session-greeter-unlock \
58 test-vnc-login \
59 test-vnc-command \
60
61=== added file 'tests/data/sessions/greeter-mir.desktop'
62--- tests/data/sessions/greeter-mir.desktop 1970-01-01 00:00:00 +0000
63+++ tests/data/sessions/greeter-mir.desktop 2016-07-26 18:38:16 +0000
64@@ -0,0 +1,6 @@
65+[Desktop Entry]
66+Name=Test Session with greeter
67+Comment=LightDM test Mir session that can run a greeter inside
68+Exec=test-session
69+X-LightDM-Allow-Greeter=true
70+X-LightDM-Session-Type=mir
71
72=== added file 'tests/scripts/session-greeter-switch.conf'
73--- tests/scripts/session-greeter-switch.conf 1970-01-01 00:00:00 +0000
74+++ tests/scripts/session-greeter-switch.conf 2016-07-26 18:38:16 +0000
75@@ -0,0 +1,74 @@
76+#
77+# Check can unlock separate user with an in-session greeter
78+#
79+
80+[Seat:*]
81+user-session=greeter-mir
82+
83+#?*START-DAEMON
84+#?RUNNER DAEMON-START
85+
86+# X server starts
87+#?XSERVER-0 START VT=7 SEAT=seat0
88+
89+# Daemon connects when X server is ready
90+#?*XSERVER-0 INDICATE-READY
91+#?XSERVER-0 INDICATE-READY
92+#?XSERVER-0 ACCEPT-CONNECT
93+
94+# Greeter starts
95+#?GREETER-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_SESSION_CLASS=greeter
96+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
97+#?XSERVER-0 ACCEPT-CONNECT
98+#?GREETER-X-0 CONNECT-XSERVER
99+#?GREETER-X-0 CONNECT-TO-DAEMON
100+#?GREETER-X-0 CONNECTED-TO-DAEMON
101+
102+# Attempt to log into account
103+#?*GREETER-X-0 AUTHENTICATE USERNAME=no-password1
104+#?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
105+#?*GREETER-X-0 START-SESSION
106+
107+# System compositor starts
108+#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=8 XDG_VTNR=8
109+#?*UNITY-SYSTEM-COMPOSITOR READY
110+
111+# Switch to system compositor
112+#?VT ACTIVATE VT=8
113+
114+# Greeter terminates
115+#?GREETER-X-0 TERMINATE SIGNAL=15
116+#?XSERVER-0 TERMINATE SIGNAL=15
117+
118+# Session starts
119+#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/no-password1 XDG_SESSION_TYPE=mir XDG_SESSION_DESKTOP=greeter-mir USER=no-password1
120+#?LOGIN1 ACTIVATE-SESSION SESSION=c1
121+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-0
122+
123+# Start greeter inside session
124+#?*SESSION-MIR-session-0 GREETER-START
125+#?SESSION-MIR-session-0 GREETER-STARTED
126+
127+# Log into our account
128+#?*SESSION-MIR-session-0 GREETER-AUTHENTICATE USERNAME=have-password1
129+#?SESSION-MIR-session-0 GREETER-SHOW-PROMPT TEXT="Password:"
130+#?*SESSION-MIR-session-0 GREETER-RESPOND TEXT="password"
131+#?SESSION-MIR-session-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
132+#?*SESSION-MIR-session-0 GREETER-START-SESSION
133+
134+# And immediately re-try auth from first session
135+#?*SESSION-MIR-session-0 GREETER-AUTHENTICATE USERNAME=have-password1
136+#?SESSION-MIR-session-0 GREETER-SHOW-PROMPT TEXT="Password:"
137+
138+# New session starts
139+#?SESSION-MIR-session-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=mir XDG_SESSION_DESKTOP=greeter-mir USER=have-password1
140+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-1
141+#?LOGIN1 LOCK-SESSION SESSION=c1
142+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
143+
144+# Cleanup
145+#?*STOP-DAEMON
146+#?SESSION-MIR-session-0 TERMINATE SIGNAL=15
147+#?SESSION-MIR-session-1 TERMINATE SIGNAL=15
148+#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15
149+#?RUNNER DAEMON-EXIT STATUS=0
150
151=== added file 'tests/scripts/session-greeter-twice.conf'
152--- tests/scripts/session-greeter-twice.conf 1970-01-01 00:00:00 +0000
153+++ tests/scripts/session-greeter-twice.conf 2016-07-26 18:38:16 +0000
154@@ -0,0 +1,54 @@
155+#
156+# Check can unlock user with an in-session greeter and re-lock again
157+#
158+
159+[Seat:*]
160+autologin-user=have-password1
161+user-session=greeter
162+
163+#?*START-DAEMON
164+#?RUNNER DAEMON-START
165+
166+# X server starts
167+#?XSERVER-0 START VT=7 SEAT=seat0
168+
169+# Daemon connects when X server is ready
170+#?*XSERVER-0 INDICATE-READY
171+#?XSERVER-0 INDICATE-READY
172+#?XSERVER-0 ACCEPT-CONNECT
173+
174+# Session starts
175+#?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
176+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
177+#?XSERVER-0 ACCEPT-CONNECT
178+#?SESSION-X-0 CONNECT-XSERVER
179+
180+# Start greeter inside session
181+#?*SESSION-X-0 GREETER-START
182+#?SESSION-X-0 GREETER-STARTED
183+
184+# Log into our account
185+#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password1
186+#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:"
187+#?*SESSION-X-0 GREETER-RESPOND TEXT="password"
188+#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
189+#?*SESSION-X-0 GREETER-START-SESSION
190+
191+# We are reactivated
192+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
193+
194+# Authenticate again
195+#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password1
196+#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:"
197+#?*SESSION-X-0 GREETER-RESPOND TEXT="password"
198+#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
199+#?*SESSION-X-0 GREETER-START-SESSION
200+
201+# We are reactivated
202+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
203+
204+# Cleanup
205+#?*STOP-DAEMON
206+#?SESSION-X-0 TERMINATE SIGNAL=15
207+#?XSERVER-0 TERMINATE SIGNAL=15
208+#?RUNNER DAEMON-EXIT STATUS=0
209
210=== added file 'tests/test-session-greeter-switch'
211--- tests/test-session-greeter-switch 1970-01-01 00:00:00 +0000
212+++ tests/test-session-greeter-switch 2016-07-26 18:38:16 +0000
213@@ -0,0 +1,2 @@
214+#!/bin/sh
215+./src/dbus-env ./src/test-runner session-greeter-switch test-gobject-greeter
216
217=== added file 'tests/test-session-greeter-twice'
218--- tests/test-session-greeter-twice 1970-01-01 00:00:00 +0000
219+++ tests/test-session-greeter-twice 2016-07-26 18:38:16 +0000
220@@ -0,0 +1,2 @@
221+#!/bin/sh
222+./src/dbus-env ./src/test-runner session-greeter-twice test-gobject-greeter

Subscribers

People subscribed via source and target branches