context->protect_kernel_logs ||
context->protect_control_groups ||
context->protect_proc != PROTECT_PROC_DEFAULT ||
- context->proc_subset != PROC_SUBSET_ALL)
+ context->proc_subset != PROC_SUBSET_ALL ||
+ context->private_ipc ||
+ context->ipc_namespace_path)
return true;
if (context->root_directory) {
.protect_system = context->protect_system,
.protect_proc = context->protect_proc,
.proc_subset = context->proc_subset,
+ .private_ipc = context->private_ipc || context->ipc_namespace_path,
};
} else if (!context->dynamic_user && root_dir)
/*
EXEC,
TMPFS,
EXTENSION_IMAGES, /* Mounted outside the root directory, and used by subsequent mounts */
+ MQUEUEFS,
READWRITE_IMPLICIT, /* Should have the lowest priority. */
_MOUNT_MODE_MAX,
} MountMode;
[READWRITE_IMPLICIT] = "rw-implicit",
[EXEC] = "exec",
[NOEXEC] = "noexec",
+ [MQUEUEFS] = "mqueuefs",
};
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(mount_mode, MountMode);
return mount_tmpfs(m);
}
+static int mount_mqueuefs(const MountEntry *m) {
+ int r;
+ const char *entry_path;
+
+ assert(m);
+
+ entry_path = mount_entry_path(m);
+
+ (void) mkdir_p_label(entry_path, 0755);
+ (void) umount_recursive(entry_path, 0);
+
+ r = mount_nofollow_verbose(LOG_DEBUG, "mqueue", entry_path, "mqueue", m->flags, mount_entry_options(m));
+ if (r < 0)
+ return r;
+
+ return 0;
+}
+
static int mount_image(const MountEntry *m, const char *root_directory) {
_cleanup_free_ char *host_os_release_id = NULL, *host_os_release_version_id = NULL,
case RUN:
return mount_run(m);
+ case MQUEUEFS:
+ return mount_mqueuefs(m);
+
case MOUNT_IMAGES:
return mount_image(m, NULL);
(creds_path ? 2 : 1) +
!!log_namespace +
setup_propagate + /* /run/systemd/incoming */
- !!notify_socket;
+ !!notify_socket +
+ ns_info->private_ipc; /* /dev/mqueue */
}
static void normalize_mounts(const char *root_directory, MountEntry *mounts, size_t *n_mounts) {
};
}
+ if (ns_info->private_ipc) {
+ *(m++) = (MountEntry) {
+ .path_const = "/dev/mqueue",
+ .mode = MQUEUEFS,
+ .flags = MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_RELATIME,
+ };
+ }
+
if (creds_path) {
/* If our service has a credentials store configured, then bind that one in, but hide
* everything else. */