diff options
author | Paul Fox | 2006-03-27 23:09:14 +0000 |
---|---|---|
committer | Paul Fox | 2006-03-27 23:09:14 +0000 |
commit | 986ab525b808258a5a79ed2cded531cfae76f81d (patch) | |
tree | c36e6c521fb027869311b7cb5905fb9e7143c54f | |
parent | b3ede5abe2de41760a806ad7b5a8e40018abc2f4 (diff) | |
download | busybox-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.c | 15 |
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 */ |