Fix gunzip in case of insufficient output buffer
authorMatthias Fuchs <matthias.fuchs@esd-electronics.com>
Fri, 2 Jan 2009 14:11:41 +0000 (15:11 +0100)
committerWolfgang Denk <wd@denx.de>
Tue, 27 Jan 2009 19:59:09 +0000 (20:59 +0100)
U-Boot's gunzip() function does not handle the return code
of zlib's inflate() function correctly. gunzip() is implemented
to uncompress all input data in one run. So the correct return
code for the good case is Z_STREAM_END. In case of insufficient
output buffer memory inflate returns Z_OK. For gunzip() this
is an error.

It also makes sense to me to call inflateEnd() also in case
of an error.

Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
common/cmd_bootm.c
lib_generic/gunzip.c

index a8f85e93b2823ab4f4ef9f35580dde90699d15d6..905567293cd2299054b843bbe57aa8c971a806f5 100644 (file)
@@ -350,7 +350,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
                printf ("   Uncompressing %s ... ", type_name);
                if (gunzip ((void *)load, unc_len,
                                        (uchar *)image_start, &image_len) != 0) {
-                       puts ("GUNZIP: uncompress or overwrite error "
+                       puts ("GUNZIP: uncompress, out-of-mem or overwrite error "
                                "- must RESET board to recover\n");
                        if (boot_progress)
                                show_boot_progress (-6);
index 74f0bf9f3e1d042a93c877be418961ebfc40bb61..5bcf5b7b24f734ee5274156f809a8996147966db 100644 (file)
@@ -102,8 +102,9 @@ int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
        s.next_out = dst;
        s.avail_out = dstlen;
        r = inflate(&s, Z_FINISH);
-       if (r != Z_OK && r != Z_STREAM_END) {
+       if (r != Z_STREAM_END) {
                printf ("Error: inflate() returned %d\n", r);
+               inflateEnd(&s);
                return (-1);
        }
        *lenp = s.next_out - (unsigned char *) dst;