Blob Blame History Raw
From 8ce77d0b80b835d337f61bd24c05b586ef059062 Mon Sep 17 00:00:00 2001
From: Christian Seiler <christian@iwakd.de>
Date: Fri, 23 Jan 2015 15:26:18 +0100
Subject: [PATCH] logind: remove per-user runtime dir again if setup fails

If setup of per-user runtime dir fails, clean up afterwards by removing
the directory before returning from the function, so we don't leave the
directory behind.

If this is not done, the second time the user logs in logind would
assume that the directory is already set up, even though it isn't.

(cherry picked from commit 4d858e7d9f39038713f760d7acc64acf7bba2aa7)

Conflicts:
	src/login/logind-user.c
---
 src/login/logind-user.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index 1205b48abb..093eaadb61 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -330,7 +330,6 @@ static int user_mkdir_runtime_path(User *u) {
                         r = asprintf(&t, "mode=0700,smackfsroot=*,uid=" UID_FMT ",gid=" GID_FMT ",size=%zu", u->uid, u->gid, u->manager->runtime_dir_size);
                 else
                         r = asprintf(&t, "mode=0700,uid=" UID_FMT ",gid=" GID_FMT ",size=%zu", u->uid, u->gid, u->manager->runtime_dir_size);
-
                 if (r < 0) {
                         r = log_oom();
                         goto fail;
@@ -338,7 +337,8 @@ static int user_mkdir_runtime_path(User *u) {
 
                 r = mount("tmpfs", p, "tmpfs", MS_NODEV|MS_NOSUID, t);
                 if (r < 0) {
-                        log_error("Failed to mount per-user tmpfs directory %s: %s", p, strerror(-r));
+                        log_error("Failed to mount per-user tmpfs directory %s: %m", p);
+                        r = -errno;
                         goto fail;
                 }
         }
@@ -347,7 +347,12 @@ static int user_mkdir_runtime_path(User *u) {
         return 0;
 
 fail:
-        free(p);
+        if (p) {
+                /* Try to clean up, but ignore errors */
+                (void) rmdir(p);
+                free(p);
+        }
+
         u->runtime_path = NULL;
         return r;
 }