Re: [PATCH BlueZ] gobex: Replace g_convert by utf16_to_utf8

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Frédéric,

On Tue, Sep 3, 2024 at 12:11 PM Frédéric Danis
<frederic.danis@xxxxxxxxxxxxx> wrote:
>
> g_lib may be built without the gconv modules for UTF-16, which
> prevent to use g_convert().
> This commit replaces it by a function similar to the existing
> utf8_to_utf16() function.
> ---
>  gobex/gobex-header.c | 39 +++++++++++++++++++++++++++++++++------
>  1 file changed, 33 insertions(+), 6 deletions(-)
>
> diff --git a/gobex/gobex-header.c b/gobex/gobex-header.c
> index 002ba8861..b43374da6 100644
> --- a/gobex/gobex-header.c
> +++ b/gobex/gobex-header.c
> @@ -62,6 +62,32 @@ static glong utf8_to_utf16(gunichar2 **utf16, const char *utf8) {
>         return utf16_len;
>  }
>
> +static glong utf16_to_utf8(char **utf8, const gunichar2 *utf16, glong len,
> +                               GError **err)
> +{
> +       glong utf8_len;
> +       int i;
> +       gunichar2 *buf;
> +
> +       if (*utf16 == '\0') {
> +               *utf8 = NULL;
> +               return 0;
> +       }
> +
> +       /* OBEX requires network byteorder (big endian) UTF-16
> +        * but g_utf16_to_utf8 expects host-byteorder UTF-8
> +        */
> +       buf = g_malloc0(sizeof(gunichar2) * len);
> +       for (i = 0; i < len; i++)
> +               (buf)[i] = g_ntohs(utf16[i]);

Shouldn't the buf variable be freed before going out of scope? Or is
it reused as return by g_utf16_to_utf8? Perhaps we could use a stack
variable instead?

> +       *utf8 = g_utf16_to_utf8(buf, -1, NULL, &utf8_len, err);
> +       if (*utf8 == NULL)
> +               return -1;
> +
> +       return utf8_len;
> +}
> +
>  static guint8 *put_bytes(guint8 *to, const void *from, gsize count)
>  {
>         memcpy(to, from, count);
> @@ -130,7 +156,7 @@ GObexHeader *g_obex_header_decode(const void *data, gsize len,
>         GObexHeader *header;
>         const guint8 *ptr = data;
>         guint16 hdr_len;
> -       gsize str_len;
> +       glong str_len;
>         GError *conv_err = NULL;
>
>         if (len < 2) {
> @@ -177,13 +203,14 @@ GObexHeader *g_obex_header_decode(const void *data, gsize len,
>                         goto failed;
>                 }
>
> -               header->v.string = g_convert((const char *) ptr, hdr_len - 5,
> -                                               "UTF-8", "UTF-16BE",
> -                                               NULL, &str_len, &conv_err);
> -               if (header->v.string == NULL) {
> +               str_len = utf16_to_utf8(&header->v.string,
> +                                       (const gunichar2 *) ptr,
> +                                       hdr_len - 5,
> +                                       &conv_err);
> +               if (str_len < 0) {
>                         g_set_error(err, G_OBEX_ERROR,
>                                         G_OBEX_ERROR_PARSE_ERROR,
> -                                       "Unicode conversion failed: %s",
> +                                       "UTF16 to UTF8 conversion failed: %s",
>                                         conv_err->message);
>                         g_error_free(conv_err);
>                         goto failed;
> --
> 2.34.1
>
>


-- 
Luiz Augusto von Dentz





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux