ubifs: free the encrypted symlink target
authorEric Biggers <ebiggers@google.com>
Fri, 12 Jan 2018 04:27:00 +0000 (23:27 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Feb 2018 19:22:57 +0000 (20:22 +0100)
commit 6b46d444146eb8d0b99562795cea8086639d7282 upstream.

ubifs_symlink() forgot to free the kmalloc()'ed buffer holding the
encrypted symlink target, creating a memory leak.  Fix it.

(UBIFS could actually encrypt directly into ui->data, removing the
temporary buffer, but that is left for the patch that switches to use
the symlink helper functions.)

Fixes: ca7f85be8d6c ("ubifs: Add support for encrypted symlinks")
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/ubifs/dir.c

index 417fe0b29f23e9068d623a4e5fc582835373199c..ef820f8031765cc3ff6c3dba6fd4a76395442529 100644 (file)
@@ -1216,10 +1216,8 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,
                ostr.len = disk_link.len;
 
                err = fscrypt_fname_usr_to_disk(inode, &istr, &ostr);
-               if (err) {
-                       kfree(sd);
+               if (err)
                        goto out_inode;
-               }
 
                sd->len = cpu_to_le16(ostr.len);
                disk_link.name = (char *)sd;
@@ -1251,11 +1249,10 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,
                goto out_cancel;
        mutex_unlock(&dir_ui->ui_mutex);
 
-       ubifs_release_budget(c, &req);
        insert_inode_hash(inode);
        d_instantiate(dentry, inode);
-       fscrypt_free_filename(&nm);
-       return 0;
+       err = 0;
+       goto out_fname;
 
 out_cancel:
        dir->i_size -= sz_change;
@@ -1268,6 +1265,7 @@ out_fname:
        fscrypt_free_filename(&nm);
 out_budg:
        ubifs_release_budget(c, &req);
+       kfree(sd);
        return err;
 }