dev_t journal_stream_dev,
ino_t journal_stream_ino,
const char *memory_pressure_path,
+ bool needs_sandboxing,
char ***ret) {
_cleanup_strv_free_ char **our_env = NULL;
assert(p);
assert(ret);
-#define N_ENV_VARS 19
+#define N_ENV_VARS 20
our_env = new0(char*, N_ENV_VARS + _EXEC_DIRECTORY_TYPE_MAX);
if (!our_env)
return -ENOMEM;
}
}
+ if (p->notify_socket) {
+ x = strjoin("NOTIFY_SOCKET=", exec_get_private_notify_socket_path(c, p, needs_sandboxing) ?: p->notify_socket);
+ if (!x)
+ return -ENOMEM;
+
+ our_env[n_env++] = x;
+ }
+
assert(n_env < N_ENV_VARS + _EXEC_DIRECTORY_TYPE_MAX);
#undef N_ENV_VARS
.propagate_dir = propagate_dir,
.incoming_dir = incoming_dir,
.private_namespace_dir = private_namespace_dir,
- .host_notify_socket = root_dir || root_image ? params->notify_socket : NULL,
+ .host_notify_socket = params->notify_socket,
+ .notify_socket_path = exec_get_private_notify_socket_path(context, params, needs_sandboxing),
.host_os_release_stage = host_os_release_stage,
/* If DynamicUser=no and RootDirectory= is set then lets pass a relaxed sandbox info,
journal_stream_dev,
journal_stream_ino,
memory_pressure_path,
+ needs_sandboxing,
&our_env);
if (r < 0) {
*exit_status = EXIT_MEMORY;
return false;
}
+const char* exec_get_private_notify_socket_path(const ExecContext *context, const ExecParameters *params, bool needs_sandboxing) {
+ assert(context);
+ assert(params);
+
+ if (!params->notify_socket)
+ return NULL;
+
+ if (!needs_sandboxing)
+ return NULL;
+
+ if (!context->root_directory && !context->root_image)
+ return NULL;
+
+ if (!exec_context_get_effective_mount_apivfs(context))
+ return NULL;
+
+ if (!FLAGS_SET(params->flags, EXEC_APPLY_CHROOT))
+ return NULL;
+
+ return "/run/host/notify";
+}
+
bool exec_directory_is_private(const ExecContext *context, ExecDirectoryType type) {
assert(context);
bool exec_needs_cgroup_namespace(const ExecContext *context, const ExecParameters *params);
bool exec_needs_cgroup_mount(const ExecContext *context, const ExecParameters *params);
bool exec_is_cgroup_mount_read_only(const ExecContext *context, const ExecParameters *params);
+const char* exec_get_private_notify_socket_path(const ExecContext *context, const ExecParameters *params, bool needs_sandboxing);
/* These logging macros do the same logging as those in unit.h, but using ExecContext and ExecParameters
* instead of the unit object, so that it can be used in the sd-executor context (where the unit object is
};
}
- if (p->host_notify_socket) {
+ if (p->notify_socket_path) {
MountEntry *me = mount_list_extend(&ml);
if (!me)
return log_oom_debug();
*me = (MountEntry) {
- .path_const = p->host_notify_socket,
+ .path_const = p->notify_socket_path,
.source_const = p->host_notify_socket,
.mode = MOUNT_BIND,
.read_only = true,
const char *private_namespace_dir;
const char *host_notify_socket;
+ const char *notify_socket_path;
const char *host_os_release_stage;
bool ignore_protect_paths;
if (r < 0)
return r;
- our_env = new0(char*, 14);
+ our_env = new0(char*, 13);
if (!our_env)
return -ENOMEM;
if (service_exec_needs_notify_socket(s, exec_params.flags)) {
- if (asprintf(our_env + n_env++, "NOTIFY_SOCKET=%s", UNIT(s)->manager->notify_socket) < 0)
- return -ENOMEM;
-
exec_params.notify_socket = UNIT(s)->manager->notify_socket;
if (s->n_fd_store_max > 0)
# SPDX-License-Identifier: LGPL-2.1-or-later
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
-# shellcheck disable=SC2233,SC2235
+# shellcheck disable=SC2233,SC2235,SC2016
set -eux
set -o pipefail
(! systemd-run --wait -p RootImage="$MINIMAL_IMAGE.raw" -p BindLogSockets=no ls /run/systemd/journal/socket)
(! systemd-run --wait -p RootImage="$MINIMAL_IMAGE.raw" -p MountAPIVFS=no ls /run/systemd/journal/socket)
+# Test that the notify socket is bind mounted to /run/host/notify in sandboxed environments and
+# $NOTIFY_SOCKET is set correctly.
+systemd-run --wait -p RootImage="$MINIMAL_IMAGE.raw" -p NotifyAccess=all --service-type=notify --pipe sh -c 'echo READY=1 | ncat --unixsock --udp $NOTIFY_SOCKET --source /run/notify && ls /run/host/notify'
+systemd-run --wait -p RootImage="$MINIMAL_IMAGE.raw" -p NotifyAccess=all --service-type=notify --pipe sh -c 'echo READY=1 | ncat --unixsock --udp $NOTIFY_SOCKET --source /run/notify && env' | grep NOTIFY_SOCKET=/run/host/notify
+
systemd-run -P -p RootImage="$MINIMAL_IMAGE.raw" cat /usr/lib/os-release | grep -q -F "MARKER=1"
mv "$MINIMAL_IMAGE.verity" "$MINIMAL_IMAGE.fooverity"
mv "$MINIMAL_IMAGE.roothash" "$MINIMAL_IMAGE.foohash"