$ 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'.
#include <shadow.h>
#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. */
#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) {
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);
&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 */
}
}
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 */
}
}
}
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);
}
}
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);
}
}
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);
}
}
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);
}
}