Normally, the service manager sets $SHELL to the target user's
login shell, but run0 always overrides that with either
originating user's shell or value from --setenv=SHELL=. In both cases
$SHELL needs to be sent.
Fixes #35007
const char *e;
e = strv_env_get(arg_environment, "SHELL");
- if (e)
+ if (e) {
arg_exec_path = strdup(e);
- else {
+ if (!arg_exec_path)
+ return log_oom();
+ } else {
if (arg_transport == BUS_TRANSPORT_LOCAL) {
r = get_shell(&arg_exec_path);
if (r < 0)
return log_error_errno(r, "Failed to determine shell: %m");
- } else
+ } else {
arg_exec_path = strdup("/bin/sh");
+ if (!arg_exec_path)
+ return log_oom();
+ }
+
+ r = strv_env_assign(&arg_environment, "SHELL", arg_exec_path);
+ if (r < 0)
+ return log_error_errno(r, "Failed to set $SHELL environment variable: %m");
}
- if (!arg_exec_path)
- return log_oom();
l = make_login_shell_cmdline(arg_exec_path);
}