Skip to content

Commit

Permalink
block/vpc: Don't take address of fields in packed structs
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
pm215 authored and kevmw committed Feb 1, 2019
1 parent 4a960ec commit 0dbaaa7
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion block/vpc.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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));

Expand Down

0 comments on commit 0dbaaa7

Please sign in to comment.