Merge pull request #24934 from keszybz/remove-nss-lookup
Remove nss lookups from pid1
This commit is contained in:
@@ -125,11 +125,12 @@ int chase_symlinks(
|
||||
*
|
||||
* 4. With CHASE_SAFE: in this case the path must not contain unsafe transitions, i.e. transitions from
|
||||
* unprivileged to privileged files or directories. In such cases the return value is -ENOLINK. If
|
||||
* CHASE_WARN is also set, a warning describing the unsafe transition is emitted.
|
||||
* CHASE_WARN is also set, a warning describing the unsafe transition is emitted. CHASE_WARN cannot
|
||||
* be used in PID 1.
|
||||
*
|
||||
* 5. With CHASE_NO_AUTOFS: in this case if an autofs mount point is encountered, path normalization
|
||||
* is aborted and -EREMOTE is returned. If CHASE_WARN is also set, a warning showing the path of
|
||||
* the mount point is emitted.
|
||||
* the mount point is emitted. CHASE_WARN cannot be used in PID 1.
|
||||
*/
|
||||
|
||||
/* A root directory of "/" or "" is identical to none */
|
||||
|
||||
@@ -15,7 +15,8 @@ typedef enum ChaseSymlinksFlags {
|
||||
CHASE_STEP = 1 << 5, /* Just execute a single step of the normalization */
|
||||
CHASE_NOFOLLOW = 1 << 6, /* Do not follow the path's right-most component. With ret_fd, when the path's
|
||||
* right-most component refers to symlink, return O_PATH fd of the symlink. */
|
||||
CHASE_WARN = 1 << 7, /* Emit an appropriate warning when an error is encountered */
|
||||
CHASE_WARN = 1 << 7, /* Emit an appropriate warning when an error is encountered.
|
||||
* Note: this may do an NSS lookup, hence this flag cannot be used in PID 1. */
|
||||
} ChaseSymlinksFlags;
|
||||
|
||||
bool unsafe_transition(const struct stat *a, const struct stat *b);
|
||||
|
||||
+14
-9
@@ -338,31 +338,36 @@ static int condition_test_cpus(Condition *c, char **env) {
|
||||
static int condition_test_user(Condition *c, char **env) {
|
||||
uid_t id;
|
||||
int r;
|
||||
_cleanup_free_ char *username = NULL;
|
||||
const char *u;
|
||||
|
||||
assert(c);
|
||||
assert(c->parameter);
|
||||
assert(c->type == CONDITION_USER);
|
||||
|
||||
/* Do the quick&easy comparisons first, and only parse the UID later. */
|
||||
if (streq(c->parameter, "root"))
|
||||
return getuid() == 0 || geteuid() == 0;
|
||||
if (streq(c->parameter, NOBODY_USER_NAME))
|
||||
return getuid() == UID_NOBODY || geteuid() == UID_NOBODY;
|
||||
if (streq(c->parameter, "@system"))
|
||||
return uid_is_system(getuid()) || uid_is_system(geteuid());
|
||||
|
||||
r = parse_uid(c->parameter, &id);
|
||||
if (r >= 0)
|
||||
return id == getuid() || id == geteuid();
|
||||
|
||||
if (streq("@system", c->parameter))
|
||||
return uid_is_system(getuid()) || uid_is_system(geteuid());
|
||||
if (getpid_cached() == 1) /* We already checked for "root" above, and we know that
|
||||
* PID 1 is running as root, hence we know it cannot match. */
|
||||
return false;
|
||||
|
||||
username = getusername_malloc();
|
||||
/* getusername_malloc() may do an nss lookup, which is not allowed in PID 1. */
|
||||
_cleanup_free_ char *username = getusername_malloc();
|
||||
if (!username)
|
||||
return -ENOMEM;
|
||||
|
||||
if (streq(username, c->parameter))
|
||||
return 1;
|
||||
|
||||
if (getpid_cached() == 1)
|
||||
return streq(c->parameter, "root");
|
||||
|
||||
u = c->parameter;
|
||||
const char *u = c->parameter;
|
||||
r = get_user_creds(&u, &id, NULL, NULL, NULL, USER_CREDS_ALLOW_MISSING);
|
||||
if (r < 0)
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user