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>
This commit is contained in:
Heinrich Schuchardt 2019-07-14 17:28:49 +02:00
parent ade317a281
commit 317068b8b6
2 changed files with 16 additions and 11 deletions

View File

@ -178,7 +178,7 @@ s32 utf_to_upper(const s32 code);
* ReturnValue: number of non-zero words. * ReturnValue: number of non-zero words.
* This is not the number of utf-16 letters! * This is not the number of utf-16 letters!
*/ */
size_t u16_strlen(const u16 *in); size_t u16_strlen(const void *in);
/** /**
* u16_strlen - count non-zero words * u16_strlen - count non-zero words
@ -214,7 +214,7 @@ u16 *u16_strcpy(u16 *dest, const u16 *src);
* @src: source buffer (null terminated) * @src: source buffer (null terminated)
* Return: allocated new buffer on success, NULL on failure * Return: allocated new buffer on success, NULL on failure
*/ */
u16 *u16_strdup(const u16 *src); u16 *u16_strdup(const void *src);
/** /**
* utf16_to_utf8() - Convert an utf16 string to utf8 * utf16_to_utf8() - Convert an utf16 string to utf8

View File

@ -335,11 +335,16 @@ s32 utf_to_upper(const s32 code)
return ret; return ret;
} }
size_t u16_strlen(const u16 *in) size_t u16_strlen(const void *in)
{ {
size_t i; const char *pos = in;
for (i = 0; in[i]; i++); size_t ret;
return i;
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) size_t u16_strnlen(const u16 *in, size_t count)
@ -362,18 +367,18 @@ u16 *u16_strcpy(u16 *dest, const u16 *src)
return tmp; return tmp;
} }
u16 *u16_strdup(const u16 *src) u16 *u16_strdup(const void *src)
{ {
u16 *new; u16 *new;
size_t len;
if (!src) if (!src)
return NULL; return NULL;
len = (u16_strlen(src) + 1) * sizeof(u16);
new = malloc((u16_strlen(src) + 1) * sizeof(u16)); new = malloc(len);
if (!new) if (!new)
return NULL; return NULL;
memcpy(new, src, len);
u16_strcpy(new, src);
return new; return new;
} }