Merge branch 'rcu/next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck...
[linux-3.10.git] / lib / decompress_bunzip2.c
index 600f473..31c5f76 100644 (file)
@@ -1,4 +1,3 @@
-/* vi: set sw = 4 ts = 4: */
 /*     Small bzip2 deflate implementation, by Rob Landley (rob@landley.net).
 
        Based on bzip2 decompression code by Julian R Seward (jseward@acm.org),
@@ -49,7 +48,6 @@
 #define PREBOOT
 #else
 #include <linux/decompress/bunzip2.h>
-#include <linux/slab.h>
 #endif /* STATIC */
 
 #include <linux/decompress/mm.h>
@@ -107,6 +105,8 @@ struct bunzip_data {
        unsigned char selectors[32768];         /* nSelectors = 15 bits */
        struct group_data groups[MAX_GROUPS];   /* Huffman coding tables */
        int io_error;                   /* non-zero if we have IO error */
+       int byteCount[256];
+       unsigned char symToByte[256], mtfSymbol[256];
 };
 
 
@@ -158,14 +158,16 @@ static int INIT get_next_block(struct bunzip_data *bd)
        int *base = NULL;
        int *limit = NULL;
        int dbufCount, nextSym, dbufSize, groupCount, selector,
-               i, j, k, t, runPos, symCount, symTotal, nSelectors,
-               byteCount[256];
-       unsigned char uc, symToByte[256], mtfSymbol[256], *selectors;
+               i, j, k, t, runPos, symCount, symTotal, nSelectors, *byteCount;
+       unsigned char uc, *symToByte, *mtfSymbol, *selectors;
        unsigned int *dbuf, origPtr;
 
        dbuf = bd->dbuf;
        dbufSize = bd->dbufSize;
        selectors = bd->selectors;
+       byteCount = bd->byteCount;
+       symToByte = bd->symToByte;
+       mtfSymbol = bd->mtfSymbol;
 
        /* Read in header signature and CRC, then validate signature.
           (last block signature means CRC is for whole file, return now) */
@@ -299,7 +301,7 @@ static int INIT get_next_block(struct bunzip_data *bd)
                   again when using them (during symbol decoding).*/
                base = hufGroup->base-1;
                limit = hufGroup->limit-1;
-               /* Calculate permute[].  Concurently, initialize
+               /* Calculate permute[].  Concurrently, initialize
                 * temp[] and limit[]. */
                pp = 0;
                for (i = minLen; i <= maxLen; i++) {
@@ -637,6 +639,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;
@@ -664,6 +668,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;
 }
 
@@ -674,26 +680,26 @@ STATIC int INIT bunzip2(unsigned char *buf, int len,
                        int(*flush)(void*, unsigned int),
                        unsigned char *outbuf,
                        int *pos,
-                       void(*error_fn)(char *x))
+                       void(*error)(char *x))
 {
        struct bunzip_data *bd;
        int i = -1;
        unsigned char *inbuf;
 
-       set_error_fn(error_fn);
        if (flush)
                outbuf = malloc(BZIP2_IOBUF_SIZE);
 
        if (!outbuf) {
-               error("Could not allocate output bufer");
-               return -1;
+               error("Could not allocate output buffer");
+               return RETVAL_OUT_OF_MEMORY;
        }
        if (buf)
                inbuf = buf;
        else
                inbuf = malloc(BZIP2_IOBUF_SIZE);
        if (!inbuf) {
-               error("Could not allocate input bufer");
+               error("Could not allocate input buffer");
+               i = RETVAL_OUT_OF_MEMORY;
                goto exit_0;
        }
        i = start_bunzip(&bd, inbuf, len, fill);
@@ -720,11 +726,14 @@ STATIC int INIT bunzip2(unsigned char *buf, 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:
@@ -739,8 +748,8 @@ STATIC int INIT decompress(unsigned char *buf, int len,
                        int(*flush)(void*, unsigned int),
                        unsigned char *outbuf,
                        int *pos,
-                       void(*error_fn)(char *x))
+                       void(*error)(char *x))
 {
-       return bunzip2(buf, len - 4, fill, flush, outbuf, pos, error_fn);
+       return bunzip2(buf, len - 4, fill, flush, outbuf, pos, error);
 }
 #endif