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 <peter.maydell@linaro.org>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Peter Maydell 2018-12-10 11:26:47 +00:00 committed by Kevin Wolf
parent 4a960ece17
commit 0dbaaa7981

View File

@ -979,6 +979,7 @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
int64_t total_size; int64_t total_size;
int disk_type; int disk_type;
int ret = -EIO; int ret = -EIO;
QemuUUID uuid;
assert(opts->driver == BLOCKDEV_DRIVER_VPC); assert(opts->driver == BLOCKDEV_DRIVER_VPC);
vpc_opts = &opts->u.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); 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)); footer->checksum = cpu_to_be32(vpc_checksum(buf, HEADER_SIZE));