chiark / gitweb /
selinux: use setcon() instead of reexec to apply selinux policy
[elogind.git] / src / mount-setup.c
index d740d4f3570bedd34a7deea0dc636bdb2e54e3c0..290698939e1f876d43197b5f7e9f059bf3811517 100644 (file)
@@ -54,19 +54,18 @@ static const MountPoint mount_table[] = {
         { "devtmpfs", "/dev",                   "devtmpfs", "mode=755",          MS_NOSUID,                    true },
         { "tmpfs",    "/dev/shm",               "tmpfs",    "mode=1777",         MS_NOSUID|MS_NODEV,           true },
         { "devpts",   "/dev/pts",               "devpts",   "mode=620,gid=" STRINGIFY(TTY_GID), MS_NOSUID|MS_NOEXEC, false },
-        { "tmpfs",    "/dev/.run",              "tmpfs",    "mode=755",          MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
-        { "tmpfs",    "/sys/fs/cgroup",         "tmpfs",    "mode=755",          MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
-        { "cgroup",   "/sys/fs/cgroup/systemd", "cgroup",   "none,name=systemd", MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
+        { "tmpfs",    "/run",                   "tmpfs",    "mode=755",          MS_NOSUID|MS_NODEV, true },
+        { "tmpfs",    "/sys/fs/cgroup",         "tmpfs",    "mode=755",          MS_NOSUID|MS_NOEXEC|MS_NODEV, false },
+        { "cgroup",   "/sys/fs/cgroup/systemd", "cgroup",   "none,name=systemd", MS_NOSUID|MS_NOEXEC|MS_NODEV, false },
 };
 
 /* These are API file systems that might be mounted by other software,
  * we just list them here so that we know that we should ignore them */
 
 static const char * const ignore_paths[] = {
+        "/sys/fs/selinux",
         "/selinux",
-        "/proc/bus/usb",
-        "/var/lib/nfs/rpc_pipefs",
-        "/proc/fs/nfsd"
+        "/proc/bus/usb"
 };
 
 bool mount_point_is_api(const char *path) {
@@ -97,6 +96,9 @@ static int mount_one(const MountPoint *p) {
 
         assert(p);
 
+        /* Relabel first, just in case */
+        label_fix(p->where, true);
+
         if ((r = path_is_mount_point(p->where)) < 0)
                 return r;
 
@@ -122,6 +124,7 @@ static int mount_one(const MountPoint *p) {
                 return p->fatal ? -errno : 0;
         }
 
+        /* Relabel again, since we now mounted something fresh here */
         label_fix(p->where, false);
 
         return 0;
@@ -130,12 +133,14 @@ static int mount_one(const MountPoint *p) {
 static int mount_cgroup_controllers(void) {
         int r;
         FILE *f;
-        char buf [256];
+        char buf[LINE_MAX];
 
         /* Mount all available cgroup controllers that are built into the kernel. */
 
-        if (!(f = fopen("/proc/cgroups", "re")))
-                return -ENOENT;
+        if (!(f = fopen("/proc/cgroups", "re"))) {
+                log_error("Failed to enumerate cgroup controllers: %m");
+                return 0;
+        }
 
         /* Ignore the header line */
         (void) fgets(buf, sizeof(buf), f);
@@ -221,7 +226,7 @@ static int nftw_cb(
         return 0;
 };
 
-int mount_setup(void) {
+int mount_setup(bool loaded_policy) {
 
         const char symlinks[] =
                 "/proc/kcore\0"      "/dev/core\0"
@@ -238,23 +243,35 @@ int mount_setup(void) {
                 if ((r = mount_one(mount_table+i)) < 0)
                         return r;
 
-        /* Nodes in devtmpfs need to be manually updated for the
-         * appropriate labels, after mounting. The other virtual API
-         * file systems do not need. */
+        /* Nodes in devtmpfs and /run need to be manually updated for
+         * the appropriate labels, after mounting. The other virtual
+         * API file systems like /sys and /proc do not need that, they
+         * use the same label for all their files. */
+        if (loaded_policy) {
+                usec_t before_relabel, after_relabel;
+                char timespan[FORMAT_TIMESPAN_MAX];
+
+                before_relabel = now(CLOCK_MONOTONIC);
 
-        if (unlink("/dev/.systemd-relabel-devtmpfs") >= 0)
                 nftw("/dev", nftw_cb, 64, FTW_MOUNT|FTW_PHYS);
+                nftw("/run", nftw_cb, 64, FTW_MOUNT|FTW_PHYS);
+
+                after_relabel = now(CLOCK_MONOTONIC);
+
+                log_info("Relabelled /dev and /run in %s.",
+                         format_timespan(timespan, sizeof(timespan), after_relabel - before_relabel));
+
+        }
 
         /* Create a few default symlinks, which are normally created
-         * bei udevd, but some scripts might need them before we start
+         * by udevd, but some scripts might need them before we start
          * udevd. */
-
         NULSTR_FOREACH_PAIR(j, k, symlinks)
                 symlink_and_label(j, k);
 
         /* Create a few directories we always want around */
-        mkdir("/dev/.run/systemd", 0755);
-        mkdir("/dev/.run/systemd/ask-password", 0755);
+        mkdir("/run/systemd", 0755);
+        mkdir("/run/systemd/system", 0755);
 
         return mount_cgroup_controllers();
 }