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

Reply via email to