Simplify the meaning of %s
The rules governing %s where just too complicated. First of all, looking at $SHELL is dangerous. For systemd --system, it usually wouldn't be set. But it could be set if the admin first started a debug shell, let's say /sbin/sash, and then launched systemd from it. This shouldn't influence how daemons are started later on, so is better ignored. Similar reasoning holds for session mode. Some shells set $SHELL, while other set it only when it wasn't set previously (e.g. zsh). This results in fragility that is better avoided by ignoring $SHELL totally. With $SHELL out of the way, simplify things by saying that %s==/bin/sh for root, and the configured shell otherwise. get_shell() is the only caller, so it can be inlined. Fixes one issue seen with 'make check'.
This commit is contained in:
+22
-13
@@ -190,28 +190,37 @@ static char *specifier_user_shell(char specifier, void *data, void *userdata) {
|
||||
ExecContext *c;
|
||||
int r;
|
||||
const char *username, *shell;
|
||||
char *ret;
|
||||
|
||||
assert(u);
|
||||
|
||||
c = unit_get_exec_context(u);
|
||||
|
||||
/* return HOME if set, otherwise from passwd */
|
||||
if (!c || !c->user) {
|
||||
char *sh;
|
||||
if (c && c->user)
|
||||
username = c->user;
|
||||
else
|
||||
username = "root";
|
||||
|
||||
r = get_shell(&sh);
|
||||
if (r < 0)
|
||||
return strdup("/bin/sh");
|
||||
|
||||
return sh;
|
||||
/* return /bin/sh for root, otherwise the value from passwd */
|
||||
r = get_user_creds(&username, NULL, NULL, NULL, &shell);
|
||||
if (r < 0) {
|
||||
log_warning_unit(u->id,
|
||||
"Failed to determine shell: %s",
|
||||
strerror(-r));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
username = c->user;
|
||||
r = get_user_creds(&username, NULL, NULL, NULL, &shell);
|
||||
if (r < 0)
|
||||
return strdup("/bin/sh");
|
||||
if (!path_is_absolute(shell)) {
|
||||
log_warning_unit(u->id,
|
||||
"Shell %s is not absolute, ignoring.",
|
||||
shell);
|
||||
}
|
||||
|
||||
return strdup(shell);
|
||||
ret = strdup(shell);
|
||||
if (!ret)
|
||||
log_oom();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *unit_name_printf(Unit *u, const char* format) {
|
||||
|
||||
Reference in New Issue
Block a user