Skip to content

Commit

Permalink
svcrpc: fix rare race on unix_domain creation
Browse files Browse the repository at this point in the history
Note that "new" here is not yet fully initialized; auth_domain_put
should be called only on auth_domains that have actually been added to
the hash.

Before this fix, two attempts to add the same domain at once could
cause the hlist_del in auth_domain_put to fail.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
  • Loading branch information
J. Bruce Fields committed Mar 8, 2011
1 parent 5ece3ca commit 8b3e07a
Showing 1 changed file with 9 additions and 9 deletions.
18 changes: 9 additions & 9 deletions net/sunrpc/svcauth_unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@ struct unix_domain {

extern struct auth_ops svcauth_unix;

static void svcauth_unix_domain_release(struct auth_domain *dom)
{
struct unix_domain *ud = container_of(dom, struct unix_domain, h);

kfree(dom->name);
kfree(ud);
}

struct auth_domain *unix_domain_find(char *name)
{
struct auth_domain *rv;
Expand All @@ -47,7 +55,7 @@ struct auth_domain *unix_domain_find(char *name)
while(1) {
if (rv) {
if (new && rv != &new->h)
auth_domain_put(&new->h);
svcauth_unix_domain_release(new);

if (rv->flavour != &svcauth_unix) {
auth_domain_put(rv);
Expand All @@ -74,14 +82,6 @@ struct auth_domain *unix_domain_find(char *name)
}
EXPORT_SYMBOL_GPL(unix_domain_find);

static void svcauth_unix_domain_release(struct auth_domain *dom)
{
struct unix_domain *ud = container_of(dom, struct unix_domain, h);

kfree(dom->name);
kfree(ud);
}


/**************************************************
* cache for IP address to unix_domain
Expand Down

0 comments on commit 8b3e07a

Please sign in to comment.