Hi, did anybody check my gunzip fix? I'm not a zlib expert, but I think we have a little issue here.
Matthias On Friday 02 January 2009 15:11, Matthias Fuchs wrote: > 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.fu...@esd-electronics.com> > --- > common/cmd_bootm.c | 2 +- > lib_generic/gunzip.c | 3 ++- > 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; _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot