forked from Minki/linux
efivarfs: efivarfs_create() ensure we drop our reference on inode on error
Signed-off-by: Andy Whitcroft <apw@canonical.com> Acked-by: Matthew Garrett <mjg@redhat.com> Acked-by: Jeremy Kerr <jeremy.kerr@canonical.com> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
This commit is contained in:
parent
d142df03a7
commit
45a937a883
@ -866,7 +866,7 @@ static void efivarfs_hex_to_guid(const char *str, efi_guid_t *guid)
|
||||
static int efivarfs_create(struct inode *dir, struct dentry *dentry,
|
||||
umode_t mode, bool excl)
|
||||
{
|
||||
struct inode *inode = efivarfs_get_inode(dir->i_sb, dir, mode, 0);
|
||||
struct inode *inode;
|
||||
struct efivars *efivars = &__efivars;
|
||||
struct efivar_entry *var;
|
||||
int namelen, i = 0, err = 0;
|
||||
@ -874,13 +874,15 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry,
|
||||
if (dentry->d_name.len < 38)
|
||||
return -EINVAL;
|
||||
|
||||
inode = efivarfs_get_inode(dir->i_sb, dir, mode, 0);
|
||||
if (!inode)
|
||||
return -ENOSPC;
|
||||
|
||||
var = kzalloc(sizeof(struct efivar_entry), GFP_KERNEL);
|
||||
|
||||
if (!var)
|
||||
return -ENOMEM;
|
||||
if (!var) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
namelen = dentry->d_name.len - GUID_LEN;
|
||||
|
||||
@ -908,8 +910,10 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry,
|
||||
d_instantiate(dentry, inode);
|
||||
dget(dentry);
|
||||
out:
|
||||
if (err)
|
||||
if (err) {
|
||||
kfree(var);
|
||||
iput(inode);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user