[PATCH] efivars: avoid potential null-dereference

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We have to check the pointer before dereferencing it. The patch fixes
such issues in the efivars module.

Signed-off-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx>
---
 drivers/firmware/efi/efivars.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c
index f256ecd..e62ef79 100644
--- a/drivers/firmware/efi/efivars.c
+++ b/drivers/firmware/efi/efivars.c
@@ -122,12 +122,14 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var);
 static ssize_t
 efivar_guid_read(struct efivar_entry *entry, char *buf)
 {
-	struct efi_variable *var = &entry->var;
+	struct efi_variable *var;
 	char *str = buf;
 
 	if (!entry || !buf)
 		return 0;
 
+	var = &entry->var;
+
 	efi_guid_unparse(&var->VendorGuid, str);
 	str += strlen(str);
 	str += sprintf(str, "\n");
@@ -138,12 +140,14 @@ efivar_guid_read(struct efivar_entry *entry, char *buf)
 static ssize_t
 efivar_attr_read(struct efivar_entry *entry, char *buf)
 {
-	struct efi_variable *var = &entry->var;
+	struct efi_variable *var;
 	char *str = buf;
 
 	if (!entry || !buf)
 		return -EINVAL;
 
+	var = &entry->var;
+
 	var->DataSize = 1024;
 	if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
 		return -EIO;
@@ -171,12 +175,14 @@ efivar_attr_read(struct efivar_entry *entry, char *buf)
 static ssize_t
 efivar_size_read(struct efivar_entry *entry, char *buf)
 {
-	struct efi_variable *var = &entry->var;
+	struct efi_variable *var;
 	char *str = buf;
 
 	if (!entry || !buf)
 		return -EINVAL;
 
+	var = &entry->var;
+
 	var->DataSize = 1024;
 	if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
 		return -EIO;
@@ -188,11 +194,13 @@ efivar_size_read(struct efivar_entry *entry, char *buf)
 static ssize_t
 efivar_data_read(struct efivar_entry *entry, char *buf)
 {
-	struct efi_variable *var = &entry->var;
+	struct efi_variable *var;
 
 	if (!entry || !buf)
 		return -EINVAL;
 
+	var = &entry->var;
+
 	var->DataSize = 1024;
 	if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
 		return -EIO;
@@ -280,7 +288,7 @@ efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count)
 		if (err)
 			return err;
 
-		copy_out_compat(&entry->var, compat);
+		copy_out_compat(var, compat);
 	} else {
 		if (count != sizeof(struct efi_variable))
 			return -EINVAL;
@@ -297,7 +305,7 @@ efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count)
 		if (err)
 			return err;
 
-		memcpy(&entry->var, new_var, count);
+		memcpy(var, new_var, count);
 	}
 
 	err = efivar_entry_set(entry, attributes, size, data, NULL);
@@ -312,13 +320,15 @@ efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count)
 static ssize_t
 efivar_show_raw(struct efivar_entry *entry, char *buf)
 {
-	struct efi_variable *var = &entry->var;
+	struct efi_variable *var;
 	struct compat_efi_variable *compat;
 	size_t size;
 
 	if (!entry || !buf)
 		return 0;
 
+	var = &entry->var;
+
 	var->DataSize = 1024;
 	if (efivar_entry_get(entry, &entry->var.Attributes,
 			     &entry->var.DataSize, entry->var.Data))
-- 
1.8.3.101.g727a46b

--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux