NFSv4.0: Fix a use-after-free problem in the asynchronous open()
[ Upstream commit 2fdb05dc0931250574f0cb0ebeb5ed8e20f4a889 ] Yang Erkun reports that when two threads are opening files at the same time, and are forced to abort before a reply is seen, then the call to nfs_release_seqid() in nfs4_opendata_free() can result in a use-after-free of the pointer to the defunct rpc task of the other thread. The fix is to ensure that if the RPC call is aborted before the call to nfs_wait_on_sequence() is complete, then we must call nfs_release_seqid() in nfs4_open_release() before the rpc_task is freed. Reported-by: Yang Erkun <yangerkun@huawei.com> Fixes: 24ac23ab88df ("NFSv4: Convert open() into an asynchronous RPC call") Reviewed-by: Yang Erkun <yangerkun@huawei.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
d80a27cf69
commit
bebeed876f
1 changed files with 5 additions and 3 deletions
|
@ -2518,12 +2518,14 @@ static void nfs4_open_release(void *calldata)
|
||||||
struct nfs4_opendata *data = calldata;
|
struct nfs4_opendata *data = calldata;
|
||||||
struct nfs4_state *state = NULL;
|
struct nfs4_state *state = NULL;
|
||||||
|
|
||||||
|
/* In case of error, no cleanup! */
|
||||||
|
if (data->rpc_status != 0 || !data->rpc_done) {
|
||||||
|
nfs_release_seqid(data->o_arg.seqid);
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
/* If this request hasn't been cancelled, do nothing */
|
/* If this request hasn't been cancelled, do nothing */
|
||||||
if (!data->cancelled)
|
if (!data->cancelled)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
/* In case of error, no cleanup! */
|
|
||||||
if (data->rpc_status != 0 || !data->rpc_done)
|
|
||||||
goto out_free;
|
|
||||||
/* In case we need an open_confirm, no cleanup! */
|
/* In case we need an open_confirm, no cleanup! */
|
||||||
if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
|
if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
Loading…
Reference in a new issue