svcrpc: fix rare race on unix_domain creation
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>
This commit is contained in:
Родитель
5ece3cafbd
Коммит
8b3e07ac90
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче