Skip to content

Commit

Permalink
block/vdi: Don't assume that blocks are larger than VdiHeader
Browse files Browse the repository at this point in the history
Given that the block size is read from the header of the VDI file, a
wide variety of sizes might be seen. Rather than re-using a block
sized memory region when writing the VDI header, allocate an
appropriately sized buffer.

Signed-off-by: David Edmondson <david.edmondson@oracle.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Max Reitz <mreitz@redhat.com>
Message-id: 20210325112941.365238-3-pbonzini@redhat.com
Message-Id: <20210309144015.557477-3-david.edmondson@oracle.com>
Acked-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
dme authored and stefanhaRH committed Mar 31, 2021
1 parent 574b830 commit 07ee2ab
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions block/vdi.c
Expand Up @@ -696,18 +696,20 @@ vdi_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,

if (block) {
/* One or more new blocks were allocated. */
VdiHeader *header = (VdiHeader *) block;
VdiHeader *header;
uint8_t *base;
uint64_t offset;
uint32_t n_sectors;

g_free(block);
header = g_malloc(sizeof(*header));

logout("now writing modified header\n");
assert(VDI_IS_ALLOCATED(bmap_first));
*header = s->header;
vdi_header_to_le(header);
ret = bdrv_pwrite(bs->file, 0, block, sizeof(VdiHeader));
g_free(block);
block = NULL;
ret = bdrv_pwrite(bs->file, 0, header, sizeof(*header));
g_free(header);

if (ret < 0) {
return ret;
Expand Down

0 comments on commit 07ee2ab

Please sign in to comment.