grub-devel
[Top][All Lists]
Advanced

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

[PATCH 6/8] usbtest: fix gcc9 error address-of-packed-member


From: Michael Chang
Subject: [PATCH 6/8] usbtest: fix gcc9 error address-of-packed-member
Date: Tue, 9 Apr 2019 18:46:57 +0800

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 <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]