mirror of
https://github.com/systemd/systemd.git
synced 2024-11-27 12:13:33 +08:00
user-util: also consider /bin/false and /bin/true as non-shell
This commit is contained in:
parent
a6011d1887
commit
7cb609115c
@ -197,6 +197,25 @@ int get_user_creds(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool is_nologin_shell(const char *shell) {
|
||||||
|
|
||||||
|
return PATH_IN_SET(shell,
|
||||||
|
/* 'nologin' is the friendliest way to disable logins for a user account. It prints a nice
|
||||||
|
* message and exits. Different distributions place the binary at different places though,
|
||||||
|
* hence let's list them all. */
|
||||||
|
"/bin/nologin",
|
||||||
|
"/sbin/nologin",
|
||||||
|
"/usr/bin/nologin",
|
||||||
|
"/usr/sbin/nologin",
|
||||||
|
/* 'true' and 'false' work too for the same purpose, but are less friendly as they don't do
|
||||||
|
* any message printing. Different distributions place the binary at various places but at
|
||||||
|
* least not in the 'sbin' directory. */
|
||||||
|
"/bin/false",
|
||||||
|
"/usr/bin/false",
|
||||||
|
"/bin/true",
|
||||||
|
"/usr/bin/true");
|
||||||
|
}
|
||||||
|
|
||||||
int get_user_creds_clean(
|
int get_user_creds_clean(
|
||||||
const char **username,
|
const char **username,
|
||||||
uid_t *uid, gid_t *gid,
|
uid_t *uid, gid_t *gid,
|
||||||
@ -212,11 +231,7 @@ int get_user_creds_clean(
|
|||||||
return r;
|
return r;
|
||||||
|
|
||||||
if (shell &&
|
if (shell &&
|
||||||
(isempty(*shell) || PATH_IN_SET(*shell,
|
(isempty(*shell) || is_nologin_shell(*shell)))
|
||||||
"/bin/nologin",
|
|
||||||
"/sbin/nologin",
|
|
||||||
"/usr/bin/nologin",
|
|
||||||
"/usr/sbin/nologin")))
|
|
||||||
*shell = NULL;
|
*shell = NULL;
|
||||||
|
|
||||||
if (home &&
|
if (home &&
|
||||||
|
Loading…
Reference in New Issue
Block a user