kern/misc, kern/efi: Extract UTF-8 to UTF-16 code

Create a new function for UTF-8 to UTF-16 conversion called
grub_utf8_to_utf16_alloc() in the grub-code/kern/misc.c and replace
charset conversion code used in some places in the EFI code. It is
modeled after the grub_utf8_to_ucs4_alloc() like functions in
include/grub/charset.h. It can't live in include/grub/charset.h,
because it needs to be reachable from the kern/efi code.

Add a check for integer overflow and remove redundant NUL-termination.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Oliver Steffen authored and Daniel Kiper committed 2023-06-01 11:45:00 +02:00
1 parent 389d3dc835
commit a0b16564ee
3 files changed
+41 -15

No files matched your search

+6 -15
View File
@@ -209,15 +209,11 @@ grub_efi_set_variable_with_attributes (const char *var, const grub_guid_t *guid,
grub_efi_status_t status;
grub_efi_runtime_services_t *r;
grub_efi_char16_t *var16;
grub_size_t len, len16;
len = grub_strlen (var);
len16 = len * GRUB_MAX_UTF16_PER_UTF8;
var16 = grub_calloc (len16 + 1, sizeof (var16[0]));
if (!var16)
grub_utf8_to_utf16_alloc (var, &var16, NULL);
if (var16 == NULL)
return grub_errno;
len16 = grub_utf8_to_utf16 (var16, len16, (grub_uint8_t *) var, len, NULL);
var16[len16] = 0;
r = grub_efi_system_table->runtime_services;
@@ -251,18 +247,13 @@ grub_efi_get_variable_with_attributes (const char *var,
grub_efi_runtime_services_t *r;
grub_efi_char16_t *var16;
void *data;
grub_size_t len, len16;
*data_out = NULL;
*datasize_out = 0;
len = grub_strlen (var);
len16 = len * GRUB_MAX_UTF16_PER_UTF8;
var16 = grub_calloc (len16 + 1, sizeof (var16[0]));
if (!var16)
return GRUB_EFI_OUT_OF_RESOURCES;
len16 = grub_utf8_to_utf16 (var16, len16, (grub_uint8_t *) var, len, NULL);
var16[len16] = 0;
grub_utf8_to_utf16_alloc (var, &var16, NULL);
if (var16 == NULL)
return grub_errno;
r = grub_efi_system_table->runtime_services;