From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NeOqo-0003C0-Nl for qemu-devel@nongnu.org; Mon, 08 Feb 2010 03:20:10 -0500 Received: from [199.232.76.173] (port=44989 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NeOqm-0003BG-4r for qemu-devel@nongnu.org; Mon, 08 Feb 2010 03:20:08 -0500 Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1NeOqh-0007Nm-G5 for qemu-devel@nongnu.org; Mon, 08 Feb 2010 03:20:08 -0500 Received: from mail-pz0-f176.google.com ([209.85.222.176]:44213) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NeOqh-0007NQ-4Z for qemu-devel@nongnu.org; Mon, 08 Feb 2010 03:20:03 -0500 Received: by pzk6 with SMTP id 6so4793214pzk.18 for ; Mon, 08 Feb 2010 00:20:02 -0800 (PST) MIME-Version: 1.0 Date: Mon, 8 Feb 2010 16:20:00 +0800 Message-ID: From: TeLeMan Content-Type: text/plain; charset=UTF-8 Subject: [Qemu-devel] [PATCH] qemu-img: use the heap instead of the huge stack array for win32 List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel The default stack size of PE is 1MB on win32 and IO_BUF_SIZE in img_convert() & img_rebase() is 2MB, so qemu-img will crash when doing "convert" & "rebase" on win32. Although we can improve the stack size of PE to resolve it, I think we should avoid using the huge stack variables. Signed-off-by: TeLeMan --- qemu-img.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index bbfeea1..9994b3d 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -571,7 +571,7 @@ static int img_convert(int argc, char **argv) BlockDriverState **bs, *out_bs; int64_t total_sectors, nb_sectors, sector_num, bs_offset; uint64_t bs_sectors; - uint8_t buf[IO_BUF_SIZE]; + uint8_t * buf; const uint8_t *buf1; BlockDriverInfo bdi; QEMUOptionParameter *param = NULL; @@ -690,6 +690,7 @@ static int img_convert(int argc, char **argv) bs_i = 0; bs_offset = 0; bdrv_get_geometry(bs[0], &bs_sectors); + buf = qemu_malloc(IO_BUF_SIZE); if (flags & BLOCK_FLAG_COMPRESS) { if (bdrv_get_info(out_bs, &bdi) < 0) @@ -822,6 +823,7 @@ static int img_convert(int argc, char **argv) } } } + qemu_free(buf); bdrv_delete(out_bs); for (bs_i = 0; bs_i < bs_n; bs_i++) bdrv_delete(bs[bs_i]); @@ -1178,8 +1180,11 @@ static int img_rebase(int argc, char **argv) uint64_t num_sectors; uint64_t sector; int n, n1; - uint8_t buf_old[IO_BUF_SIZE]; - uint8_t buf_new[IO_BUF_SIZE]; + uint8_t * buf_old; + uint8_t * buf_new; + + buf_old = qemu_malloc(IO_BUF_SIZE); + buf_new = qemu_malloc(IO_BUF_SIZE); bdrv_get_geometry(bs, &num_sectors); @@ -1226,6 +1231,9 @@ static int img_rebase(int argc, char **argv) written += pnum; } } + + qemu_free(buf_old); + qemu_free(buf_new); } /* -- 1.6.5.1.1367.gcd48 -- SUN OF A BEACH