On Wed, 2008-09-03 at 10:26 -0400, Eric Paris wrote: > On Wed, 2008-09-03 at 10:08 -0400, Stephen Smalley wrote: > > On Wed, 2008-09-03 at 09:58 -0400, Eric Paris wrote: > > > Fix a bug and a philosophical decision about who handles errors. > > > > > > security_context_to_sid_core() was leaking a context in the common case. > > > This was causing problems on fedora systems which recently have started > > > making extensive use of this function. > > > > > > In discussion it was decided that if string_to_context_struct() had an > > > error it was its own responsibility to clean up any mess it created > > > along the way. Remember that it is perfectly safe to call > > > context_destroy() on the same context twice and so this will not > > > introduce any double frees or cause issues with the other change. > > > > Well, there are two possibilities. Either: > > 1) we are fine with multiple calls to context_destroy(), in which case > > the original patch stands as is, or > > I'm fine with it standing, but I rewrote it really because I didn't want > yet another needless goto that I added. > > > 2) we want to avoid multiple calls to context_destroy(), in which case > > this patch is still wrong - the latter context_destroy() call should > > only occur _before_ the out label (i.e. same place it was, only without > > the conditional). > > Lets go this route just to have some consistency. I put it where I did > so it was done without the policy_rwlock. Since we are now seeing > hundreds to thousands of calls to this code path I think its worth it to > be a slight bit more picky with the locking. So how about a version 3 > like this? If you ack I'll send it cleanly for jmorris.... I'm not sure it is justified - we are only talking about a readlock there, and centralizing the lock/unlock sequence seems generally good. > > --- > > security/selinux/ss/services.c | 12 +++++++----- > 1 files changed, 7 insertions(+), 5 deletions(-) > > diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c > index b52f923..a0a73e7 100644 > --- a/security/selinux/ss/services.c > +++ b/security/selinux/ss/services.c > @@ -811,11 +811,12 @@ static int string_to_context_struct(struct policydb *pol, > /* Check the validity of the new context. */ > if (!policydb_context_isvalid(pol, ctx)) { > rc = -EINVAL; > - context_destroy(ctx); > goto out; > } > rc = 0; > out: > + if (rc) > + context_destroy(ctx); > return rc; > } > > @@ -865,13 +866,14 @@ static int security_context_to_sid_core(const char *scontext, u32 scontext_len, > context.str = str; > context.len = scontext_len; > str = NULL; > - } else if (rc) > + } else if (rc) { > + read_unlock(&policy_rwlock); > goto out; > + } > rc = sidtab_context_to_sid(&sidtab, &context, sid); > - if (rc) > - context_destroy(&context); > -out: > read_unlock(&policy_rwlock); > + context_destroy(&context); > +out: > kfree(scontext2); > kfree(str); > return rc; > > > > -- > This message was distributed to subscribers of the selinux mailing list. > If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with > the words "unsubscribe selinux" without quotes as the message. -- Stephen Smalley National Security Agency -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with the words "unsubscribe selinux" without quotes as the message.