summaryrefslogtreecommitdiff
path: root/lib/charset.c
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2019-07-14 18:28:49 +0300
committerHeinrich Schuchardt <xypron.glpk@gmx.de>2019-07-17 01:17:22 +0300
commit317068b8b6b15ad38f7aa1019310e41764c80e5b (patch)
treeaff1250e1e834310ba23ba7130e21eab87950997 /lib/charset.c
parentade317a281652354cb3d86d40a8c012b32f28497 (diff)
downloadu-boot-317068b8b6b15ad38f7aa1019310e41764c80e5b.tar.xz
efi_loader: support unaligned u16 strings
Allow unaligned u16 strings as arguments to u16_strdup() and u16_strlen(). Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'lib/charset.c')
-rw-r--r--lib/charset.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/charset.c b/lib/charset.c
index 5e349ed5ee..72d745da4f 100644
--- a/lib/charset.c
+++ b/lib/charset.c
@@ -335,11 +335,16 @@ s32 utf_to_upper(const s32 code)
return ret;
}
-size_t u16_strlen(const u16 *in)
+size_t u16_strlen(const void *in)
{
- size_t i;
- for (i = 0; in[i]; i++);
- return i;
+ const char *pos = in;
+ size_t ret;
+
+ for (; pos[0] || pos[1]; pos += 2)
+ ;
+ ret = pos - (char *)in;
+ ret >>= 1;
+ return ret;
}
size_t u16_strnlen(const u16 *in, size_t count)
@@ -362,18 +367,18 @@ u16 *u16_strcpy(u16 *dest, const u16 *src)
return tmp;
}
-u16 *u16_strdup(const u16 *src)
+u16 *u16_strdup(const void *src)
{
u16 *new;
+ size_t len;
if (!src)
return NULL;
-
- new = malloc((u16_strlen(src) + 1) * sizeof(u16));
+ len = (u16_strlen(src) + 1) * sizeof(u16);
+ new = malloc(len);
if (!new)
return NULL;
-
- u16_strcpy(new, src);
+ memcpy(new, src, len);
return new;
}