diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index ecfaef3dfa..aea7116e29 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -730,10 +730,13 @@ CapabilityBoundingSet=~CAP_B CAP_C
Set the SELinux security context of the executed process. If set, this will override the
automated domain transition. However, the policy still needs to authorize the transition. This directive is
- ignored if SELinux is disabled. If prefixed by -, all errors will be ignored. This does not
- affect commands prefixed with +. See setexeccon3 for
- details.
+ ignored if SELinux is disabled. If prefixed by -, failing to set the SELinux
+ security context will be ignored, but it's still possible that the subsequent
+ execve() may fail if the policy doesn't allow the transition for the
+ non-overridden context. This does not affect commands prefixed with +. See
+ setexeccon3
+ for details.
diff --git a/src/core/execute.c b/src/core/execute.c
index 6f19f5024e..4a57e40779 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -4579,9 +4579,12 @@ static int exec_child(
if (fd >= 0) {
r = mac_selinux_get_child_mls_label(fd, executable, context->selinux_context, &mac_selinux_context_net);
- if (r < 0 && !context->selinux_context_ignore) {
- *exit_status = EXIT_SELINUX_CONTEXT;
- return log_unit_error_errno(unit, r, "Failed to determine SELinux context: %m");
+ if (r < 0) {
+ if (!context->selinux_context_ignore) {
+ *exit_status = EXIT_SELINUX_CONTEXT;
+ return log_unit_error_errno(unit, r, "Failed to determine SELinux context: %m");
+ }
+ log_unit_debug_errno(unit, r, "Failed to determine SELinux context, ignoring: %m");
}
}
}
@@ -4713,9 +4716,12 @@ static int exec_child(
if (exec_context) {
r = setexeccon(exec_context);
- if (r < 0 && !context->selinux_context_ignore) {
- *exit_status = EXIT_SELINUX_CONTEXT;
- return log_unit_error_errno(unit, r, "Failed to change SELinux context to %s: %m", exec_context);
+ if (r < 0) {
+ if (!context->selinux_context_ignore) {
+ *exit_status = EXIT_SELINUX_CONTEXT;
+ return log_unit_error_errno(unit, r, "Failed to change SELinux context to %s: %m", exec_context);
+ }
+ log_unit_debug_errno(unit, r, "Failed to change SELinux context to %s, ignoring: %m", exec_context);
}
}
}