ensure that corrupted file extraction causes both a message and
a failure exit code.  delay the error exit until all (good) files
have been extracted.

filesystem errors (nodes of wrong type, permission problems, etc)
still cause immediate failure.
diff --git a/archival/unzip.c b/archival/unzip.c
index 9cf9876..bb7197d 100644
--- a/archival/unzip.c
+++ b/archival/unzip.c
@@ -100,7 +100,7 @@
 	free(name);
 }
 
-static void unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
+static int unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
 {
 	if (zip_header->formated.method == 0) {
 		/* Method 0 - stored (not compressed) */
@@ -117,12 +117,15 @@
 		/* Validate decompression - crc */
 		if (zip_header->formated.crc32 != (gunzip_crc ^ 0xffffffffL)) {
 			bb_error_msg("Invalid compressed data--crc error");
+			return 1;
 		}
 		/* Validate decompression - size */
 		if (zip_header->formated.ucmpsize != gunzip_bytes_out) {
 			bb_error_msg("Invalid compressed data--length error");
+			return 1;
 		}
 	}
+	return 0;
 }
 
 int unzip_main(int argc, char **argv)
@@ -137,7 +140,7 @@
 	llist_t *zaccept = NULL;
 	llist_t *zreject = NULL;
 	char *base_dir = NULL;
-	int i, opt, opt_range = 0, list_header_done = 0;
+	int failed, i, opt, opt_range = 0, list_header_done = 0;
 	char key_buf[512];
 	struct stat stat_buf;
 
@@ -240,6 +243,8 @@
 	if (verbosity != v_silent)
 		printf("Archive:  %s\n", src_fn);
 
+	failed = 0;
+
 	while (1) {
 		unsigned int magic;
 
@@ -367,7 +372,9 @@
 			if (verbosity == v_normal) {
 				printf("  inflating: %s\n", dst_fn);
 			}
-			unzip_extract(&zip_header, src_fd, dst_fd);
+			if (unzip_extract(&zip_header, src_fd, dst_fd)) {
+			    failed = 1;
+			}
 			if (dst_fd != STDOUT_FILENO) {
 				/* closing STDOUT is potentially bad for future business */
 				close(dst_fd);
@@ -409,7 +416,7 @@
 		       "%9d                   %d files\n", total_size, total_entries);
 	}
 
-	return(EXIT_SUCCESS);
+	return failed;
 }
 
 /* END CODE */