diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2019-07-14 17:28:49 +0200 |
---|---|---|
committer | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2019-07-16 22:17:22 +0000 |
commit | 317068b8b6b15ad38f7aa1019310e41764c80e5b (patch) | |
tree | aff1250e1e834310ba23ba7130e21eab87950997 /lib | |
parent | ade317a281652354cb3d86d40a8c012b32f28497 (diff) | |
download | u-boot-317068b8b6b15ad38f7aa1019310e41764c80e5b.zip u-boot-317068b8b6b15ad38f7aa1019310e41764c80e5b.tar.gz u-boot-317068b8b6b15ad38f7aa1019310e41764c80e5b.tar.bz2 |
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')
-rw-r--r-- | lib/charset.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/charset.c b/lib/charset.c index 5e349ed..72d745d 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; } |