fs: EFI: Convert UTF-16LE partition names to UTF-8
authorTodd Poynor <toddpoynor@google.com>
Tue, 12 Oct 2010 23:17:04 +0000 (16:17 -0700)
committerTodd Poynor <toddpoynor@google.com>
Tue, 12 Oct 2010 23:24:27 +0000 (16:24 -0700)
Change-Id: Ib3f91913e69ca8d5a3bd644e3a01deca690067a8
Signed-off-by: Todd Poynor <toddpoynor@google.com>
fs/partitions/efi.c

index 486b4444e6a4646247a57bc9cc7b7b656616b44f..35bbbd279d7341ad67bf46376f3c1266f3770d10 100644 (file)
@@ -96,6 +96,7 @@
 #include <linux/crc32.h>
 #include <linux/math64.h>
 #include <linux/slab.h>
+#include <linux/nls.h>
 #include "check.h"
 #include "efi.h"
 
@@ -617,15 +618,20 @@ int efi_partition(struct parsed_partitions *state)
                u64 start = le64_to_cpu(ptes[i].starting_lba);
                u64 size = le64_to_cpu(ptes[i].ending_lba) -
                           le64_to_cpu(ptes[i].starting_lba) + 1ULL;
+               u8 name[sizeof(ptes->partition_name) / sizeof(efi_char16_t)];
+               int len;
 
                if (!is_pte_valid(&ptes[i], last_lba(state->bdev)))
                        continue;
 
+               len = utf16s_to_utf8s(ptes[i].partition_name,
+                                     sizeof(ptes[i].partition_name) /
+                                     sizeof(efi_char16_t),
+                                     UTF16_LITTLE_ENDIAN, name,
+                                     sizeof(name));
+
                put_named_partition(state, i+1, start * ssz, size * ssz,
-                                  (const char *) ptes[i].partition_name,
-                                   strnlen((const char *)
-                                           ptes[i].partition_name,
-                                           sizeof(ptes[i].partition_name)));
+                                   name, len);
 
                /* If this is a RAID volume, tell md */
                if (!efi_guidcmp(ptes[i].partition_type_guid,