aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUpendra <upendra.baveja@sony.com>2018-03-01 17:15:48 +0900
committerJeff Sharkey <jsharkey@android.com>2018-03-30 11:41:05 -0600
commit25715073b170970469126426196c9e5084613c37 (patch)
treeb3f1b739c12c9755702c62c70f747ea7c590e393
parentdf7ac4ef2465ecb0e4ba60143636b644b3752ae0 (diff)
downloade2fsprogs-25715073b170970469126426196c9e5084613c37.tar.gz
blkid: Correct the label name for exfatandroid-p-preview-3android-p-preview-2p-preview-2
Volume label name is 16 bit unicode string according to spec. Currently blkid labels the device without converting it to utf-8 chars due to which incorrect label is displayed. Bug: 74184636 Test: manual Change-Id: Ib16204c75c2cdf675d480e9c66f484bb3c51108e
-rw-r--r--lib/blkid/probe.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/lib/blkid/probe.c b/lib/blkid/probe.c
index 865d9aa3..0293b903 100644
--- a/lib/blkid/probe.c
+++ b/lib/blkid/probe.c
@@ -1160,6 +1160,37 @@ static void unicode_16be_to_utf8(unsigned char *str, int out_len,
str[j] = '\0';
}
+static void unicode_16le_to_utf8(unsigned char *str, int out_len,
+ const unsigned char *buf, int in_len)
+{
+ int i, j;
+ unsigned int c;
+
+ for (i = j = 0; i + 2 <= in_len; i += 2) {
+ c = (buf[i+1] << 8) | buf[i];
+ if (c == 0) {
+ str[j] = '\0';
+ break;
+ } else if (c < 0x80) {
+ if (j+1 >= out_len)
+ break;
+ str[j++] = (unsigned char) c;
+ } else if (c < 0x800) {
+ if (j+2 >= out_len)
+ break;
+ str[j++] = (unsigned char) (0xc0 | (c >> 6));
+ str[j++] = (unsigned char) (0x80 | (c & 0x3f));
+ } else {
+ if (j+3 >= out_len)
+ break;
+ str[j++] = (unsigned char) (0xe0 | (c >> 12));
+ str[j++] = (unsigned char) (0x80 | ((c >> 6) & 0x3f));
+ str[j++] = (unsigned char) (0x80 | (c & 0x3f));
+ }
+ }
+ str[j] = '\0';
+}
+
static int probe_hfs(struct blkid_probe *probe __BLKID_ATTR((unused)),
struct blkid_magic *id __BLKID_ATTR((unused)),
unsigned char *buf)
@@ -1482,7 +1513,9 @@ static int probe_exfat(struct blkid_probe *probe, struct blkid_magic *id,
label = find_exfat_entry_label(probe, sb);
if (label) {
- blkid_set_tag(probe->dev, "LABEL", label->name, label->length);
+ char utf8_label[128];
+ unicode_16le_to_utf8(utf8_label, sizeof(utf8_label), label->name, label->length * 2);
+ blkid_set_tag(probe->dev, "LABEL", utf8_label, 0);
} else {
blkid_set_tag(probe->dev, "LABEL", "disk", 4);
}