[PATCH v5 07/10] mbim-message: Add support for parsing both UTF8/16 strings
Muhammad Asif <[email protected]> Thu, 27 Nov 2025 22:49:41 +0500
| Newsgroups | dev.linux.lists.ofono |
|---|---|
| Message-ID | <[email protected]> |
Signed-off-by: Muhammad Asif <[email protected]> --- drivers/mbimmodem/mbim-message.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/drivers/mbimmodem/mbim-message.c b/drivers/mbimmodem/mbim-mess= age.c index 65cdc73f..ecb4f689 100644 --- a/drivers/mbimmodem/mbim-message.c +++ b/drivers/mbimmodem/mbim-message.c @@ -139,8 +139,8 @@ static bool _iter_copy_string(struct mbim_message_iter = *iter, =09=09=09=09=09uint32_t offset, uint32_t len, =09=09=09=09=09char **out) { -=09uint16_t buf[len / 2 + 1]; -=09uint8_t *dest =3D (uint8_t *) buf; +=09uint8_t buf[len + 1]; +=09uint8_t *dest =3D buf; =09uint32_t remaining =3D len; =09uint32_t iov_start =3D 0; =09uint32_t i =3D 0; @@ -164,7 +164,7 @@ static bool _iter_copy_string(struct mbim_message_iter = *iter, =09if (tocopy > remaining) =09=09tocopy =3D remaining; =20 -=09memcpy(dest, iter->iov[i].iov_base + offset - iov_start, tocopy); +=09memcpy(buf, iter->iov[i].iov_base + offset - iov_start, tocopy); =09remaining -=3D tocopy; =09dest +=3D tocopy; =09i +=3D 1; @@ -180,15 +180,21 @@ static bool _iter_copy_string(struct mbim_message_ite= r *iter, =09=09dest +=3D tocopy; =09} =20 -=09/* Strings are in UTF16-LE, so convert to UTF16-CPU first if needed */ -=09if (L_CPU_TO_LE16(0x8000) !=3D 0x8000) { -=09=09uint16_t *le =3D buf; +=09dest =3D buf; +=09if (!l_utf8_validate((const char *)dest, len, NULL)) { +=09=09/* Strings are in UTF16-LE, so convert to UTF16-CPU first if needed = */ +=09=09if (L_CPU_TO_LE16(0x8000) !=3D 0x8000) { +=09=09=09uint16_t *le =3D (uint16_t *)dest; =20 -=09=09for (i =3D 0; i < len / 2; i++) -=09=09=09le[i] =3D __builtin_bswap16(le[i]); +=09=09=09for (i =3D 0; i < len / 2; i++) +=09=09=09=09le[i] =3D __builtin_bswap16(le[i]); +=09=09} + +=09=09*out =3D l_utf8_from_utf16(dest, len); +=09} else { +=09=09*out =3D l_strndup(dest, len); =09} =20 -=09*out =3D l_utf8_from_utf16(buf, len); =09return true; } =20 --=20 2.52.0