[LightDM] [systemd-devel] sd 221 regression: login - nonexistent sessions via lightdm

David Herrmann dh.herrmann at gmail.com
Tue Jul 7 10:10:58 PDT 2015


Hi

On Tue, Jul 7, 2015 at 6:55 PM, Martin Pitt <martin.pitt at ubuntu.com> wrote:
> Hey David,
>
> David Herrmann [2015-07-07 18:31 +0200]:
>> > Revert "login: re-use VT-sessions if they already exist" - commit 0204c4b
>> > http://cgit.freedesktop.org/systemd/systemd/commit/?id=0204c4b
>>
>> Can someone elaborate what exactly lightdm does here? We really want
>> to prevent multiple sessions on the same VT. This is just nasty and
>> never made any sense. So I'm really interested why lightdm doesn't
>> kill it's manager-session before it starts the new session. Any
>> particular reason here?
>
> I'll let Robert answer with the details, but something I noticed:
>
> It's not that simple to reproduce, but sometimes it seems the lightdm
> "greeter" session (running as user lightdm, where you select user/type
> password and so on) doesn't completely terminate, but some processes
> stay around in it. Thus the greeter session stays around in state
> "Closing", and then the "real" session starts on the same VT.
>
> I asked the reporter of https://launchpad.net/bugs/1472259 to attach
> systemd-cgls, so that we can see what's running in the session.

So it might indeed just be a race in lightdm. Hmm..
Anyway, this patch here should also fix the issue (if it does, I'll
commit something proper).

Thanks
David

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 0cc2cdf..bced693 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -690,8 +690,11 @@ static int method_create_session
         }

         manager_get_session_by_pid(m, leader, &session);
-        if (!session && vtnr > 0 && vtnr < m->seat0->position_count)
+        if (!session && vtnr > 0 && vtnr < m->seat0->position_count) {
                 session = m->seat0->positions[vtnr];
+                if (session && session->class == SESSION_GREETER)
+                        session = NULL;
+        }
         if (session) {
                 _cleanup_free_ char *path = NULL;
                 _cleanup_close_ int fifo_fd = -1;


More information about the LightDM mailing list