diff options
author | Andy Whitcroft <apw@canonical.com> | 2012-10-11 06:32:18 -0400 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2012-10-30 06:39:22 -0400 |
commit | 45a937a883c4411648b80e87341b237cc48009c1 (patch) | |
tree | adb0a27e66289e33fd191e93a90f4bb228f3981b /drivers/firmware | |
parent | d142df03a798ee7d2db10a1f20945110ea6067ff (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.c | 14 |
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) | |||
866 | static int efivarfs_create(struct inode *dir, struct dentry *dentry, | 866 | static 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); |
910 | out: | 912 | out: |
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 | ||