71 lines
2.6 KiB
Diff
71 lines
2.6 KiB
Diff
|
From e246af75817264aa340cc4e8bb42c17a2d48cbb7 Mon Sep 17 00:00:00 2001
|
||
|
From: Stefan Weil <sw@weilnetz.de>
|
||
|
Date: Sat, 21 Jan 2012 13:54:24 +0100
|
||
|
Subject: [PATCH] block/vdi: Zero unused parts when allocating a new block
|
||
|
(fix #919242)
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
The new block was filled with zero when it was allocated by g_malloc0,
|
||
|
but when it was reused later and only partially used, data from the
|
||
|
previously allocated block were still present and written to the new
|
||
|
block.
|
||
|
|
||
|
This caused the problems reported by bug #919242
|
||
|
(https://bugs.launchpad.net/qemu/+bug/919242).
|
||
|
|
||
|
Now the unused parts of the new block which are before and after the data
|
||
|
are always filled with zero, so it is no longer necessary to zero the whole
|
||
|
block with g_malloc0.
|
||
|
|
||
|
I also updated the copyright comment.
|
||
|
|
||
|
Signed-off-by: Stefan Weil <sw@weilnetz.de>
|
||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||
|
(cherry picked from commit 641543b76b82a8b361482b727e08de0c8ec093b0)
|
||
|
|
||
|
[AF: g_malloc() -> qemu_malloc()]
|
||
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||
|
---
|
||
|
block/vdi.c | 8 ++++++--
|
||
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/block/vdi.c b/block/vdi.c
|
||
|
index 1be0cdc..07413af 100644
|
||
|
--- a/block/vdi.c
|
||
|
+++ b/block/vdi.c
|
||
|
@@ -1,7 +1,7 @@
|
||
|
/*
|
||
|
* Block driver for the Virtual Disk Image (VDI) format
|
||
|
*
|
||
|
- * Copyright (c) 2009 Stefan Weil
|
||
|
+ * Copyright (c) 2009, 2012 Stefan Weil
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
@@ -765,15 +765,19 @@ static void vdi_aio_write_cb(void *opaque, int ret)
|
||
|
(uint64_t)bmap_entry * s->block_sectors;
|
||
|
block = acb->block_buffer;
|
||
|
if (block == NULL) {
|
||
|
- block = qemu_mallocz(s->block_size);
|
||
|
+ block = qemu_malloc(s->block_size);
|
||
|
acb->block_buffer = block;
|
||
|
acb->bmap_first = block_index;
|
||
|
assert(!acb->header_modified);
|
||
|
acb->header_modified = 1;
|
||
|
}
|
||
|
acb->bmap_last = block_index;
|
||
|
+ /* Copy data to be written to new block and zero unused parts. */
|
||
|
+ memset(block, 0, sector_in_block * SECTOR_SIZE);
|
||
|
memcpy(block + sector_in_block * SECTOR_SIZE,
|
||
|
acb->buf, n_sectors * SECTOR_SIZE);
|
||
|
+ memset(block + (sector_in_block + n_sectors) * SECTOR_SIZE, 0,
|
||
|
+ (s->block_sectors - n_sectors - sector_in_block) * SECTOR_SIZE);
|
||
|
acb->hd_iov.iov_base = (void *)block;
|
||
|
acb->hd_iov.iov_len = s->block_size;
|
||
|
qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
|
||
|
--
|
||
|
1.7.11.2
|
||
|
|