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 b7c9a3261dc..6e5f367145f 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 | ||
