|
@@ -165,31 +165,42 @@ validate_ascii_string(efi_char16_t *var_name, int match, u8 *buffer,
|
|
|
}
|
|
|
|
|
|
struct variable_validate {
|
|
|
+ efi_guid_t vendor;
|
|
|
char *name;
|
|
|
bool (*validate)(efi_char16_t *var_name, int match, u8 *data,
|
|
|
unsigned long len);
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * This is the list of variables we need to validate.
|
|
|
+ *
|
|
|
+ * If it has a validate() method that's not NULL, it'll go into the
|
|
|
+ * validation routine. If not, it is assumed valid.
|
|
|
+ *
|
|
|
+ * Note that it's sorted by {vendor,name}, but globbed names must come after
|
|
|
+ * any other name with the same prefix.
|
|
|
+ */
|
|
|
static const struct variable_validate variable_validate[] = {
|
|
|
- { "BootNext", validate_uint16 },
|
|
|
- { "BootOrder", validate_boot_order },
|
|
|
- { "DriverOrder", validate_boot_order },
|
|
|
- { "Boot*", validate_load_option },
|
|
|
- { "Driver*", validate_load_option },
|
|
|
- { "ConIn", validate_device_path },
|
|
|
- { "ConInDev", validate_device_path },
|
|
|
- { "ConOut", validate_device_path },
|
|
|
- { "ConOutDev", validate_device_path },
|
|
|
- { "ErrOut", validate_device_path },
|
|
|
- { "ErrOutDev", validate_device_path },
|
|
|
- { "Timeout", validate_uint16 },
|
|
|
- { "Lang", validate_ascii_string },
|
|
|
- { "PlatformLang", validate_ascii_string },
|
|
|
- { "", NULL },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "BootNext", validate_uint16 },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "BootOrder", validate_boot_order },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "Boot*", validate_load_option },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "DriverOrder", validate_boot_order },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "Driver*", validate_load_option },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "ConIn", validate_device_path },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "ConInDev", validate_device_path },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "ConOut", validate_device_path },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "ConOutDev", validate_device_path },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "ErrOut", validate_device_path },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "ErrOutDev", validate_device_path },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "Lang", validate_ascii_string },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "PlatformLang", validate_ascii_string },
|
|
|
+ { EFI_GLOBAL_VARIABLE_GUID, "Timeout", validate_uint16 },
|
|
|
+ { NULL_GUID, "", NULL },
|
|
|
};
|
|
|
|
|
|
bool
|
|
|
-efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long data_size)
|
|
|
+efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
|
|
|
+ unsigned long data_size)
|
|
|
{
|
|
|
int i;
|
|
|
unsigned long utf8_size;
|
|
@@ -203,9 +214,12 @@ efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long data_size)
|
|
|
ucs2_as_utf8(utf8_name, var_name, utf8_size);
|
|
|
utf8_name[utf8_size] = '\0';
|
|
|
|
|
|
- for (i = 0; variable_validate[i].validate != NULL; i++) {
|
|
|
+ for (i = 0; variable_validate[i].name[0] != '\0'; i++) {
|
|
|
const char *name = variable_validate[i].name;
|
|
|
- int match;
|
|
|
+ int match = 0;
|
|
|
+
|
|
|
+ if (efi_guidcmp(vendor, variable_validate[i].vendor))
|
|
|
+ continue;
|
|
|
|
|
|
for (match = 0; ; match++) {
|
|
|
char c = name[match];
|
|
@@ -862,7 +876,7 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
|
|
|
|
|
|
*set = false;
|
|
|
|
|
|
- if (efivar_validate(name, data, *size) == false)
|
|
|
+ if (efivar_validate(*vendor, name, data, *size) == false)
|
|
|
return -EINVAL;
|
|
|
|
|
|
/*
|