summaryrefslogtreecommitdiff
path: root/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2023-05-09 09:41:49 +1000
committerChuck Lever <chuck.lever@oracle.com>2023-05-14 15:55:01 -0400
commiteb8d3a2c809abd73ab0a060fe971d6b9019aa3c1 (patch)
tree011af15d2945374253632a631e127774cf713d73 /net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
parent319050d4302ee9b216fb8cea847a9c4427628a98 (diff)
downloadlinux-eb8d3a2c809abd73ab0a060fe971d6b9019aa3c1.tar.gz
SUNRPC: double free xprt_ctxt while still in use
When an RPC request is deferred, the rq_xprt_ctxt pointer is moved out of the svc_rqst into the svc_deferred_req. When the deferred request is revisited, the pointer is copied into the new svc_rqst - and also remains in the svc_deferred_req. In the (rare?) case that the request is deferred a second time, the old svc_deferred_req is reused - it still has all the correct content. However in that case the rq_xprt_ctxt pointer is NOT cleared so that when xpo_release_xprt is called, the ctxt is freed (UDP) or possible added to a free list (RDMA). When the deferred request is revisited for a second time, it will reference this ctxt which may be invalid, and the free the object a second time which is likely to oops. So change svc_defer() to *always* clear rq_xprt_ctxt, and assert that the value is now stored in the svc_deferred_req. Fixes: 773f91b2cf3f ("SUNRPC: Fix NFSD's request deferral on RDMA transports") Signed-off-by: NeilBrown <neilb@suse.de> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Diffstat (limited to 'net/sunrpc/xprtrdma/svc_rdma_recvfrom.c')
0 files changed, 0 insertions, 0 deletions