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:
parent
4a960ece17
commit
0dbaaa7981
@ -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));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user