Commit bb50c632 authored by Hyunchul Lee's avatar Hyunchul Lee Committed by Richard Weinberger

ubifs: Fix memory leak in RENAME_WHITEOUT error path in do_rename

in RENAME_WHITEOUT error path, fscrypt_name should be freed.
Signed-off-by: default avatarHyunchul Lee <cheol.lee@lge.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 4d35ca4f
...@@ -1396,17 +1396,14 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -1396,17 +1396,14 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
dev = kmalloc(sizeof(union ubifs_dev_desc), GFP_NOFS); dev = kmalloc(sizeof(union ubifs_dev_desc), GFP_NOFS);
if (!dev) { if (!dev) {
ubifs_release_budget(c, &req); err = -ENOMEM;
ubifs_release_budget(c, &ino_req); goto out_release;
return -ENOMEM;
} }
err = do_tmpfile(old_dir, old_dentry, S_IFCHR | WHITEOUT_MODE, &whiteout); err = do_tmpfile(old_dir, old_dentry, S_IFCHR | WHITEOUT_MODE, &whiteout);
if (err) { if (err) {
ubifs_release_budget(c, &req);
ubifs_release_budget(c, &ino_req);
kfree(dev); kfree(dev);
return err; goto out_release;
} }
whiteout->i_state |= I_LINKABLE; whiteout->i_state |= I_LINKABLE;
...@@ -1494,12 +1491,10 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -1494,12 +1491,10 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
err = ubifs_budget_space(c, &wht_req); err = ubifs_budget_space(c, &wht_req);
if (err) { if (err) {
ubifs_release_budget(c, &req);
ubifs_release_budget(c, &ino_req);
kfree(whiteout_ui->data); kfree(whiteout_ui->data);
whiteout_ui->data_len = 0; whiteout_ui->data_len = 0;
iput(whiteout); iput(whiteout);
return err; goto out_release;
} }
inc_nlink(whiteout); inc_nlink(whiteout);
...@@ -1554,6 +1549,7 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -1554,6 +1549,7 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
iput(whiteout); iput(whiteout);
} }
unlock_4_inodes(old_dir, new_dir, new_inode, whiteout); unlock_4_inodes(old_dir, new_dir, new_inode, whiteout);
out_release:
ubifs_release_budget(c, &ino_req); ubifs_release_budget(c, &ino_req);
ubifs_release_budget(c, &req); ubifs_release_budget(c, &req);
fscrypt_free_filename(&old_nm); fscrypt_free_filename(&old_nm);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment