]> xenbits.xensource.com Git - xen.git/commitdiff
bzip2: Add missing checks for malloc returning NULL
authorPhillip Lougher <phillip@lougher.demon.co.uk>
Fri, 11 Nov 2011 13:30:36 +0000 (14:30 +0100)
committerPhillip Lougher <phillip@lougher.demon.co.uk>
Fri, 11 Nov 2011 13:30:36 +0000 (14:30 +0100)
From: Phillip Lougher <phillip@lougher.demon.co.uk>

Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Committed-by: Jan Beulich <jbeulich@suse.com>
xen/common/bunzip2.c

index eaf920231aabc754109ce2912ac247c49c6a88f4..d87bdcff9e81f2f31982c336b51ab9634996e46a 100644 (file)
@@ -629,6 +629,8 @@ static int INIT start_bunzip(struct bunzip_data **bdp, void *inbuf, int len,
 
        /* Allocate bunzip_data.  Most fields initialize to zero. */
        bd = *bdp = malloc(i);
+       if (!bd)
+               return RETVAL_OUT_OF_MEMORY;
        memset(bd, 0, sizeof(struct bunzip_data));
        /* Setup input buffer */
        bd->inbuf = inbuf;
@@ -656,6 +658,8 @@ static int INIT start_bunzip(struct bunzip_data **bdp, void *inbuf, int len,
        bd->dbufSize = 100000*(i-BZh0);
 
        bd->dbuf = large_malloc(bd->dbufSize * sizeof(int));
+       if (!bd->dbuf)
+               return RETVAL_OUT_OF_MEMORY;
        return RETVAL_OK;
 }
 
@@ -677,7 +681,7 @@ STATIC int INIT bunzip2(unsigned char *buf, unsigned int len,
 
        if (!outbuf) {
                error("Could not allocate output bufer");
-               return -1;
+               return RETVAL_OUT_OF_MEMORY;
        }
        if (buf)
                inbuf = buf;
@@ -685,6 +689,7 @@ STATIC int INIT bunzip2(unsigned char *buf, unsigned int len,
                inbuf = malloc(BZIP2_IOBUF_SIZE);
        if (!inbuf) {
                error("Could not allocate input bufer");
+               i = RETVAL_OUT_OF_MEMORY;
                goto exit_0;
        }
        i = start_bunzip(&bd, inbuf, len, fill);
@@ -711,11 +716,14 @@ STATIC int INIT bunzip2(unsigned char *buf, unsigned int len,
        } else if (i == RETVAL_UNEXPECTED_OUTPUT_EOF) {
                error("Compressed file ends unexpectedly");
        }
+       if (!bd)
+               goto exit_1;
        if (bd->dbuf)
                large_free(bd->dbuf);
        if (pos)
                *pos = bd->inbufPos;
        free(bd);
+exit_1:
        if (!buf)
                free(inbuf);
 exit_0: