Commit 83339a04 authored by Peter Jones's avatar Peter Jones Committed by Kamal Mostafa

efi: Do variable name validation tests in utf8

commit 3dcb1f55 upstream.

Actually translate from ucs2 to utf8 before doing the test, and then
test against our other utf8 data, instead of fudging it.
Signed-off-by: default avatarPeter Jones <pjones@redhat.com>
Acked-by: default avatarMatthew Garrett <mjg59@coreos.com>
Tested-by: default avatarLee, Chun-Yi <jlee@suse.com>
Signed-off-by: default avatarMatt Fleming <matt@codeblueprint.co.uk>
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
parent 991846ad
...@@ -189,10 +189,19 @@ static const struct variable_validate variable_validate[] = { ...@@ -189,10 +189,19 @@ static const struct variable_validate variable_validate[] = {
}; };
bool bool
efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long len) efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long data_size)
{ {
int i; int i;
u16 *unicode_name = var_name; unsigned long utf8_size;
u8 *utf8_name;
utf8_size = ucs2_utf8size(var_name);
utf8_name = kmalloc(utf8_size + 1, GFP_KERNEL);
if (!utf8_name)
return false;
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].validate != NULL; i++) {
const char *name = variable_validate[i].name; const char *name = variable_validate[i].name;
...@@ -200,28 +209,29 @@ efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long len) ...@@ -200,28 +209,29 @@ efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long len)
for (match = 0; ; match++) { for (match = 0; ; match++) {
char c = name[match]; char c = name[match];
u16 u = unicode_name[match]; char u = utf8_name[match];
/* All special variables are plain ascii */
if (u > 127)
return true;
/* Wildcard in the matching name means we've matched */ /* Wildcard in the matching name means we've matched */
if (c == '*') if (c == '*') {
kfree(utf8_name);
return variable_validate[i].validate(var_name, return variable_validate[i].validate(var_name,
match, data, len); match, data, data_size);
}
/* Case sensitive match */ /* Case sensitive match */
if (c != u) if (c != u)
break; break;
/* Reached the end of the string while matching */ /* Reached the end of the string while matching */
if (!c) if (!c) {
kfree(utf8_name);
return variable_validate[i].validate(var_name, return variable_validate[i].validate(var_name,
match, data, len); match, data, data_size);
}
} }
} }
kfree(utf8_name);
return true; return true;
} }
EXPORT_SYMBOL_GPL(efivar_validate); EXPORT_SYMBOL_GPL(efivar_validate);
......
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