cd9d161514
Fix systemtap tapsets (bz 831763) Fix qmp response race caused by spice server bug (bz 744015) Fix text mode screendumps (bz 819155) Don't renable ksm on update (bz 815156) Fix RPM install error on non-virt machines (bz 660629) Obsolete openbios to fix upgrade dependency issues (bz 694802)
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
|
|
|