aboutsummaryrefslogtreecommitdiff
path: root/archival
diff options
context:
space:
mode:
authorPaul Fox <pgf@brightstareng.com>2006-03-27 23:09:14 +0000
committerPaul Fox <pgf@brightstareng.com>2006-03-27 23:09:14 +0000
commit986ab525b808258a5a79ed2cded531cfae76f81d (patch)
treec36e6c521fb027869311b7cb5905fb9e7143c54f /archival
parentb3ede5abe2de41760a806ad7b5a8e40018abc2f4 (diff)
downloadbusybox-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.
Diffstat (limited to 'archival')
-rw-r--r--archival/unzip.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/archival/unzip.c b/archival/unzip.c
index 9cf987664..bb7197d3e 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 */