changeset 331:83cd88af1211

Fix xyzmodem compressed loads
author msalter
date Fri, 13 Sep 2002 21:33:26 +0000
parents 2525052c5d76
children 7c1c8dc43ba1
files packages/redboot/current/ChangeLog packages/redboot/current/src/decompress.c
diffstat 2 files changed, 29 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/packages/redboot/current/ChangeLog
+++ b/packages/redboot/current/ChangeLog
@@ -1,3 +1,8 @@
+2002-09-13  Mark Salter  <msalter@redhat.com>
+
+	* src/decompress.c: Move error handling back into gzip_close to
+	fix xyzmodem loads.
+
 2002-09-12  Mark Salter  <msalter@redhat.com>
 
 	* src/decompress.c (gzip_inflate): Fix error return so that upper
--- a/packages/redboot/current/src/decompress.c
+++ b/packages/redboot/current/src/decompress.c
@@ -57,6 +57,7 @@
 #ifdef CYGPKG_COMPRESS_ZLIB
 #include <cyg/compress/zlib.h>
 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;