# HG changeset patch # User msalter # Date 1031952806 0 # Node ID 83cd88af121162f98044010a88d87599ba6533d3 # Parent 2525052c5d76e9491cc15dcdf0176578b277145d Fix xyzmodem compressed loads diff --git a/packages/redboot/current/ChangeLog b/packages/redboot/current/ChangeLog --- a/packages/redboot/current/ChangeLog +++ b/packages/redboot/current/ChangeLog @@ -1,3 +1,8 @@ +2002-09-13 Mark Salter + + * src/decompress.c: Move error handling back into gzip_close to + fix xyzmodem loads. + 2002-09-12 Mark Salter * src/decompress.c (gzip_inflate): Fix error return so that upper diff --git a/packages/redboot/current/src/decompress.c b/packages/redboot/current/src/decompress.c --- a/packages/redboot/current/src/decompress.c +++ b/packages/redboot/current/src/decompress.c @@ -57,6 +57,7 @@ #ifdef CYGPKG_COMPRESS_ZLIB #include static z_stream stream; +static bool stream_end; #define __ZLIB_MAGIC__ 0x5A4C4942 // 'ZLIB' @@ -260,6 +261,7 @@ gzip_init(_pipe_t* p) stream.next_out = NULL; stream.avail_out = 0; err = inflateInit(&stream); + stream_end = false; return err; } @@ -273,6 +275,9 @@ gzip_inflate(_pipe_t* p) { int err, bytes_out; + if (stream_end) + return Z_STREAM_END; + stream.next_in = p->in_buf; stream.avail_in = p->in_avail; stream.next_out = p->out_buf; @@ -285,23 +290,13 @@ gzip_inflate(_pipe_t* p) p->in_avail = stream.avail_in; p->in_buf = stream.next_in; - switch (err) { - case Z_STREAM_END: - p->in_avail = 0; - err = 0; - break; - case Z_OK: - if (bytes_out == 0) { - // Decompression didn't complete - err = -1; - p->msg = "premature end of input"; - } else - err = 0; - break; - default: - err = -1; - break; + // Let upper layers process any inflated bytes at + // end of stream. + if (err == Z_STREAM_END && bytes_out) { + stream_end = true; + err = Z_OK; } + return err; } @@ -313,6 +308,19 @@ gzip_inflate(_pipe_t* p) static int gzip_close(_pipe_t* p, int err) { + switch (err) { + case Z_STREAM_END: + err = 0; + break; + case Z_OK: + // Decompression didn't complete + p->msg = "premature end of input"; + // fall-through + default: + err = -1; + break; + } + inflateEnd(&stream); return err;