[1/3] block/vpc: Don't take address of fields in packed structs

Message ID 20181210112649.11581-2-peter.maydell@linaro.org
State Superseded
Headers show
Series
  • block: fix last address-of-packed-member warnings
Related show

Commit Message

Peter Maydell Dec. 10, 2018, 11:26 a.m.
Taking the address of a field in a packed struct is a bad idea, because
it might not be actually aligned enough for that pointer type (and
thus cause a crash on dereference on some host architectures). Newer
versions of clang warn about this. Avoid the bug by generating the
UUID into a local variable which is definitely safely aligned and
then copying it into place.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

---
 block/vpc.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

-- 
2.19.2

Patch

diff --git a/block/vpc.c b/block/vpc.c
index 80c5b2b197e..968d80ae461 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -979,6 +979,7 @@  static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
     int64_t total_size;
     int disk_type;
     int ret = -EIO;
+    QemuUUID uuid;
 
     assert(opts->driver == BLOCKDEV_DRIVER_VPC);
     vpc_opts = &opts->u.vpc;
@@ -1062,7 +1063,8 @@  static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
 
     footer->type = cpu_to_be32(disk_type);
 
-    qemu_uuid_generate(&footer->uuid);
+    qemu_uuid_generate(&uuid);
+    footer->uuid = uuid;
 
     footer->checksum = cpu_to_be32(vpc_checksum(buf, HEADER_SIZE));