aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Waychison <mikew@google.com>2011-07-21 16:57:57 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-07 11:56:38 -0400
commit9f0c771dfaece0bca44cead53ea6df64e099ae10 (patch)
treeebb3ef1a1108498e3056a381a52da4a1028b1bb0
parent34dea1cae3e37fe34ddf7b0f7b581aebcb70db97 (diff)
efivars: String functions
commit a2940908391f3cee72e38769b30e829b22742b5b upstream. Fix the string functions in the efivars driver to be called utf16_* instead of utf8_* as the encoding is utf16, not utf8. As well, rename utf16_strlen to utf16_strnlen as it takes a maxlength argument and the name should be consistent with the standard C function names. utf16_strlen is still provided for convenience in a subsequent patch. Signed-off-by: Mike Waychison <mikew@google.com> Signed-off-by: Tony Luck <tony.luck@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/firmware/efivars.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 5f29aafd446..0ba8d69dd6c 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -141,23 +141,29 @@ efivar_create_sysfs_entry(struct efivars *efivars,
141 141
142/* Return the number of unicode characters in data */ 142/* Return the number of unicode characters in data */
143static unsigned long 143static unsigned long
144utf8_strlen(efi_char16_t *data, unsigned long maxlength) 144utf16_strnlen(efi_char16_t *s, size_t maxlength)
145{ 145{
146 unsigned long length = 0; 146 unsigned long length = 0;
147 147
148 while (*data++ != 0 && length < maxlength) 148 while (*s++ != 0 && length < maxlength)
149 length++; 149 length++;
150 return length; 150 return length;
151} 151}
152 152
153static unsigned long
154utf16_strlen(efi_char16_t *s)
155{
156 return utf16_strnlen(s, ~0UL);
157}
158
153/* 159/*
154 * Return the number of bytes is the length of this string 160 * Return the number of bytes is the length of this string
155 * Note: this is NOT the same as the number of unicode characters 161 * Note: this is NOT the same as the number of unicode characters
156 */ 162 */
157static inline unsigned long 163static inline unsigned long
158utf8_strsize(efi_char16_t *data, unsigned long maxlength) 164utf16_strsize(efi_char16_t *data, unsigned long maxlength)
159{ 165{
160 return utf8_strlen(data, maxlength/sizeof(efi_char16_t)) * sizeof(efi_char16_t); 166 return utf16_strnlen(data, maxlength/sizeof(efi_char16_t)) * sizeof(efi_char16_t);
161} 167}
162 168
163static efi_status_t 169static efi_status_t
@@ -414,8 +420,8 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
414 * Does this variable already exist? 420 * Does this variable already exist?
415 */ 421 */
416 list_for_each_entry_safe(search_efivar, n, &efivars->list, list) { 422 list_for_each_entry_safe(search_efivar, n, &efivars->list, list) {
417 strsize1 = utf8_strsize(search_efivar->var.VariableName, 1024); 423 strsize1 = utf16_strsize(search_efivar->var.VariableName, 1024);
418 strsize2 = utf8_strsize(new_var->VariableName, 1024); 424 strsize2 = utf16_strsize(new_var->VariableName, 1024);
419 if (strsize1 == strsize2 && 425 if (strsize1 == strsize2 &&
420 !memcmp(&(search_efivar->var.VariableName), 426 !memcmp(&(search_efivar->var.VariableName),
421 new_var->VariableName, strsize1) && 427 new_var->VariableName, strsize1) &&
@@ -447,8 +453,8 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
447 453
448 /* Create the entry in sysfs. Locking is not required here */ 454 /* Create the entry in sysfs. Locking is not required here */
449 status = efivar_create_sysfs_entry(efivars, 455 status = efivar_create_sysfs_entry(efivars,
450 utf8_strsize(new_var->VariableName, 456 utf16_strsize(new_var->VariableName,
451 1024), 457 1024),
452 new_var->VariableName, 458 new_var->VariableName,
453 &new_var->VendorGuid); 459 &new_var->VendorGuid);
454 if (status) { 460 if (status) {
@@ -477,8 +483,8 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
477 * Does this variable already exist? 483 * Does this variable already exist?
478 */ 484 */
479 list_for_each_entry_safe(search_efivar, n, &efivars->list, list) { 485 list_for_each_entry_safe(search_efivar, n, &efivars->list, list) {
480 strsize1 = utf8_strsize(search_efivar->var.VariableName, 1024); 486 strsize1 = utf16_strsize(search_efivar->var.VariableName, 1024);
481 strsize2 = utf8_strsize(del_var->VariableName, 1024); 487 strsize2 = utf16_strsize(del_var->VariableName, 1024);
482 if (strsize1 == strsize2 && 488 if (strsize1 == strsize2 &&
483 !memcmp(&(search_efivar->var.VariableName), 489 !memcmp(&(search_efivar->var.VariableName),
484 del_var->VariableName, strsize1) && 490 del_var->VariableName, strsize1) &&