mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
NFS: Pin the 'struct nfs_server' during a FREE_STATEID call
[ Upstream commitcf616096a0] Dan Aloni reports that he was able to hit a use-after-free bug if a FREE_STATEID operation gets delayed for whatever reason. Fix this by bumping the refcount of the 'struct nfs_server' object for the duration of the FREE_STATEID so it doesn't get cleaned up from underneath us while operations are still in flight. Reported-by: Dan Aloni <dan.aloni@vastdata.com> Fixes:7c1d5fae4a("NFSv4: Convert nfs41_free_stateid to use an asynchronous RPC call") Tested-by: Dan Aloni <dan.aloni@vastdata.com> Signed-off-by: Anna Schumaker <anna.schumaker@hammerspace.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
7dd6e556db
commit
caee6a68ff
@@ -10383,6 +10383,7 @@ static void nfs41_free_stateid_release(void *calldata)
|
||||
struct nfs_free_stateid_data *data = calldata;
|
||||
struct nfs_client *clp = data->server->nfs_client;
|
||||
|
||||
nfs_sb_deactive(data->server->super);
|
||||
nfs_put_client(clp);
|
||||
kfree(calldata);
|
||||
}
|
||||
@@ -10424,6 +10425,10 @@ static int nfs41_free_stateid(struct nfs_server *server,
|
||||
|
||||
if (!refcount_inc_not_zero(&clp->cl_count))
|
||||
return -EIO;
|
||||
if (!nfs_sb_active(server->super)) {
|
||||
nfs_put_client(clp);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_STATEID,
|
||||
&task_setup.rpc_client, &msg);
|
||||
|
||||
Reference in New Issue
Block a user