chiark / gitweb /
logind: close race on session state during logins
authorDjalal Harouni <tixxdz@opendz.org>
Thu, 13 Feb 2014 22:03:23 +0000 (23:03 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 17 Feb 2014 07:26:22 +0000 (02:26 -0500)
commit8fe63cd4f16e1e7cdf528ff053f8eb4da7848455
tree00a5035af74da561daf7f009b34964e6a32fb297
parent9fadd4cabf57285e58272ddb75147d8d52d4c5a9
logind: close race on session state during logins

At login there is a small race window where session_get_state() will
return SESSION_ACTIVE instead of SESSION_OPENING. This must be fixed
since during that time there are calls to session_save() to save
session states and we want to write the correct state.

When we queue the start scope and service jobs, we wait for both of them
to finish before calling and continue processing in:
"session_jobs_reply() => session_send_create_reply()"
to create the session fifo and notify clients.

However, in the match_job_removed() D-Bus signal, we may hit situations
where the scope job has successfully finished and we are still waiting
for the user service job to finish. During that time the
"session->scope_job" will be freed and set to NULL, this makes
session_get_state() return SESSION_ACTIVE before it is really active, it
should return SESSION_OPENING since we are still waiting for the service
job to finish in order to create the session fifo.

To fix this, we also check if the session fifo fd was created, if so then
the session has entered the SESSION_ACTIVE state, if not then it is still
in the SESSION_OPENING state and it is waiting for the scope and service
jobs to finish.
src/login/logind-session.c