Skip to content

Commit

Permalink
efi: Do variable name validation tests in utf8
Browse files Browse the repository at this point in the history
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: Peter Jones <pjones@redhat.com>
Acked-by: Matthew Garrett <mjg59@coreos.com>
Tested-by: Lee, Chun-Yi <jlee@suse.com>
Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
  • Loading branch information
Peter Jones authored and Matt Fleming committed Feb 10, 2016
1 parent e0d64e6 commit 3dcb1f5
Showing 1 changed file with 21 additions and 11 deletions.
32 changes: 21 additions & 11 deletions drivers/firmware/efi/vars.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,39 +189,49 @@ static const struct variable_validate variable_validate[] = {
};

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;
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++) {
const char *name = variable_validate[i].name;
int match;

for (match = 0; ; match++) {
char c = name[match];
u16 u = unicode_name[match];

/* All special variables are plain ascii */
if (u > 127)
return true;
char u = utf8_name[match];

/* Wildcard in the matching name means we've matched */
if (c == '*')
if (c == '*') {
kfree(utf8_name);
return variable_validate[i].validate(var_name,
match, data, len);
match, data, data_size);
}

/* Case sensitive match */
if (c != u)
break;

/* Reached the end of the string while matching */
if (!c)
if (!c) {
kfree(utf8_name);
return variable_validate[i].validate(var_name,
match, data, len);
match, data, data_size);
}
}
}

kfree(utf8_name);
return true;
}
EXPORT_SYMBOL_GPL(efivar_validate);
Expand Down

0 comments on commit 3dcb1f5

Please sign in to comment.