Zbigniew Jędrzejewski-Szmek 5d6eed
From d14d851c73c1fecbf361db94c48156e02d61c4e8 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 03e93e
From: Djalal Harouni <tixxdz@opendz.org>
Zbigniew Jędrzejewski-Szmek 03e93e
Date: Sun, 6 Nov 2016 22:51:49 +0100
Zbigniew Jędrzejewski-Szmek 03e93e
Subject: [PATCH] core: make RootDirectory= and ProtectKernelModules= work
Zbigniew Jędrzejewski-Szmek 03e93e
Zbigniew Jędrzejewski-Szmek 03e93e
Instead of having two fields inside BindMount struct where one is stack
Zbigniew Jędrzejewski-Szmek 03e93e
based and the other one is heap, use one field to store the full path
Zbigniew Jędrzejewski-Szmek 03e93e
and updated it when we chase symlinks. This way we avoid dealing with
Zbigniew Jędrzejewski-Szmek 03e93e
both at the same time.
Zbigniew Jędrzejewski-Szmek 03e93e
Zbigniew Jędrzejewski-Szmek 03e93e
This makes RootDirectory= work with ProtectHome= and ProtectKernelModules=yes
Zbigniew Jędrzejewski-Szmek 03e93e
Zbigniew Jędrzejewski-Szmek 03e93e
Fixes: https://github.com/systemd/systemd/issues/4567
Zbigniew Jędrzejewski-Szmek 03e93e
(cherry picked from commit f0a4feb0a5318e52107b0df63997a9b13f5be668)
Zbigniew Jędrzejewski-Szmek 03e93e
---
Zbigniew Jędrzejewski-Szmek 03e93e
 src/core/namespace.c | 142 +++++++++++++++++++++++++++++++--------------------
Zbigniew Jędrzejewski-Szmek 03e93e
 1 file changed, 86 insertions(+), 56 deletions(-)
Zbigniew Jędrzejewski-Szmek 03e93e
Zbigniew Jędrzejewski-Szmek 03e93e
diff --git a/src/core/namespace.c b/src/core/namespace.c
Zbigniew Jędrzejewski-Szmek 03e93e
index 1195e9a854..c45c120193 100644
Zbigniew Jędrzejewski-Szmek 03e93e
--- a/src/core/namespace.c
Zbigniew Jędrzejewski-Szmek 03e93e
+++ b/src/core/namespace.c
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -58,8 +58,7 @@ typedef enum MountMode {
Zbigniew Jędrzejewski-Szmek 03e93e
 } MountMode;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
 typedef struct BindMount {
Zbigniew Jędrzejewski-Szmek 03e93e
-        const char *path; /* stack memory, doesn't need to be freed explicitly */
Zbigniew Jędrzejewski-Szmek 03e93e
-        char *chased; /* malloc()ed memory, needs to be freed */
Zbigniew Jędrzejewski-Szmek 03e93e
+        char *path;
Zbigniew Jędrzejewski-Szmek 03e93e
         MountMode mode;
Zbigniew Jędrzejewski-Szmek 03e93e
         bool ignore; /* Ignore if path does not exist */
Zbigniew Jędrzejewski-Szmek 03e93e
 } BindMount;
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -155,12 +154,27 @@ static const TargetMount protect_system_strict_table[] = {
Zbigniew Jędrzejewski-Szmek 03e93e
         { "/root",      READWRITE,      true  },      /* ProtectHome= */
Zbigniew Jędrzejewski-Szmek 03e93e
 };
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-static void set_bind_mount(BindMount **p, const char *path, MountMode mode, bool ignore) {
Zbigniew Jędrzejewski-Szmek 03e93e
+static void set_bind_mount(BindMount **p, char *path, MountMode mode, bool ignore) {
Zbigniew Jędrzejewski-Szmek 03e93e
         (*p)->path = path;
Zbigniew Jędrzejewski-Szmek 03e93e
         (*p)->mode = mode;
Zbigniew Jędrzejewski-Szmek 03e93e
         (*p)->ignore = ignore;
Zbigniew Jędrzejewski-Szmek 03e93e
 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
+static int append_one_mount(BindMount **p, const char *root_directory,
Zbigniew Jędrzejewski-Szmek 03e93e
+                            const char *path, MountMode mode, bool ignore) {
Zbigniew Jędrzejewski-Szmek 03e93e
+        char *lpath;
Zbigniew Jędrzejewski-Szmek 03e93e
+        assert(p);
Zbigniew Jędrzejewski-Szmek 03e93e
+
Zbigniew Jędrzejewski-Szmek 03e93e
+        lpath = prefix_root(root_directory, path);
Zbigniew Jędrzejewski-Szmek 03e93e
+        if (!lpath)
Zbigniew Jędrzejewski-Szmek 03e93e
+                return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 03e93e
+
Zbigniew Jędrzejewski-Szmek 03e93e
+        set_bind_mount(p, lpath, mode, ignore);
Zbigniew Jędrzejewski-Szmek 03e93e
+        (*p)++;
Zbigniew Jędrzejewski-Szmek 03e93e
+
Zbigniew Jędrzejewski-Szmek 03e93e
+        return 0;
Zbigniew Jędrzejewski-Szmek 03e93e
+}
Zbigniew Jędrzejewski-Szmek 03e93e
+
Zbigniew Jędrzejewski-Szmek 03e93e
 static int append_mounts(BindMount **p, char **strv, MountMode mode) {
Zbigniew Jędrzejewski-Szmek 03e93e
         char **i;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -168,6 +182,7 @@ static int append_mounts(BindMount **p, char **strv, MountMode mode) {
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         STRV_FOREACH(i, strv) {
Zbigniew Jędrzejewski-Szmek 03e93e
                 bool ignore = false;
Zbigniew Jędrzejewski-Szmek 03e93e
+                char *path;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (IN_SET(mode, INACCESSIBLE, READONLY, READWRITE) && startswith(*i, "-")) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         (*i)++;
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -177,7 +192,11 @@ static int append_mounts(BindMount **p, char **strv, MountMode mode) {
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (!path_is_absolute(*i))
Zbigniew Jędrzejewski-Szmek 03e93e
                         return -EINVAL;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-                set_bind_mount(p, *i, mode, ignore);
Zbigniew Jędrzejewski-Szmek 03e93e
+                path = strdup(*i);
Zbigniew Jędrzejewski-Szmek 03e93e
+                if (!path)
Zbigniew Jędrzejewski-Szmek 03e93e
+                        return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 03e93e
+
Zbigniew Jędrzejewski-Szmek 03e93e
+                set_bind_mount(p, path, mode, ignore);
Zbigniew Jędrzejewski-Szmek 03e93e
                 (*p)++;
Zbigniew Jędrzejewski-Szmek 03e93e
         }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -196,7 +215,11 @@ static int append_target_mounts(BindMount **p, const char *root_directory, const
Zbigniew Jędrzejewski-Szmek 03e93e
                  * declaration we do not support "-" at the beginning.
Zbigniew Jędrzejewski-Szmek 03e93e
                  */
Zbigniew Jędrzejewski-Szmek 03e93e
                 const TargetMount *m = &mounts[i];
Zbigniew Jędrzejewski-Szmek 03e93e
-                const char *path = prefix_roota(root_directory, m->path);
Zbigniew Jędrzejewski-Szmek 03e93e
+                char *path;
Zbigniew Jędrzejewski-Szmek 03e93e
+
Zbigniew Jędrzejewski-Szmek 03e93e
+                path = prefix_root(root_directory, m->path);
Zbigniew Jędrzejewski-Szmek 03e93e
+                if (!path)
Zbigniew Jędrzejewski-Szmek 03e93e
+                        return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (!path_is_absolute(path))
Zbigniew Jędrzejewski-Szmek 03e93e
                         return -EINVAL;
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -309,6 +332,7 @@ static void drop_duplicates(BindMount *m, unsigned *n) {
Zbigniew Jędrzejewski-Szmek 03e93e
                  * above. */
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (previous && path_equal(f->path, previous->path)) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         log_debug("%s is duplicate.", f->path);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        f->path = mfree(f->path);
Zbigniew Jędrzejewski-Szmek 03e93e
                         continue;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -336,6 +360,7 @@ static void drop_inaccessible(BindMount *m, unsigned *n) {
Zbigniew Jędrzejewski-Szmek 03e93e
                  * it, as inaccessible paths really should drop the entire subtree. */
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (clear && path_startswith(f->path, clear)) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         log_debug("%s is masked by %s.", f->path, clear);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        f->path = mfree(f->path);
Zbigniew Jędrzejewski-Szmek 03e93e
                         continue;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -375,6 +400,7 @@ static void drop_nop(BindMount *m, unsigned *n) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         /* We found it, let's see if it's the same mode, if so, we can drop this entry */
Zbigniew Jędrzejewski-Szmek 03e93e
                         if (found && p->mode == f->mode) {
Zbigniew Jędrzejewski-Szmek 03e93e
                                 log_debug("%s is redundant by %s", f->path, p->path);
Zbigniew Jędrzejewski-Szmek 03e93e
+                                f->path = mfree(f->path);
Zbigniew Jędrzejewski-Szmek 03e93e
                                 continue;
Zbigniew Jędrzejewski-Szmek 03e93e
                         }
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -401,6 +427,7 @@ static void drop_outside_root(const char *root_directory, BindMount *m, unsigned
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (!path_startswith(f->path, root_directory)) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         log_debug("%s is outside of root directory.", f->path);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        f->path = mfree(f->path);
Zbigniew Jędrzejewski-Szmek 03e93e
                         continue;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -652,18 +679,21 @@ static int chase_all_symlinks(const char *root_directory, BindMount *m, unsigned
Zbigniew Jędrzejewski-Szmek 03e93e
          * can't resolve the path, and which have been marked for such removal. */
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         for (f = m, t = m; f < m+*n; f++) {
Zbigniew Jędrzejewski-Szmek 03e93e
-
Zbigniew Jędrzejewski-Szmek 03e93e
-                r = chase_symlinks(f->path, root_directory, &f->chased);
Zbigniew Jędrzejewski-Szmek 03e93e
-                if (r == -ENOENT && f->ignore) /* Doesn't exist? Then remove it! */
Zbigniew Jędrzejewski-Szmek 03e93e
+                _cleanup_free_ char *chased = NULL;
Zbigniew Jędrzejewski-Szmek 03e93e
+                r = chase_symlinks(f->path, root_directory, &chased);
Zbigniew Jędrzejewski-Szmek 03e93e
+                if (r == -ENOENT && f->ignore) {
Zbigniew Jędrzejewski-Szmek 03e93e
+                        /* Doesn't exist? Then remove it! */
Zbigniew Jędrzejewski-Szmek 03e93e
+                        f->path = mfree(f->path);
Zbigniew Jędrzejewski-Szmek 03e93e
                         continue;
Zbigniew Jędrzejewski-Szmek 03e93e
+                }
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
                         return log_debug_errno(r, "Failed to chase symlinks for %s: %m", f->path);
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-                if (path_equal(f->path, f->chased))
Zbigniew Jędrzejewski-Szmek 03e93e
-                        f->chased = mfree(f->chased);
Zbigniew Jędrzejewski-Szmek 03e93e
-                else {
Zbigniew Jędrzejewski-Szmek 03e93e
-                        log_debug("Chased %s → %s", f->path, f->chased);
Zbigniew Jędrzejewski-Szmek 03e93e
-                        f->path = f->chased;
Zbigniew Jędrzejewski-Szmek 03e93e
+                if (!path_equal(f->path, chased)) {
Zbigniew Jędrzejewski-Szmek 03e93e
+                        log_debug("Chased %s → %s", f->path, chased);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        r = free_and_strdup(&f->path, chased);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
+                                return r;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 *t = *f;
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -724,96 +754,96 @@ int setup_namespace(
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         BindMount *m, *mounts = NULL;
Zbigniew Jędrzejewski-Szmek 03e93e
         bool make_slave = false;
Zbigniew Jędrzejewski-Szmek 03e93e
-        unsigned n;
Zbigniew Jędrzejewski-Szmek 03e93e
+        unsigned n_mounts;
Zbigniew Jędrzejewski-Szmek 03e93e
         int r = 0;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         if (mount_flags == 0)
Zbigniew Jędrzejewski-Szmek 03e93e
                 mount_flags = MS_SHARED;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-        n = namespace_calculate_mounts(ns_info,
Zbigniew Jędrzejewski-Szmek 03e93e
-                                       read_write_paths,
Zbigniew Jędrzejewski-Szmek 03e93e
-                                       read_only_paths,
Zbigniew Jędrzejewski-Szmek 03e93e
-                                       inaccessible_paths,
Zbigniew Jędrzejewski-Szmek 03e93e
-                                       tmp_dir, var_tmp_dir,
Zbigniew Jędrzejewski-Szmek 03e93e
-                                       protect_home, protect_system);
Zbigniew Jędrzejewski-Szmek 03e93e
+        n_mounts = namespace_calculate_mounts(ns_info,
Zbigniew Jędrzejewski-Szmek 03e93e
+                                              read_write_paths,
Zbigniew Jędrzejewski-Szmek 03e93e
+                                              read_only_paths,
Zbigniew Jędrzejewski-Szmek 03e93e
+                                              inaccessible_paths,
Zbigniew Jędrzejewski-Szmek 03e93e
+                                              tmp_dir, var_tmp_dir,
Zbigniew Jędrzejewski-Szmek 03e93e
+                                              protect_home, protect_system);
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         /* Set mount slave mode */
Zbigniew Jędrzejewski-Szmek 03e93e
-        if (root_directory || n > 0)
Zbigniew Jędrzejewski-Szmek 03e93e
+        if (root_directory || n_mounts > 0)
Zbigniew Jędrzejewski-Szmek 03e93e
                 make_slave = true;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-        if (n > 0) {
Zbigniew Jędrzejewski-Szmek 03e93e
-                m = mounts = (BindMount *) alloca0(n * sizeof(BindMount));
Zbigniew Jędrzejewski-Szmek 03e93e
+        if (n_mounts > 0) {
Zbigniew Jędrzejewski-Szmek 03e93e
+                m = mounts = (BindMount *) alloca0(n_mounts * sizeof(BindMount));
Zbigniew Jędrzejewski-Szmek 03e93e
                 r = append_mounts(&m, read_write_paths, READWRITE);
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
-                        return r;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 r = append_mounts(&m, read_only_paths, READONLY);
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
-                        return r;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 r = append_mounts(&m, inaccessible_paths, INACCESSIBLE);
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
-                        return r;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (tmp_dir) {
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m->path = prefix_roota(root_directory, "/tmp");
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m->mode = PRIVATE_TMP;
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m++;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        r = append_one_mount(&m, root_directory, "/tmp", PRIVATE_TMP, false);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
+                                goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (var_tmp_dir) {
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m->path = prefix_roota(root_directory, "/var/tmp");
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m->mode = PRIVATE_VAR_TMP;
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m++;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        r = append_one_mount(&m, root_directory, "/var/tmp", PRIVATE_VAR_TMP, false);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
+                                goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (ns_info->private_dev) {
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m->path = prefix_roota(root_directory, "/dev");
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m->mode = PRIVATE_DEV;
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m++;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        r = append_one_mount(&m, root_directory, "/dev", PRIVATE_DEV, false);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
+                                goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (ns_info->protect_kernel_tunables) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         r = append_protect_kernel_tunables(&m, root_directory);
Zbigniew Jędrzejewski-Szmek 03e93e
                         if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
-                                return r;
Zbigniew Jędrzejewski-Szmek 03e93e
+                                goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (ns_info->protect_kernel_modules) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         r = append_protect_kernel_modules(&m, root_directory);
Zbigniew Jędrzejewski-Szmek 03e93e
                         if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
-                                return r;
Zbigniew Jędrzejewski-Szmek 03e93e
+                                goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (ns_info->protect_control_groups) {
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m->path = prefix_roota(root_directory, "/sys/fs/cgroup");
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m->mode = READONLY;
Zbigniew Jędrzejewski-Szmek 03e93e
-                        m++;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        r = append_one_mount(&m, root_directory, "/sys/fs/cgroup", READONLY, false);
Zbigniew Jędrzejewski-Szmek 03e93e
+                        if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
+                                goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 r = append_protect_home(&m, root_directory, protect_home);
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
-                        return r;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 r = append_protect_system(&m, root_directory, protect_system);
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
-                        return r;
Zbigniew Jędrzejewski-Szmek 03e93e
+                        goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-                assert(mounts + n == m);
Zbigniew Jędrzejewski-Szmek 03e93e
+                assert(mounts + n_mounts == m);
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 /* Resolve symlinks manually first, as mount() will always follow them relative to the host's
Zbigniew Jędrzejewski-Szmek 03e93e
                  * root. Moreover we want to suppress duplicates based on the resolved paths. This of course is a bit
Zbigniew Jędrzejewski-Szmek 03e93e
                  * racy. */
Zbigniew Jędrzejewski-Szmek 03e93e
-                r = chase_all_symlinks(root_directory, mounts, &n);
Zbigniew Jędrzejewski-Szmek 03e93e
+                r = chase_all_symlinks(root_directory, mounts, &n_mounts);
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
                         goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-                qsort(mounts, n, sizeof(BindMount), mount_path_compare);
Zbigniew Jędrzejewski-Szmek 03e93e
+                qsort(mounts, n_mounts, sizeof(BindMount), mount_path_compare);
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-                drop_duplicates(mounts, &n);
Zbigniew Jędrzejewski-Szmek 03e93e
-                drop_outside_root(root_directory, mounts, &n);
Zbigniew Jędrzejewski-Szmek 03e93e
-                drop_inaccessible(mounts, &n);
Zbigniew Jędrzejewski-Szmek 03e93e
-                drop_nop(mounts, &n);
Zbigniew Jędrzejewski-Szmek 03e93e
+                drop_duplicates(mounts, &n_mounts);
Zbigniew Jędrzejewski-Szmek 03e93e
+                drop_outside_root(root_directory, mounts, &n_mounts);
Zbigniew Jędrzejewski-Szmek 03e93e
+                drop_inaccessible(mounts, &n_mounts);
Zbigniew Jędrzejewski-Szmek 03e93e
+                drop_nop(mounts, &n_mounts);
Zbigniew Jędrzejewski-Szmek 03e93e
         }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         if (unshare(CLONE_NEWNS) < 0) {
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -843,25 +873,25 @@ int setup_namespace(
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
         }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-        if (n > 0) {
Zbigniew Jędrzejewski-Szmek 03e93e
+        if (n_mounts > 0) {
Zbigniew Jędrzejewski-Szmek 03e93e
                 char **blacklist;
Zbigniew Jędrzejewski-Szmek 03e93e
                 unsigned j;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 /* First round, add in all special mounts we need */
Zbigniew Jędrzejewski-Szmek 03e93e
-                for (m = mounts; m < mounts + n; ++m) {
Zbigniew Jędrzejewski-Szmek 03e93e
+                for (m = mounts; m < mounts + n_mounts; ++m) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         r = apply_mount(m, tmp_dir, var_tmp_dir);
Zbigniew Jędrzejewski-Szmek 03e93e
                         if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
                                 goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
                 }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 /* Create a blacklist we can pass to bind_mount_recursive() */
Zbigniew Jędrzejewski-Szmek 03e93e
-                blacklist = newa(char*, n+1);
Zbigniew Jędrzejewski-Szmek 03e93e
-                for (j = 0; j < n; j++)
Zbigniew Jędrzejewski-Szmek 03e93e
+                blacklist = newa(char*, n_mounts+1);
Zbigniew Jędrzejewski-Szmek 03e93e
+                for (j = 0; j < n_mounts; j++)
Zbigniew Jędrzejewski-Szmek 03e93e
                         blacklist[j] = (char*) mounts[j].path;
Zbigniew Jędrzejewski-Szmek 03e93e
                 blacklist[j] = NULL;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
                 /* Second round, flip the ro bits if necessary. */
Zbigniew Jędrzejewski-Szmek 03e93e
-                for (m = mounts; m < mounts + n; ++m) {
Zbigniew Jędrzejewski-Szmek 03e93e
+                for (m = mounts; m < mounts + n_mounts; ++m) {
Zbigniew Jędrzejewski-Szmek 03e93e
                         r = make_read_only(m, blacklist);
Zbigniew Jędrzejewski-Szmek 03e93e
                         if (r < 0)
Zbigniew Jędrzejewski-Szmek 03e93e
                                 goto finish;
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -886,8 +916,8 @@ int setup_namespace(
Zbigniew Jędrzejewski-Szmek 03e93e
         r = 0;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
 finish:
Zbigniew Jędrzejewski-Szmek 03e93e
-        for (m = mounts; m < mounts + n; m++)
Zbigniew Jędrzejewski-Szmek 03e93e
-                free(m->chased);
Zbigniew Jędrzejewski-Szmek 03e93e
+        for (m = mounts; m < mounts + n_mounts; m++)
Zbigniew Jędrzejewski-Szmek 03e93e
+                free(m->path);
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         return r;
Zbigniew Jędrzejewski-Szmek 03e93e
 }