summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2015-06-17 19:52:04 +0200
committerLennart Poettering <lennart@poettering.net>2015-06-17 19:52:04 +0200
commitb0fc0763d38a0ad227c0f1d31662449696b13cf0 (patch)
tree648a50a2ac5c30ef508364381d8d14b661130488 /src
parent9ee7a50c0bab0d8df324399aa7d43bbdceaf0318 (diff)
parent71161305f191d1fe1242ccca47657f9ab51caad4 (diff)
Merge pull request #265 from smcv/logind-runtimedir-race-write-earlier
logind: save /run/systemd/users/UID before starting user@.service
Diffstat (limited to 'src')
-rw-r--r--src/login/logind-user.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index 738e69cced..21d7268120 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -106,7 +106,7 @@ void user_free(User *u) {
free(u);
}
-int user_save(User *u) {
+static int user_save_internal(User *u) {
_cleanup_free_ char *temp_path = NULL;
_cleanup_fclose_ FILE *f = NULL;
int r;
@@ -114,9 +114,6 @@ int user_save(User *u) {
assert(u);
assert(u->state_file);
- if (!u->started)
- return 0;
-
r = mkdir_safe_label("/run/systemd/users", 0755, 0, 0);
if (r < 0)
goto finish;
@@ -259,6 +256,15 @@ finish:
return r;
}
+int user_save(User *u) {
+ assert(u);
+
+ if (!u->started)
+ return 0;
+
+ return user_save_internal (u);
+}
+
int user_load(User *u) {
_cleanup_free_ char *display = NULL, *realtime = NULL, *monotonic = NULL;
Session *s = NULL;
@@ -458,6 +464,12 @@ int user_start(User *u) {
if (r < 0)
return r;
+ /* Save the user data so far, because pam_systemd will read the
+ * XDG_RUNTIME_DIR out of it while starting up systemd --user.
+ * We need to do user_save_internal() because we have not
+ * "officially" started yet. */
+ user_save_internal(u);
+
/* Spawn user systemd */
r = user_start_service(u);
if (r < 0)
@@ -709,7 +721,7 @@ UserState user_get_state(User *u) {
if (u->stopping)
return USER_CLOSING;
- if (u->slice_job || u->service_job)
+ if (!u->started || u->slice_job || u->service_job)
return USER_OPENING;
if (u->sessions) {