Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f70ef96 authored by Alexey Khoroshilov's avatar Alexey Khoroshilov Committed by Trond Myklebust
Browse files

NFS: add checks for returned value of try_module_get()



There is a couple of places in client code where returned value
of try_module_get() is ignored. As a result there is a small chance
to premature unload module because of unbalanced refcounting.

The patch adds error handling in that places.

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 411a99ad
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -110,8 +110,8 @@ struct nfs_subversion *get_nfs_version(unsigned int version)
		mutex_unlock(&nfs_version_mutex);
		mutex_unlock(&nfs_version_mutex);
	}
	}


	if (!IS_ERR(nfs))
	if (!IS_ERR(nfs) && !try_module_get(nfs->owner))
		try_module_get(nfs->owner);
		return ERR_PTR(-EAGAIN);
	return nfs;
	return nfs;
}
}


@@ -158,7 +158,8 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
		goto error_0;
		goto error_0;


	clp->cl_nfs_mod = cl_init->nfs_mod;
	clp->cl_nfs_mod = cl_init->nfs_mod;
	try_module_get(clp->cl_nfs_mod->owner);
	if (!try_module_get(clp->cl_nfs_mod->owner))
		goto error_dealloc;


	clp->rpc_ops = clp->cl_nfs_mod->rpc_ops;
	clp->rpc_ops = clp->cl_nfs_mod->rpc_ops;


@@ -190,6 +191,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)


error_cleanup:
error_cleanup:
	put_nfs_version(clp->cl_nfs_mod);
	put_nfs_version(clp->cl_nfs_mod);
error_dealloc:
	kfree(clp);
	kfree(clp);
error_0:
error_0:
	return ERR_PTR(err);
	return ERR_PTR(err);