[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 09/10] commands/bli: Extract uft8 to utf16 conversion
From: |
Oliver Steffen |
Subject: |
[PATCH v3 09/10] commands/bli: Extract uft8 to utf16 conversion |
Date: |
Thu, 2 Mar 2023 19:20:44 +0100 |
Create a new function for utf-8 to utf-16 conversion called
`grub_utf8_to_utf16_alloc` in the bli module. It is modeled after the
`grub_utf8_to_ucs4_alloc` like functions in charset.h. The goal is to
move this to a central place so that it can help reduce code
duplication.
Please comment: Where should this go?
---
grub-core/commands/bli.c | 47 ++++++++++++++++++++++++++++++----------
1 file changed, 35 insertions(+), 12 deletions(-)
diff --git a/grub-core/commands/bli.c b/grub-core/commands/bli.c
index 0ff44d58a..371eb7074 100644
--- a/grub-core/commands/bli.c
+++ b/grub-core/commands/bli.c
@@ -36,6 +36,37 @@ GRUB_MOD_LICENSE ("GPLv3+");
static const grub_guid_t bli_vendor_guid =
GRUB_EFI_VENDOR_BOOT_LOADER_INTERFACE_GUID;
+/* To be moved to a central place */
+static grub_ssize_t
+grub_utf8_to_utf16_alloc (const char *str8, grub_uint16_t **utf16_msg,
grub_uint16_t **last_position)
+{
+ grub_size_t len;
+ grub_size_t len16;
+
+ len = grub_strlen (str8);
+
+ /* Check for integer overflow */
+ if (len > GRUB_SSIZE_MAX / GRUB_MAX_UTF16_PER_UTF8 - 1)
+ {
+ grub_error (GRUB_ERR_BAD_ARGUMENT, N_("string too large"));
+ *utf16_msg = NULL;
+ return -1;
+ }
+
+ len16 = len * GRUB_MAX_UTF16_PER_UTF8;
+
+ *utf16_msg = grub_calloc (len16 + 1, sizeof (*utf16_msg[0]));
+ if (*utf16_msg == NULL)
+ return -1;
+
+ len16 = grub_utf8_to_utf16 (*utf16_msg, len16, (grub_uint8_t *) str8, len,
NULL);
+
+ if (last_position)
+ *last_position = *utf16_msg + len16;
+
+ return len16;
+}
+
static grub_err_t
get_part_uuid (grub_device_t dev, char **part_uuid)
{
@@ -91,28 +122,20 @@ get_part_uuid (grub_device_t dev, char **part_uuid)
return status;
}
+
static grub_err_t
set_efi_str_variable (const char *name, const grub_guid_t *guid,
const char *value)
{
- grub_size_t len, len16;
grub_efi_char16_t *value_16;
+ grub_ssize_t len16;
grub_err_t status;
- len = grub_strlen (value);
+ len16 = grub_utf8_to_utf16_alloc (value, &value_16, NULL);
- /* Check for integer overflow */
- if (len > GRUB_SIZE_MAX / GRUB_MAX_UTF16_PER_UTF8 - 1)
- return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("data too large"));
-
- len16 = len * GRUB_MAX_UTF16_PER_UTF8;
-
- value_16 = grub_calloc (len16 + 1, sizeof (value_16[0]));
- if (value_16 == NULL)
+ if (len16 < 0)
return grub_errno;
- len16 = grub_utf8_to_utf16 (value_16, len16, (grub_uint8_t *) value, len,
NULL);
-
status = grub_efi_set_variable_with_attributes (name, guid,
(void *) value_16, (len16 + 1) * sizeof (value_16[0]),
GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS
--
2.39.2
- Re: [PATCH v3 07/10] grub-core/kern/efi: Remove redundant null-termination, (continued)
- [PATCH v3 02/10] efi: Check for integer overflow in string conversion, Oliver Steffen, 2023/03/02
- [PATCH v3 05/10] grub-core: Make use of guid printf format specifier, Oliver Steffen, 2023/03/02
- [PATCH v3 06/10] Add a module for the Boot Loader Interface, Oliver Steffen, 2023/03/02
- [PATCH v3 08/10] types.h: Add GRUB_SSIZE_MAX, Oliver Steffen, 2023/03/02
- [PATCH v3 10/10] util/grub.d: Activate bli module on EFI, Oliver Steffen, 2023/03/02
- [PATCH v3 09/10] commands/bli: Extract uft8 to utf16 conversion,
Oliver Steffen <=