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-w32-986ab525b808258a5a79ed2cded531cfae76f81d.tar.gz
busybox-w32-986ab525b808258a5a79ed2cded531cfae76f81d.tar.bz2
busybox-w32-986ab525b808258a5a79ed2cded531cfae76f81d.zip
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)
100 free(name); 100 free(name);
101} 101}
102 102
103static void unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd) 103static int unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
104{ 104{
105 if (zip_header->formated.method == 0) { 105 if (zip_header->formated.method == 0) {
106 /* Method 0 - stored (not compressed) */ 106 /* Method 0 - stored (not compressed) */
@@ -117,12 +117,15 @@ static void unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
117 /* Validate decompression - crc */ 117 /* Validate decompression - crc */
118 if (zip_header->formated.crc32 != (gunzip_crc ^ 0xffffffffL)) { 118 if (zip_header->formated.crc32 != (gunzip_crc ^ 0xffffffffL)) {
119 bb_error_msg("Invalid compressed data--crc error"); 119 bb_error_msg("Invalid compressed data--crc error");
120 return 1;
120 } 121 }
121 /* Validate decompression - size */ 122 /* Validate decompression - size */
122 if (zip_header->formated.ucmpsize != gunzip_bytes_out) { 123 if (zip_header->formated.ucmpsize != gunzip_bytes_out) {
123 bb_error_msg("Invalid compressed data--length error"); 124 bb_error_msg("Invalid compressed data--length error");
125 return 1;
124 } 126 }
125 } 127 }
128 return 0;
126} 129}
127 130
128int unzip_main(int argc, char **argv) 131int unzip_main(int argc, char **argv)
@@ -137,7 +140,7 @@ int unzip_main(int argc, char **argv)
137 llist_t *zaccept = NULL; 140 llist_t *zaccept = NULL;
138 llist_t *zreject = NULL; 141 llist_t *zreject = NULL;
139 char *base_dir = NULL; 142 char *base_dir = NULL;
140 int i, opt, opt_range = 0, list_header_done = 0; 143 int failed, i, opt, opt_range = 0, list_header_done = 0;
141 char key_buf[512]; 144 char key_buf[512];
142 struct stat stat_buf; 145 struct stat stat_buf;
143 146
@@ -240,6 +243,8 @@ int unzip_main(int argc, char **argv)
240 if (verbosity != v_silent) 243 if (verbosity != v_silent)
241 printf("Archive: %s\n", src_fn); 244 printf("Archive: %s\n", src_fn);
242 245
246 failed = 0;
247
243 while (1) { 248 while (1) {
244 unsigned int magic; 249 unsigned int magic;
245 250
@@ -367,7 +372,9 @@ int unzip_main(int argc, char **argv)
367 if (verbosity == v_normal) { 372 if (verbosity == v_normal) {
368 printf(" inflating: %s\n", dst_fn); 373 printf(" inflating: %s\n", dst_fn);
369 } 374 }
370 unzip_extract(&zip_header, src_fd, dst_fd); 375 if (unzip_extract(&zip_header, src_fd, dst_fd)) {
376 failed = 1;
377 }
371 if (dst_fd != STDOUT_FILENO) { 378 if (dst_fd != STDOUT_FILENO) {
372 /* closing STDOUT is potentially bad for future business */ 379 /* closing STDOUT is potentially bad for future business */
373 close(dst_fd); 380 close(dst_fd);
@@ -409,7 +416,7 @@ int unzip_main(int argc, char **argv)
409 "%9d %d files\n", total_size, total_entries); 416 "%9d %d files\n", total_size, total_entries);
410 } 417 }
411 418
412 return(EXIT_SUCCESS); 419 return failed;
413} 420}
414 421
415/* END CODE */ 422/* END CODE */