changeset 330:2525052c5d76

Fix compressed file loads.
author msalter
date Thu, 12 Sep 2002 21:23:10 +0000
parents 85c0eb753287
children 83cd88af1211
files packages/redboot/current/ChangeLog packages/redboot/current/src/decompress.c packages/redboot/current/src/load.c
diffstat 3 files changed, 29 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/packages/redboot/current/ChangeLog
+++ b/packages/redboot/current/ChangeLog
@@ -1,3 +1,11 @@
+2002-09-12  Mark Salter  <msalter@redhat.com>
+
+	* src/decompress.c (gzip_inflate): Fix error return so that upper
+	doesn't quit on Z_STREAM_END.
+	(gzip_close): Move error handling into gzip_inflate.
+	
+	* src/load.c (do_load): Fix printing of address range for raw loads.
+
 2002-09-11  Mark Salter  <msalter@redhat.com>
 
 	* src/main.c (do_go): Turn on line flushes before jumping to function.
--- a/packages/redboot/current/src/decompress.c
+++ b/packages/redboot/current/src/decompress.c
@@ -271,19 +271,37 @@ gzip_init(_pipe_t* p)
 static int
 gzip_inflate(_pipe_t* p)
 {
-    int err;
+    int err, bytes_out;
 
     stream.next_in = p->in_buf;
     stream.avail_in = p->in_avail;
     stream.next_out = p->out_buf;
     stream.avail_out = p->out_max;
     err = inflate(&stream, Z_SYNC_FLUSH);
-    p->out_size += (stream.next_out - p->out_buf);
+    bytes_out = stream.next_out - p->out_buf;
+    p->out_size += bytes_out;
     p->out_buf = stream.next_out;
     p->msg = stream.msg;
     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;
+    }
     return err;
 }
 
@@ -295,19 +313,6 @@ 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;
--- a/packages/redboot/current/src/load.c
+++ b/packages/redboot/current/src/load.c
@@ -733,7 +733,7 @@ do_load(int argc, char *argv[])
         redboot_getc_terminate(false);
         if (0 == err)
             diag_printf("Raw file loaded %p-%p, assumed entry at %p\n", 
-                        (void *)base, (void *)end, (void*)base);
+                        (void *)base, (void *)(end - 1), (void*)base);
     } else {
         // Read initial header - to determine file [image] type
         for (i = 0;  i < sizeof(type);  i++) {