diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2018-12-10 11:26:47 +0000 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2019-02-01 13:46:44 +0100 |
commit | 0dbaaa7981e92a6b629b1cf0056dcafadd6ee8a5 (patch) | |
tree | 91b90cc0b1971ee3b2770baad6b1cab0a48e7444 /block/vpc.c | |
parent | 4a960ece17c94989d4082f5d3d8c32b34eded57c (diff) |
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>
Diffstat (limited to 'block/vpc.c')
-rw-r--r-- | block/vpc.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/block/vpc.c b/block/vpc.c index d886465b7e..52ab717642 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)); |