selinux: move policy mutex to selinux_state, use in lockdep checks
Move the mutex used to synchronize policy changes (reloads and setting of booleans) from selinux_fs_info to selinux_state and use it in lockdep checks for rcu_dereference_protected() calls in the security server functions. This makes the dependency on the mutex explicit in the code rather than relying on comments. Signed-off-by: Stephen Smalley <stephen.smalley.work@gmail.com> Reviewed-by: Ondrej Mosnacek <omosnace@redhat.com> Signed-off-by: Paul Moore <paul@paul-moore.com>
Šī revīzija ir iekļauta:

revīziju iesūtīja
Paul Moore

vecāks
0256b0aa80
revīzija
9ff9abc4c6
@@ -2163,13 +2163,8 @@ void selinux_policy_cancel(struct selinux_state *state,
|
||||
{
|
||||
struct selinux_policy *oldpolicy;
|
||||
|
||||
/*
|
||||
* NOTE: We do not need to take the rcu read lock
|
||||
* around the code below because other policy-modifying
|
||||
* operations are already excluded by selinuxfs via
|
||||
* fsi->mutex.
|
||||
*/
|
||||
oldpolicy = rcu_dereference_check(state->policy, 1);
|
||||
oldpolicy = rcu_dereference_protected(state->policy,
|
||||
lockdep_is_held(&state->policy_mutex));
|
||||
|
||||
sidtab_cancel_convert(oldpolicy->sidtab);
|
||||
selinux_policy_free(policy);
|
||||
@@ -2192,13 +2187,8 @@ void selinux_policy_commit(struct selinux_state *state,
|
||||
struct selinux_policy *oldpolicy;
|
||||
u32 seqno;
|
||||
|
||||
/*
|
||||
* NOTE: We do not need to take the rcu read lock
|
||||
* around the code below because other policy-modifying
|
||||
* operations are already excluded by selinuxfs via
|
||||
* fsi->mutex.
|
||||
*/
|
||||
oldpolicy = rcu_dereference_check(state->policy, 1);
|
||||
oldpolicy = rcu_dereference_protected(state->policy,
|
||||
lockdep_is_held(&state->policy_mutex));
|
||||
|
||||
/* If switching between different policy types, log MLS status */
|
||||
if (oldpolicy) {
|
||||
@@ -2291,13 +2281,8 @@ int security_load_policy(struct selinux_state *state, void *data, size_t len,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: We do not need to take the rcu read lock
|
||||
* around the code below because other policy-modifying
|
||||
* operations are already excluded by selinuxfs via
|
||||
* fsi->mutex.
|
||||
*/
|
||||
oldpolicy = rcu_dereference_check(state->policy, 1);
|
||||
oldpolicy = rcu_dereference_protected(state->policy,
|
||||
lockdep_is_held(&state->policy_mutex));
|
||||
|
||||
/* Preserve active boolean values from the old policy */
|
||||
rc = security_preserve_bools(oldpolicy, newpolicy);
|
||||
@@ -3013,14 +2998,8 @@ int security_set_bools(struct selinux_state *state, u32 len, int *values)
|
||||
if (!selinux_initialized(state))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* NOTE: We do not need to take the rcu read lock
|
||||
* around the code below because other policy-modifying
|
||||
* operations are already excluded by selinuxfs via
|
||||
* fsi->mutex.
|
||||
*/
|
||||
|
||||
oldpolicy = rcu_dereference_check(state->policy, 1);
|
||||
oldpolicy = rcu_dereference_protected(state->policy,
|
||||
lockdep_is_held(&state->policy_mutex));
|
||||
|
||||
/* Consistency check on number of booleans, should never fail */
|
||||
if (WARN_ON(len != oldpolicy->policydb.p_bools.nprim))
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user