From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:33649) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Roemd-0007Uw-7c for qemu-devel@nongnu.org; Sat, 21 Jan 2012 12:31:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Roemb-00063F-Iy for qemu-devel@nongnu.org; Sat, 21 Jan 2012 12:31:19 -0500 Message-ID: <4F1AF661.6060501@weilnetz.de> Date: Sat, 21 Jan 2012 18:31:13 +0100 From: Stefan Weil MIME-Version: 1.0 References: <1327150464-29682-1-git-send-email-sw@weilnetz.de> In-Reply-To: <1327150464-29682-1-git-send-email-sw@weilnetz.de> Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] 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: qemu-stable@nongnu.org Cc: Kevin Wolf , qemu-devel@nongnu.org Am 21.01.2012 13:54, schrieb 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 > --- > 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); > Hi, this patch should also be applied to the stable branches of QEMU, at least to stable-1.0 (after the review, of course). Regards, Stefan Weil