Skip to content

Commit

Permalink
efivarfs: efivarfs_fill_super() ensure we clean up correctly on error
Browse files Browse the repository at this point in the history
Ensure we free both the name and inode on error when building the
individual variables.

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>
  • Loading branch information
Andy Whitcroft authored and Matt Fleming committed Oct 30, 2012
1 parent c0359db commit 5ba6e29
Showing 1 changed file with 18 additions and 2 deletions.
20 changes: 18 additions & 2 deletions drivers/firmware/efivars.c
Original file line number Diff line number Diff line change
Expand Up @@ -948,6 +948,7 @@ int efivarfs_fill_super(struct super_block *sb, void *data, int silent)
struct dentry *root;
struct efivar_entry *entry, *n;
struct efivars *efivars = &__efivars;
char *name;

efivarfs_sb = sb;

Expand All @@ -969,16 +970,18 @@ int efivarfs_fill_super(struct super_block *sb, void *data, int silent)
return -ENOMEM;

list_for_each_entry_safe(entry, n, &efivars->list, list) {
struct inode *inode;
struct dentry *dentry, *root = efivarfs_sb->s_root;
char *name;
unsigned long size = 0;
int len, i;

inode = NULL;

len = utf16_strlen(entry->var.VariableName);

/* GUID plus trailing NULL */
name = kmalloc(len + 38, GFP_ATOMIC);
if (!name)
goto fail;

for (i = 0; i < len; i++)
name[i] = entry->var.VariableName[i] & 0xFF;
Expand All @@ -991,7 +994,13 @@ int efivarfs_fill_super(struct super_block *sb, void *data, int silent)

inode = efivarfs_get_inode(efivarfs_sb, root->d_inode,
S_IFREG | 0644, 0);
if (!inode)
goto fail_name;

dentry = d_alloc_name(root, name);
if (!dentry)
goto fail_inode;

/* copied by the above to local storage in the dentry. */
kfree(name);

Expand All @@ -1009,6 +1018,13 @@ int efivarfs_fill_super(struct super_block *sb, void *data, int silent)
}

return 0;

fail_inode:
iput(inode);
fail_name:
kfree(name);
fail:
return -ENOMEM;
}

static struct dentry *efivarfs_mount(struct file_system_type *fs_type,
Expand Down

0 comments on commit 5ba6e29

Please sign in to comment.