Commit 5e7409c1 authored by Panagiotis Issaris's avatar Panagiotis Issaris Committed by Linus Torvalds

[PATCH] efi: fix failure handling

The EFI driver allocates memory and writes into it without checking the
success of the allocation.  Furthermore, on failure of the
firmware_register() it doesn't free the allocated memory and on failure of
the subsys_create_file() calls it returns zero instead of the errorcode.
Signed-off-by: default avatarPanagiotis Issaris <panagiotis.issaris@mech.kuleuven.ac.be>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 669479ba
...@@ -665,14 +665,22 @@ efivars_init(void) ...@@ -665,14 +665,22 @@ efivars_init(void)
{ {
efi_status_t status = EFI_NOT_FOUND; efi_status_t status = EFI_NOT_FOUND;
efi_guid_t vendor_guid; efi_guid_t vendor_guid;
efi_char16_t *variable_name = kmalloc(1024, GFP_KERNEL); efi_char16_t *variable_name;
struct subsys_attribute *attr; struct subsys_attribute *attr;
unsigned long variable_name_size = 1024; unsigned long variable_name_size = 1024;
int i, rc = 0, error = 0; int i, error = 0;
if (!efi_enabled) if (!efi_enabled)
return -ENODEV; return -ENODEV;
variable_name = kmalloc(variable_name_size, GFP_KERNEL);
if (!variable_name) {
printk(KERN_ERR "efivars: Memory allocation failed.\n");
return -ENOMEM;
}
memset(variable_name, 0, variable_name_size);
printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION, printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION,
EFIVARS_DATE); EFIVARS_DATE);
...@@ -680,21 +688,27 @@ efivars_init(void) ...@@ -680,21 +688,27 @@ efivars_init(void)
* For now we'll register the efi subsys within this driver * For now we'll register the efi subsys within this driver
*/ */
rc = firmware_register(&efi_subsys); error = firmware_register(&efi_subsys);
if (rc) if (error) {
return rc; printk(KERN_ERR "efivars: Firmware registration failed with error %d.\n", error);
goto out_free;
}
kset_set_kset_s(&vars_subsys, efi_subsys); kset_set_kset_s(&vars_subsys, efi_subsys);
subsystem_register(&vars_subsys);
error = subsystem_register(&vars_subsys);
if (error) {
printk(KERN_ERR "efivars: Subsystem registration failed with error %d.\n", error);
goto out_firmware_unregister;
}
/* /*
* Per EFI spec, the maximum storage allocated for both * Per EFI spec, the maximum storage allocated for both
* the variable name and variable data is 1024 bytes. * the variable name and variable data is 1024 bytes.
*/ */
memset(variable_name, 0, 1024);
do { do {
variable_name_size = 1024; variable_name_size = 1024;
...@@ -734,8 +748,20 @@ efivars_init(void) ...@@ -734,8 +748,20 @@ efivars_init(void)
error = subsys_create_file(&efi_subsys, attr); error = subsys_create_file(&efi_subsys, attr);
} }
if (error)
printk(KERN_ERR "efivars: Sysfs attribute export failed with error %d.\n", error);
else
goto out_free;
subsystem_unregister(&vars_subsys);
out_firmware_unregister:
firmware_unregister(&efi_subsys);
out_free:
kfree(variable_name); kfree(variable_name);
return 0;
return error;
} }
static void __exit static void __exit
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment