qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 10/14] usb-mtp: avoid warning about unaligned access


From: Daniel P . Berrangé
Subject: [Qemu-devel] [PATCH 10/14] usb-mtp: avoid warning about unaligned access to filename
Date: Fri, 29 Mar 2019 11:11:00 +0000

The 'filename' field in ObjectInfo struct is declared as a
zero length array of uint16_t. Accessing it is equivalent
to taking the address of the field, and taking the address
of fields in a packed struct causes unaligned pointer
warnings:

hw/usb/dev-mtp.c: In function ‘usb_mtp_write_metadata’:
hw/usb/dev-mtp.c:1712:36: warning: taking address of packed member of ‘struct 
<anonymous>’ may result in an unaligned pointer value 
[-Waddress-of-packed-member]
 1712 |                             dataset->filename);
      |                             ~~~~~~~^~~~~~~~~~

The warning is in fact correct because the 'filename'
field is preceeded by a uint8_t field which causes it
to have bad alignment.

Using pointer arithmetic instead of accessing the zero
length array field directly avoids the compiler warning
but doesn't ultimately fix the bad alignment. Fixing
that probably requires allocating a new array of
uint16_t in the heap & then memcpy() the data before
accessing the array elements.

Signed-off-by: Daniel P. Berrangé <address@hidden>
---
 hw/usb/dev-mtp.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c
index 5343449663..9ddcfbe7a6 100644
--- a/hw/usb/dev-mtp.c
+++ b/hw/usb/dev-mtp.c
@@ -225,7 +225,7 @@ typedef struct {
     uint16_t assoc_type;
     uint32_t assoc_desc;
     uint32_t seq_no; /*unused*/
-    uint8_t length; /*part of filename field*/
+    uint8_t length; /*length of filename field*/
     uint16_t filename[0];
     char date_created[0]; /*unused*/
     char date_modified[0]; /*unused*/
@@ -1703,13 +1703,15 @@ static void usb_mtp_write_metadata(MTPState *s, 
uint64_t dlen)
     MTPObject *o;
     MTPObject *p = usb_mtp_object_lookup(s, s->dataset.parent_handle);
     uint32_t next_handle = s->next_handle;
+    uint16_t *wfilename = (uint16_t *)(d->data +
+                                       offsetof(ObjectInfo, filename));
 
     assert(!s->write_pending);
     assert(p != NULL);
 
     filename = utf16_to_str(MIN(dataset->length,
                                 dlen - offsetof(ObjectInfo, filename)),
-                            dataset->filename);
+                            wfilename);
 
     if (strchr(filename, '/')) {
         usb_mtp_queue_result(s, RES_PARAMETER_NOT_SUPPORTED, d->trans,
-- 
2.20.1




reply via email to

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