Messages in this thread | | | Date | Wed, 20 Apr 2011 15:51:41 -0700 | From | Casey Schaufler <> | Subject | Re: [PATCH] SMACK: Add missing rcu_read_lock/unlock for process capability walk. |
| |
On 4/20/2011 3:00 PM, Andi Kleen wrote: > From: Andi Kleen <ak@linux.intel.com> > > smk_access_entry does a RCU list walk for a list shared with other > threads. It relies on the caller doing rcu_read_lock(). > One caller forgot to do to this, which could lead to races > on preemptible kernels. > > Move the rcu_read_lock() into smk_access_entry instead.
Nacked-by: Casey Schaufler <casey@schaufler-ca.com>
The lock was moved out of smk_access_entry in support of the processing done in the smack_mmap_file() hook. Where do you see a potential race, and which caller "forgot" to do the lock?
Thank you.
> Signed-off-by: Andi Kleen <ak@linux.intel.com> > --- > security/smack/smack_access.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c > index 7b0d3b3..43b20f3 100644 > --- a/security/smack/smack_access.c > +++ b/security/smack/smack_access.c > @@ -92,6 +92,7 @@ int smk_access_entry(char *subject_label, char *object_label, > int may = -ENOENT; > struct smack_rule *srp; > > + rcu_read_lock(); > list_for_each_entry_rcu(srp, rule_list, list) { > if (srp->smk_subject == subject_label || > strcmp(srp->smk_subject, subject_label) == 0) { > @@ -102,6 +103,7 @@ int smk_access_entry(char *subject_label, char *object_label, > } > } > } > + rcu_read_unlock(); > > return may; > } > @@ -184,9 +186,7 @@ int smk_access_flags(char *subject_label, char *object_label, int request, > * good. A negative response from smk_access_entry() > * indicates there is no entry for this pair. > */ > - rcu_read_lock(); > may = smk_access_entry(subject_label, object_label, &smack_rule_list); > - rcu_read_unlock(); > > if (may > 0 && (request & may) == request) > goto out_audit;
| |