aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
authorAndy Whitcroft <apw@canonical.com>2012-10-11 06:32:18 -0400
committerMatt Fleming <matt.fleming@intel.com>2012-10-30 06:39:22 -0400
commit45a937a883c4411648b80e87341b237cc48009c1 (patch)
treeadb0a27e66289e33fd191e93a90f4bb228f3981b /drivers/firmware
parentd142df03a798ee7d2db10a1f20945110ea6067ff (diff)
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>
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/efivars.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index b7c9a3261dc4..6e5f367145f5 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -866,7 +866,7 @@ static void efivarfs_hex_to_guid(const char *str, efi_guid_t *guid)
866static int efivarfs_create(struct inode *dir, struct dentry *dentry, 866static int efivarfs_create(struct inode *dir, struct dentry *dentry,
867 umode_t mode, bool excl) 867 umode_t mode, bool excl)
868{ 868{
869 struct inode *inode = efivarfs_get_inode(dir->i_sb, dir, mode, 0); 869 struct inode *inode;
870 struct efivars *efivars = &__efivars; 870 struct efivars *efivars = &__efivars;
871 struct efivar_entry *var; 871 struct efivar_entry *var;
872 int namelen, i = 0, err = 0; 872 int namelen, i = 0, err = 0;
@@ -874,13 +874,15 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry,
874 if (dentry->d_name.len < 38) 874 if (dentry->d_name.len < 38)
875 return -EINVAL; 875 return -EINVAL;
876 876
877 inode = efivarfs_get_inode(dir->i_sb, dir, mode, 0);
877 if (!inode) 878 if (!inode)
878 return -ENOSPC; 879 return -ENOSPC;
879 880
880 var = kzalloc(sizeof(struct efivar_entry), GFP_KERNEL); 881 var = kzalloc(sizeof(struct efivar_entry), GFP_KERNEL);
881 882 if (!var) {
882 if (!var) 883 err = -ENOMEM;
883 return -ENOMEM; 884 goto out;
885 }
884 886
885 namelen = dentry->d_name.len - GUID_LEN; 887 namelen = dentry->d_name.len - GUID_LEN;
886 888
@@ -908,8 +910,10 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry,
908 d_instantiate(dentry, inode); 910 d_instantiate(dentry, inode);
909 dget(dentry); 911 dget(dentry);
910out: 912out:
911 if (err) 913 if (err) {
912 kfree(var); 914 kfree(var);
915 iput(inode);
916 }
913 return err; 917 return err;
914} 918}
915 919