2014-03-10 04:52:10

by Yan, Zheng

[permalink] [raw]
Subject: [PATCH] nfsd4: fix memory leak in nfsd4_encode_fattr()

fh_put() does not free the temporary file handle.

Signed-off-by: Yan, Zheng <[email protected]>
---
fs/nfsd/nfs4xdr.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 63f2395..8de4c9d 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -2499,8 +2499,10 @@ out:
security_release_secctx(context, contextlen);
#endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
kfree(acl);
- if (tempfh)
+ if (tempfh) {
fh_put(tempfh);
+ kfree(tempfh);
+ }
return status;
out_nfserr:
status = nfserrno(err);
--
1.8.5.3



2014-03-31 21:11:34

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [PATCH] nfsd4: fix memory leak in nfsd4_encode_fattr()

On Mon, Mar 10, 2014 at 12:52:07PM +0800, Yan, Zheng wrote:
> fh_put() does not free the temporary file handle.

Applying, sorry for the delay.--b.

>
> Signed-off-by: Yan, Zheng <[email protected]>
> ---
> fs/nfsd/nfs4xdr.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index 63f2395..8de4c9d 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -2499,8 +2499,10 @@ out:
> security_release_secctx(context, contextlen);
> #endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
> kfree(acl);
> - if (tempfh)
> + if (tempfh) {
> fh_put(tempfh);
> + kfree(tempfh);
> + }
> return status;
> out_nfserr:
> status = nfserrno(err);
> --
> 1.8.5.3
>

2014-03-10 08:29:14

by Yan, Zheng

[permalink] [raw]
Subject: Re: [PATCH] nfsd4: fix memory leak in nfsd4_encode_fattr()

On 03/10/2014 04:04 PM, Christoph Hellwig wrote:
> On Mon, Mar 10, 2014 at 12:52:07PM +0800, Yan, Zheng wrote:
>> fh_put() does not free the temporary file handle.
>
> Btw, it seems like the code to generate the file handle if it's missing
> should be moved out of nfsd4_encode_fattr and into
> nfsd4_encode_dirent_fattr or a small helper just called from there so that:
>
> a) the code flow is more obvious
> b) the calling conventions for nfsd4_encode_fattr are sensible
> c) nfsd4_encode_fattr shrinks at least a tiny bit
> d) the required cleanup becomes more obvious by being paired with the
> allocation and initialization of the FH.
>
> Just curious: which client asks for the FH or FSID in READDIRPLUS?
>

Both nfs server and client are complied from 3.14-rc5 kernel. The exported
FS is Ceph.

Regards
Yan, Zheng


2014-03-10 08:04:37

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH] nfsd4: fix memory leak in nfsd4_encode_fattr()

On Mon, Mar 10, 2014 at 12:52:07PM +0800, Yan, Zheng wrote:
> fh_put() does not free the temporary file handle.

Btw, it seems like the code to generate the file handle if it's missing
should be moved out of nfsd4_encode_fattr and into
nfsd4_encode_dirent_fattr or a small helper just called from there so that:

a) the code flow is more obvious
b) the calling conventions for nfsd4_encode_fattr are sensible
c) nfsd4_encode_fattr shrinks at least a tiny bit
d) the required cleanup becomes more obvious by being paired with the
allocation and initialization of the FH.

Just curious: which client asks for the FH or FSID in READDIRPLUS?