From: Zbigniew Jędrzejewski-Szmek Date: Tue, 18 Nov 2025 09:08:41 +0000 (+0100) Subject: core: improve messages about unknown users and groups X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a50fdf611c83b8143255da45d831eb27bcb67a4f;p=thirdparty%2Fsystemd.git core: improve messages about unknown users and groups $ sudo build/systemd-run --uid=asdf whoami $ journalctl -e (whoami)[1007784]: run-p1007782-i5200512.service: Failed to determine user credentials: No such process (whoami)[1007784]: run-p1007782-i5200512.service: Failed at step USER spawning /usr/sbin/whoami: No such process systemd[1]: run-p1007782-i5200512.service: Main process exited, code=exited, status=217/USER systemd[1]: run-p1007782-i5200512.service: Failed with result 'exit-code'. Now: (whoami)[1013204]: run-p1013202-i5205932.service: Failed to determine credentials for user 'asdf': Unknown user (whoami)[1013204]: run-p1013202-i5205932.service: Failed at step USER spawning /usr/sbin/whoami: Invalid argument systemd[1]: run-p1013202-i5205932.service: Main process exited, code=exited, status=217/USER systemd[1]: run-p1013202-i5205932.service: Failed with result 'exit-code'. --- diff --git a/src/basic/user-util.h b/src/basic/user-util.h index 24793530e67..b7e71720a57 100644 --- a/src/basic/user-util.h +++ b/src/basic/user-util.h @@ -9,6 +9,7 @@ #include #include "basic-forward.h" +#include "errno-util.h" /* Users managed by systemd-homed. See https://systemd.io/UIDS-GIDS for details * how this range fits into the rest of the world. */ @@ -25,6 +26,13 @@ #define STRERROR_USER(errnum) ((errnum) == -ESRCH ? "Unknown user" : (errnum) == -ENOEXEC ? "Not a system user" : STRERROR(errnum)) #define STRERROR_GROUP(errnum) ((errnum) == -ESRCH ? "Unknown group" : (errnum) == -ENOEXEC ? "Not a system group" : STRERROR(errnum)) +static inline bool ERRNO_IS_NEG_BAD_ACCOUNT(intmax_t r) { + return IN_SET(r, + -ESRCH, + -ENOEXEC); +} +_DEFINE_ABS_WRAPPER(BAD_ACCOUNT); + bool uid_is_valid(uid_t uid) _const_; static inline bool gid_is_valid(gid_t gid) { diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c index 97a71073841..e9c4e3f624f 100644 --- a/src/core/exec-invoke.c +++ b/src/core/exec-invoke.c @@ -2087,8 +2087,11 @@ static int build_environment( assert(!c->user); r = get_fixed_user("root", /* prefer_nss = */ false, &username, NULL, NULL, &home, &shell); - if (r < 0) - return log_debug_errno(r, "Failed to determine user credentials for root: %m"); + if (r < 0) { + log_debug_errno(r, "Failed to determine credentials for user root: %s", + STRERROR_USER(r)); + return ERRNO_IS_NEG_BAD_ACCOUNT(r) ? -EINVAL : r; /* Suppress confusing errno */ + } } bool set_user_login_env = exec_context_get_set_login_environment(c); @@ -5265,7 +5268,9 @@ int exec_invoke( &username, &uid, &gid, &pwent_home, &shell); if (r < 0) { *exit_status = EXIT_USER; - return log_error_errno(r, "Failed to determine user credentials: %m"); + log_error_errno(r, "Failed to determine credentials for user '%s': %s", + u, STRERROR_USER(r)); + return ERRNO_IS_NEG_BAD_ACCOUNT(r) ? -EINVAL : r; /* Suppress confusing errno */ } } @@ -5273,7 +5278,9 @@ int exec_invoke( r = get_fixed_group(context->group, &groupname, &gid); if (r < 0) { *exit_status = EXIT_GROUP; - return log_error_errno(r, "Failed to determine group credentials: %m"); + log_error_errno(r, "Failed to determine credentials for group '%s': %s", + u, STRERROR_GROUP(r)); + return ERRNO_IS_NEG_BAD_ACCOUNT(r) ? -EINVAL : r; /* Suppress confusing errno */ } } } diff --git a/src/core/scope.c b/src/core/scope.c index 50dafacb42a..a6b4cebca5f 100644 --- a/src/core/scope.c +++ b/src/core/scope.c @@ -348,7 +348,9 @@ static int scope_enter_start_chown(Scope *s) { r = get_user_creds(&user, &uid, &gid, NULL, NULL, 0); if (r < 0) { - log_unit_error_errno(UNIT(s), r, "Failed to resolve user \"%s\": %m", user); + log_unit_error_errno(UNIT(s), r, + "Failed to resolve user '%s': %s", + user, STRERROR_USER(r)); _exit(EXIT_USER); } } @@ -358,7 +360,9 @@ static int scope_enter_start_chown(Scope *s) { r = get_group_creds(&group, &gid, 0); if (r < 0) { - log_unit_error_errno(UNIT(s), r, "Failed to resolve group \"%s\": %m", group); + log_unit_error_errno(UNIT(s), r, + "Failed to resolve group '%s': %s", + group, STRERROR_GROUP(r)); _exit(EXIT_GROUP); } } diff --git a/src/core/socket.c b/src/core/socket.c index c53f84906fe..dd4b96c2138 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -2056,7 +2056,9 @@ static int socket_chown(Socket *s, PidRef *ret_pid) { r = get_user_creds(&user, &uid, &gid, NULL, NULL, 0); if (r < 0) { - log_unit_error_errno(UNIT(s), r, "Failed to resolve user %s: %m", user); + log_unit_error_errno(UNIT(s), r, + "Failed to resolve user '%s': %s", + user, STRERROR_USER(r)); _exit(EXIT_USER); } } @@ -2066,7 +2068,9 @@ static int socket_chown(Socket *s, PidRef *ret_pid) { r = get_group_creds(&group, &gid, 0); if (r < 0) { - log_unit_error_errno(UNIT(s), r, "Failed to resolve group %s: %m", group); + log_unit_error_errno(UNIT(s), r, + "Failed to resolve group '%s': %s", + group, STRERROR_GROUP(r)); _exit(EXIT_GROUP); } }