diff options
author | Peter Jones <pjones@redhat.com> | 2016-02-08 14:48:12 -0500 |
---|---|---|
committer | Matt Fleming <matt@codeblueprint.co.uk> | 2016-02-10 08:19:14 -0500 |
commit | e0d64e6a880e64545ad7d55786aa84ab76bac475 (patch) | |
tree | fc85da9972f76592c86ff957a78cfed1362411da /fs/efivarfs/super.c | |
parent | 73500267c930baadadb0d02284909731baf151f7 (diff) |
efi: Use ucs2_as_utf8 in efivarfs instead of open coding a bad version
Translate EFI's UCS-2 variable names to UTF-8 instead of just assuming
all variable names fit in ASCII.
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>
Diffstat (limited to 'fs/efivarfs/super.c')
-rw-r--r-- | fs/efivarfs/super.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c index b8a564f29107..8651ac28ec0d 100644 --- a/fs/efivarfs/super.c +++ b/fs/efivarfs/super.c | |||
@@ -118,7 +118,7 @@ static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor, | |||
118 | struct dentry *dentry, *root = sb->s_root; | 118 | struct dentry *dentry, *root = sb->s_root; |
119 | unsigned long size = 0; | 119 | unsigned long size = 0; |
120 | char *name; | 120 | char *name; |
121 | int len, i; | 121 | int len; |
122 | int err = -ENOMEM; | 122 | int err = -ENOMEM; |
123 | 123 | ||
124 | entry = kzalloc(sizeof(*entry), GFP_KERNEL); | 124 | entry = kzalloc(sizeof(*entry), GFP_KERNEL); |
@@ -128,15 +128,14 @@ static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor, | |||
128 | memcpy(entry->var.VariableName, name16, name_size); | 128 | memcpy(entry->var.VariableName, name16, name_size); |
129 | memcpy(&(entry->var.VendorGuid), &vendor, sizeof(efi_guid_t)); | 129 | memcpy(&(entry->var.VendorGuid), &vendor, sizeof(efi_guid_t)); |
130 | 130 | ||
131 | len = ucs2_strlen(entry->var.VariableName); | 131 | len = ucs2_utf8size(entry->var.VariableName); |
132 | 132 | ||
133 | /* name, plus '-', plus GUID, plus NUL*/ | 133 | /* name, plus '-', plus GUID, plus NUL*/ |
134 | name = kmalloc(len + 1 + EFI_VARIABLE_GUID_LEN + 1, GFP_KERNEL); | 134 | name = kmalloc(len + 1 + EFI_VARIABLE_GUID_LEN + 1, GFP_KERNEL); |
135 | if (!name) | 135 | if (!name) |
136 | goto fail; | 136 | goto fail; |
137 | 137 | ||
138 | for (i = 0; i < len; i++) | 138 | ucs2_as_utf8(name, entry->var.VariableName, len); |
139 | name[i] = entry->var.VariableName[i] & 0xFF; | ||
140 | 139 | ||
141 | name[len] = '-'; | 140 | name[len] = '-'; |
142 | 141 | ||