Copy the packed member descstrp->str to the buffer strbuf returned by grub_malloc, which is supposed to be suitably aligned for any data type and after we use strbuf as argument to grub_utf16_to_utf8.
The solved gcc9 error like this. [ 229s] ../../grub-core/commands/usbtest.c: In function 'grub_usb_get_string': [ 229s] ../../grub-core/commands/usbtest.c:104:58: error: taking address of packed member of 'struct grub_usb_desc_str' may result in an unaligned pointer value [-Werror=address-of-packed-member] [ 229s] 104 | *grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str, [ 229s] | ~~~~~~~~^~~~~ Signed-off-by: Michael Chang <mch...@suse.com> --- grub-core/commands/usbtest.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/grub-core/commands/usbtest.c b/grub-core/commands/usbtest.c index 01cdca934..b42e746c0 100644 --- a/grub-core/commands/usbtest.c +++ b/grub-core/commands/usbtest.c @@ -69,6 +69,7 @@ grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid, { struct grub_usb_desc_str descstr; struct grub_usb_desc_str *descstrp; + grub_uint16_t *strbuf; grub_usb_err_t err; /* Only get the length. */ @@ -101,8 +102,18 @@ grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid, return GRUB_USB_ERR_INTERNAL; } - *grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str, + strbuf = grub_malloc (descstrp->length - sizeof (*descstrp)); + if (!strbuf) + { + grub_free (*string); + grub_free (descstrp); + return GRUB_USB_ERR_INTERNAL; + } + + grub_memcpy (strbuf, descstrp->str, descstrp->length - sizeof (*descstrp)); + *grub_utf16_to_utf8 ((grub_uint8_t *) *string, strbuf, descstrp->length / 2 - 1) = 0; + grub_free (strbuf); grub_free (descstrp); return GRUB_USB_ERR_NONE; -- 2.16.4 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel