Patchwork qemu-img: use the heap instead of the huge stack array for win32

login
register
mail settings
Submitter TeLeMan
Date Feb. 8, 2010, 8:20 a.m.
Message ID <a38b25541002080020i255df2a9q6aba29584097a2bc@mail.gmail.com>
Download mbox | patch
Permalink /patch/44765/
State New
Headers show

Comments

TeLeMan - Feb. 8, 2010, 8:20 a.m.
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 <geleman@gmail.com>
---
 qemu-img.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)
Anthony Liguori - Feb. 10, 2010, 9:40 p.m.
On 02/08/2010 02:20 AM, TeLeMan wrote:
> 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<geleman@gmail.com>
>    

Applied.  Thanks.

Regards,

Anthony Liguori
>    
---
>   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);
>       }
>
>       /*
>

Patch

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);
     }

     /*