nfsd: call op_release, even when op_func returns an error
authorJeff Layton <jlayton@kernel.org>
Mon, 27 Mar 2023 10:21:37 +0000 (06:21 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Apr 2023 14:55:21 +0000 (16:55 +0200)
commitb623a8e5d38a69a3ef8644acb1030dd7c7bc28b3
treec6766832e03af91b0b9edb34d257e3e5989be7f2
parentffcbcf087581ae68ddc0a21460f7ecd4315bdd0e
nfsd: call op_release, even when op_func returns an error

[ Upstream commit 15a8b55dbb1ba154d82627547c5761cac884d810 ]

For ops with "trivial" replies, nfsd4_encode_operation will shortcut
most of the encoding work and skip to just marshalling up the status.
One of the things it skips is calling op_release. This could cause a
memory leak in the layoutget codepath if there is an error at an
inopportune time.

Have the compound processing engine always call op_release, even when
op_func sets an error in op->status. With this change, we also need
nfsd4_block_get_device_info_scsi to set the gd_device pointer to NULL
on error to avoid a double free.

Reported-by: Zhi Li <yieli@redhat.com>
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2181403
Fixes: 34b1744c91cc ("nfsd4: define ->op_release for compound ops")
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfsd/blocklayout.c
fs/nfsd/nfs4xdr.c