diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c index cdfa9f823b..4b63e2a204 100644 --- a/src/core/exec-invoke.c +++ b/src/core/exec-invoke.c @@ -4061,7 +4061,7 @@ int exec_invoke( int r, ngids = 0; _cleanup_free_ gid_t *supplementary_gids = NULL; const char *username = NULL, *groupname = NULL; - _cleanup_free_ char *home_buffer = NULL, *memory_pressure_path = NULL; + _cleanup_free_ char *home_buffer = NULL, *memory_pressure_path = NULL, *own_user = NULL; const char *home = NULL, *shell = NULL; char **final_argv = NULL; dev_t journal_stream_dev = 0; @@ -4298,8 +4298,23 @@ int exec_invoke( username = runtime->dynamic_creds->user->name; } else { - if (context->user) { - r = get_fixed_user(context->user, &username, &uid, &gid, &home, &shell); + const char *u; + + if (context->user) + u = context->user; + else if (context->pam_name) { + /* If PAM is enabled but no user name is explicitly selected, then use our own one. */ + own_user = getusername_malloc(); + if (!own_user) { + *exit_status = EXIT_USER; + return log_exec_error_errno(context, params, r, "Failed to determine my own user ID: %m"); + } + u = own_user; + } else + u = NULL; + + if (u) { + r = get_fixed_user(u, &username, &uid, &gid, &home, &shell); if (r < 0) { *exit_status = EXIT_USER; return log_exec_error_errno(context, params, r, "Failed to determine user credentials: %m"); diff --git a/test/units/TEST-74-AUX-UTILS.run.sh b/test/units/TEST-74-AUX-UTILS.run.sh index 5b46e11409..3ef9c88d79 100755 --- a/test/units/TEST-74-AUX-UTILS.run.sh +++ b/test/units/TEST-74-AUX-UTILS.run.sh @@ -238,10 +238,13 @@ if [[ -e /usr/lib/pam.d/systemd-run0 ]] || [[ -e /etc/pam.d/systemd-run0 ]]; the run0 ls / assert_eq "$(run0 echo foo)" "foo" # Check if we set some expected environment variables - for arg in "" "--user=root" "--user=testuser"; do + for arg in "" "--user=root" "--user=0" "--user=testuser"; do assert_eq "$(run0 ${arg:+"$arg"} bash -c 'echo $SUDO_USER')" "$USER" assert_eq "$(run0 ${arg:+"$arg"} bash -c 'echo $SUDO_UID')" "$(id -u "$USER")" assert_eq "$(run0 ${arg:+"$arg"} bash -c 'echo $SUDO_GID')" "$(id -u "$USER")" + + # Validate that we actually went properly through PAM (XDG_SESSION_TYPE is set by pam_systemd) + assert_eq "$(run0 ${arg:+"$arg"} bash -c 'echo $XDG_SESSION_TYPE')" "unspecified" done # Let's chain a couple of run0 calls together, for fun readarray -t cmdline < <(printf "%.0srun0\n" {0..31})