From: Peter Maydell Date: Mon, 10 Dec 2018 11:26:47 +0000 (+0000) Subject: block/vpc: Don't take address of fields in packed structs X-Git-Tag: v4.0.0-rc0~125^2~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0dbaaa7981e92a6b629b1cf0056dcafadd6ee8a5;p=thirdparty%2Fqemu.git block/vpc: Don't take address of fields in packed structs 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 Signed-off-by: Kevin Wolf --- diff --git a/block/vpc.c b/block/vpc.c index d886465b7e2..52ab7176427 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));