chiark / gitweb /
mount: relabel both before and after a mount, just in case
[elogind.git] / src / mount-setup.c
index 4adb86f15731acd4a912fae0fe1793b1a4e12fba..9bc8946dba8e29a8f8efac0436914883ea25faa3 100644 (file)
 #include "util.h"
 #include "label.h"
 
+#ifndef TTY_GID
+#define TTY_GID 5
+#endif
+
 typedef struct MountPoint {
         const char *what;
         const char *where;
@@ -48,8 +52,9 @@ static const MountPoint mount_table[] = {
         { "proc",     "/proc",                  "proc",     NULL,                MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
         { "sysfs",    "/sys",                   "sysfs",    NULL,                MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
         { "devtmpfs", "/dev",                   "devtmpfs", "mode=755",          MS_NOSUID,                    true },
-        { "tmpfs",    "/dev/shm",               "tmpfs",    "mode=1777",         MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
-        { "devpts",   "/dev/pts",               "devpts",   NULL,                MS_NOSUID|MS_NOEXEC,          false },
+        { "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",    "/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 },
 };
@@ -92,6 +97,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;
 
@@ -117,7 +125,8 @@ static int mount_one(const MountPoint *p) {
                 return p->fatal ? -errno : 0;
         }
 
-        label_fix(p->where);
+        /* Relabel again, since we now mounted something fresh here */
+        label_fix(p->where, false);
 
         return 0;
 }
@@ -212,7 +221,7 @@ static int nftw_cb(
         if (ftwbuf->level == 0)
                 return 0;
 
-        label_fix(fpath);
+        label_fix(fpath, true);
         return 0;
 };
 
@@ -223,8 +232,7 @@ int mount_setup(void) {
                 "/proc/self/fd\0"    "/dev/fd\0"
                 "/proc/self/fd/0\0"  "/dev/stdin\0"
                 "/proc/self/fd/1\0"  "/dev/stdout\0"
-                "/proc/self/fd/2\0"  "/dev/stderr\0"
-                "\0";
+                "/proc/self/fd/2\0"  "/dev/stderr\0";
 
         int r;
         unsigned i;
@@ -236,10 +244,12 @@ int mount_setup(void) {
 
         /* Nodes in devtmpfs need to be manually updated for the
          * appropriate labels, after mounting. The other virtual API
-         * file systems do not need. */
+         * file systems do not need that. */
 
-        if (unlink("/dev/.systemd/relabel-devtmpfs") >= 0)
+        if (unlink("/dev/.systemd-relabel-run-dev") >= 0) {
                 nftw("/dev", nftw_cb, 64, FTW_MOUNT|FTW_PHYS);
+                nftw("/run", nftw_cb, 64, FTW_MOUNT|FTW_PHYS);
+        }
 
         /* Create a few default symlinks, which are normally created
          * bei udevd, but some scripts might need them before we start
@@ -248,5 +258,9 @@ int mount_setup(void) {
         NULSTR_FOREACH_PAIR(j, k, symlinks)
                 symlink_and_label(j, k);
 
+        /* Create a few directories we always want around */
+        mkdir("/run/systemd", 0755);
+        mkdir("/run/systemd/ask-password", 0755);
+
         return mount_cgroup_controllers();
 }