From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:60558) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RqSIE-0000Zo-5j for qemu-devel@nongnu.org; Thu, 26 Jan 2012 11:35:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RqSI8-0003Tm-Lz for qemu-devel@nongnu.org; Thu, 26 Jan 2012 11:35:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36672) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RqSI8-0003TO-3H for qemu-devel@nongnu.org; Thu, 26 Jan 2012 11:35:16 -0500 From: Kevin Wolf Date: Thu, 26 Jan 2012 17:38:13 +0100 Message-Id: <1327595896-19623-20-git-send-email-kwolf@redhat.com> In-Reply-To: <1327595896-19623-1-git-send-email-kwolf@redhat.com> References: <1327595896-19623-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 19/22] block/vdi: Zero unused parts when allocating a new block (fix #919242) List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Stefan Weil 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 Signed-off-by: Kevin Wolf --- block/vdi.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/block/vdi.c b/block/vdi.c index 31cdfab..6a0011f 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 @@ -756,15 +756,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 = g_malloc0(s->block_size); + block = g_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.6.5