summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Fox2006-03-27 23:09:14 +0000
committerPaul Fox2006-03-27 23:09:14 +0000
commit986ab525b808258a5a79ed2cded531cfae76f81d (patch)
treec36e6c521fb027869311b7cb5905fb9e7143c54f
parentb3ede5abe2de41760a806ad7b5a8e40018abc2f4 (diff)
downloadbusybox-986ab525b808258a5a79ed2cded531cfae76f81d.zip
busybox-986ab525b808258a5a79ed2cded531cfae76f81d.tar.gz
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.
-rw-r--r--archival/unzip.c15
1 files changed, 11 insertions, 4 deletions
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 @@ static void unzip_create_leading_dirs(char *fn)
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 @@ static void unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
/* 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 @@ int unzip_main(int argc, char **argv)
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 @@ int unzip_main(int argc, char **argv)
if (verbosity != v_silent)
printf("Archive: %s\n", src_fn);
+ failed = 0;
+
while (1) {
unsigned int magic;
@@ -367,7 +372,9 @@ int unzip_main(int argc, char **argv)
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 @@ int unzip_main(int argc, char **argv)
"%9d %d files\n", total_size, total_entries);
}
- return(EXIT_SUCCESS);
+ return failed;
}
/* END CODE */