[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] libxc: Minor tools bzip2/lzma decompression fixes



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1258960439 0
# Node ID 95f01bfd26672fdd5076699bb2ea7b65ce2e26e5
# Parent  be9b8be3c6487c5ea8b19f34ebf23e8d355f8960
libxc: Minor tools bzip2/lzma decompression fixes

The attached patch cleans up a few minor problems in the bzip2/lzma
decompression support, pointed out by Jiri in internal review.  In
particular, it fixes a possible memory leak on realloc() error, it
fixes a shifting typo, and it changes the xc_dom_printf()'s to be a
bit clearly about which compression routine is in-use.

Signed-off-by: Chris Lalancette <clalance@xxxxxxxxxx>
---
 tools/libxc/xc_dom_bzimageloader.c |   52 ++++++++++++++++++++-----------------
 1 files changed, 29 insertions(+), 23 deletions(-)

diff -r be9b8be3c648 -r 95f01bfd2667 tools/libxc/xc_dom_bzimageloader.c
--- a/tools/libxc/xc_dom_bzimageloader.c        Mon Nov 23 07:12:06 2009 +0000
+++ b/tools/libxc/xc_dom_bzimageloader.c        Mon Nov 23 07:13:59 2009 +0000
@@ -31,6 +31,7 @@ static int xc_try_bzip2_decode(
     bz_stream stream;
     int ret;
     char *out_buf;
+    char *tmp_buf;
     int retval = -1;
     int outsize;
     uint64_t total;
@@ -42,7 +43,7 @@ static int xc_try_bzip2_decode(
     ret = BZ2_bzDecompressInit(&stream, 0, 0);
     if ( ret != BZ_OK )
     {
-        xc_dom_printf("Error initting bz2 stream\n");
+        xc_dom_printf("BZIP2: Error initting stream\n");
         return -1;
     }
 
@@ -54,7 +55,7 @@ static int xc_try_bzip2_decode(
     out_buf = malloc(outsize);
     if ( out_buf == NULL )
     {
-        xc_dom_printf("Failed to alloc memory\n");
+        xc_dom_printf("BZIP2: Failed to alloc memory\n");
         goto bzip2_cleanup;
     }
 
@@ -69,12 +70,14 @@ static int xc_try_bzip2_decode(
         ret = BZ2_bzDecompress(&stream);
         if ( (stream.avail_out == 0) || (ret != BZ_OK) )
         {
-            out_buf = realloc(out_buf, outsize * 2);
-            if ( out_buf == NULL )
-            {
-                xc_dom_printf("Failed to realloc memory\n");
-                break;
-            }
+            tmp_buf = realloc(out_buf, outsize * 2);
+            if ( tmp_buf == NULL )
+            {
+                xc_dom_printf("BZIP2: Failed to realloc memory\n");
+                free(out_buf);
+                goto bzip2_cleanup;
+            }
+            out_buf = tmp_buf;
 
             stream.next_out = out_buf + outsize;
             stream.avail_out = (outsize * 2) - outsize;
@@ -85,15 +88,15 @@ static int xc_try_bzip2_decode(
         {
             if ( ret == BZ_STREAM_END )
             {
-                xc_dom_printf("Saw data stream end\n");
+                xc_dom_printf("BZIP2: Saw data stream end\n");
                 retval = 0;
                 break;
             }
-            xc_dom_printf("BZIP error\n");
-        }
-    }
-
-    total = (stream.total_out_hi32 << 31) | stream.total_out_lo32;
+            xc_dom_printf("BZIP2: error\n");
+        }
+    }
+
+    total = (((uint64_t)stream.total_out_hi32) << 32) | stream.total_out_lo32;
 
     xc_dom_printf("%s: BZIP2 decompress OK, 0x%zx -> 0x%lx\n",
                   __FUNCTION__, *size, (long unsigned int) total);
@@ -151,6 +154,7 @@ static int xc_try_lzma_decode(
     lzma_ret ret;
     lzma_action action = LZMA_RUN;
     unsigned char *out_buf;
+    unsigned char *tmp_buf;
     int retval = -1;
     int outsize;
     const char *msg;
@@ -158,7 +162,7 @@ static int xc_try_lzma_decode(
     ret = lzma_alone_decoder(&stream, physmem() / 3);
     if ( ret != LZMA_OK )
     {
-        xc_dom_printf("Failed to init lzma stream decoder\n");
+        xc_dom_printf("LZMA: Failed to init stream decoder\n");
         return -1;
     }
 
@@ -170,7 +174,7 @@ static int xc_try_lzma_decode(
     out_buf = malloc(outsize);
     if ( out_buf == NULL )
     {
-        xc_dom_printf("Failed to alloc memory\n");
+        xc_dom_printf("LZMA: Failed to alloc memory\n");
         goto lzma_cleanup;
     }
 
@@ -185,12 +189,14 @@ static int xc_try_lzma_decode(
         ret = lzma_code(&stream, action);
         if ( (stream.avail_out == 0) || (ret != LZMA_OK) )
         {
-            out_buf = realloc(out_buf, outsize * 2);
-            if ( out_buf == NULL )
-            {
-                xc_dom_printf("Failed to realloc memory\n");
-                break;
-            }
+            tmp_buf = realloc(out_buf, outsize * 2);
+            if ( tmp_buf == NULL )
+            {
+                xc_dom_printf("LZMA: Failed to realloc memory\n");
+                free(out_buf);
+                goto lzma_cleanup;
+            }
+            out_buf = tmp_buf;
 
             stream.next_out = out_buf + outsize;
             stream.avail_out = (outsize * 2) - outsize;
@@ -201,7 +207,7 @@ static int xc_try_lzma_decode(
         {
             if ( ret == LZMA_STREAM_END )
             {
-                xc_dom_printf("Saw data stream end\n");
+                xc_dom_printf("LZMA: Saw data stream end\n");
                 retval = 0;
                 break;
             }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.