Le mar. 22 août 2023, 23:41, Vitaly Kuzmichev <vitaly.kuzmic...@rtsoft.de>
a écrit :

> This patch adds a wrapper function to perform conversion of UTF-16
> string to UTF-8 string using inline function grub_utf16_to_utf8(), but
> pre-allocating necessary space for the target buffer. This behavior is
> similar to existing inversed function grub_utf8_to_utf16_alloc()
> in kern/misc.c.
>
> Signed-off-by: Vitaly Kuzmichev <vitaly.kuzmic...@rtsoft.de>
> ---
>  include/grub/charset.h | 28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
>
> diff --git a/include/grub/charset.h b/include/grub/charset.h
> index 099f23fbe..4324fefb8 100644
> --- a/include/grub/charset.h
> +++ b/include/grub/charset.h
> @@ -20,6 +20,9 @@
>  #define GRUB_CHARSET_HEADER    1
>
>  #include <grub/types.h>
> +#include <grub/safemath.h>
> +#include <grub/mm.h>
> +#include <grub/i18n.h>
>
>  #define GRUB_UINT8_1_LEADINGBIT 0x80
>  #define GRUB_UINT8_2_LEADINGBITS 0xc0
> @@ -304,6 +307,31 @@ grub_utf16_strnlen (const void *s, grub_size_t maxlen)
>    return len;
>  }
>
> +/* Convert UTF-16 to UTF-8. Allocates buffer of necessary space. */
> +static inline grub_uint8_t *
> +grub_utf16_to_utf8_alloc (const void *utf16, grub_size_t maxlen,
> +                         grub_utf16_type_t type)
> +{
> +  grub_size_t len16, size;
> +  grub_uint8_t *utf8;
> +
> +  len16 = grub_utf16_strnlen (utf16, maxlen);
> +
> +  /* Check for integer overflow */
> +  if (grub_mul (len16, GRUB_MAX_UTF8_PER_UTF16, &size) ||
> +      grub_add (size, 1, &size))
> +    {
> +      grub_error (GRUB_ERR_BAD_ARGUMENT, N_("string too long"));
>

This is too technical error. It shouldn't be marked for translation

+      return NULL;
> +    }
> +
> +  utf8 = grub_malloc (size);
> +  if (utf8)
> +    *grub_utf16_to_utf8 (utf8, utf16, len16, type) = '\0';
> +
> +  return utf8;
> +}
> +
>  #define GRUB_MAX_UTF8_PER_LATIN1 2
>
>  /* Convert Latin1 to UTF-8.  */
> --
> 2.34.1
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to