summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Fuchs <matthias.fuchs@esd-electronics.com>2009-01-02 15:11:41 +0100
committerWolfgang Denk <wd@denx.de>2009-01-27 20:59:09 +0100
commit107b801cf3fe39612d69d70581ebc3bf5e215554 (patch)
tree6e15eae452a228d7025dba569b67dd62f1a3b935
parent49ad4801714039ac8b9cae4de9c097224183e465 (diff)
downloadu-boot-imx-107b801cf3fe39612d69d70581ebc3bf5e215554.zip
u-boot-imx-107b801cf3fe39612d69d70581ebc3bf5e215554.tar.gz
u-boot-imx-107b801cf3fe39612d69d70581ebc3bf5e215554.tar.bz2
Fix gunzip in case of insufficient output buffer
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>
-rw-r--r--common/cmd_bootm.c2
-rw-r--r--lib_generic/gunzip.c3
2 files changed, 3 insertions, 2 deletions
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index a8f85e9..9055672 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -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);
diff --git a/lib_generic/gunzip.c b/lib_generic/gunzip.c
index 74f0bf9..5bcf5b7 100644
--- a/lib_generic/gunzip.c
+++ b/lib_generic/gunzip.c
@@ -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;