diff options
author | Kinglong Mee <kinglongmee@gmail.com> | 2015-07-06 22:13:02 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2015-07-20 14:58:45 -0400 |
commit | 4691b271ac3a3bdc0d7d886e4715163eb4fb4bc7 (patch) | |
tree | a4e55446ef3aac56131595a8a0953eb74388809f | |
parent | 1ca4b88e7de23f6f86d2009101fe42d5b9dbf3de (diff) |
nfsd: Fix a memory leak in nfsd4_list_rec_dir()
If lookup_one_len() failed, nfsd should free those memory allocated for fname.
Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r-- | fs/nfsd/nfs4recover.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index d88ea7b9a85c..591bfbdf0316 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c | |||
@@ -272,6 +272,7 @@ nfsd4_list_rec_dir(recdir_func *f, struct nfsd_net *nn) | |||
272 | .ctx.actor = nfsd4_build_namelist, | 272 | .ctx.actor = nfsd4_build_namelist, |
273 | .names = LIST_HEAD_INIT(ctx.names) | 273 | .names = LIST_HEAD_INIT(ctx.names) |
274 | }; | 274 | }; |
275 | struct name_list *entry, *tmp; | ||
275 | int status; | 276 | int status; |
276 | 277 | ||
277 | status = nfs4_save_creds(&original_cred); | 278 | status = nfs4_save_creds(&original_cred); |
@@ -286,9 +287,8 @@ nfsd4_list_rec_dir(recdir_func *f, struct nfsd_net *nn) | |||
286 | 287 | ||
287 | status = iterate_dir(nn->rec_file, &ctx.ctx); | 288 | status = iterate_dir(nn->rec_file, &ctx.ctx); |
288 | mutex_lock_nested(&d_inode(dir)->i_mutex, I_MUTEX_PARENT); | 289 | mutex_lock_nested(&d_inode(dir)->i_mutex, I_MUTEX_PARENT); |
289 | while (!list_empty(&ctx.names)) { | 290 | |
290 | struct name_list *entry; | 291 | list_for_each_entry_safe(entry, tmp, &ctx.names, list) { |
291 | entry = list_entry(ctx.names.next, struct name_list, list); | ||
292 | if (!status) { | 292 | if (!status) { |
293 | struct dentry *dentry; | 293 | struct dentry *dentry; |
294 | dentry = lookup_one_len(entry->name, dir, HEXDIR_LEN-1); | 294 | dentry = lookup_one_len(entry->name, dir, HEXDIR_LEN-1); |
@@ -304,6 +304,12 @@ nfsd4_list_rec_dir(recdir_func *f, struct nfsd_net *nn) | |||
304 | } | 304 | } |
305 | mutex_unlock(&d_inode(dir)->i_mutex); | 305 | mutex_unlock(&d_inode(dir)->i_mutex); |
306 | nfs4_reset_creds(original_cred); | 306 | nfs4_reset_creds(original_cred); |
307 | |||
308 | list_for_each_entry_safe(entry, tmp, &ctx.names, list) { | ||
309 | dprintk("NFSD: %s. Left entry %s\n", __func__, entry->name); | ||
310 | list_del(&entry->list); | ||
311 | kfree(entry); | ||
312 | } | ||
307 | return status; | 313 | return status; |
308 | } | 314 | } |
309 | 315 | ||