projects
/
oweals
/
busybox.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
c2dcb7c
)
unzip: move check for unsupported zip features to better place
author
Denis Vlasenko
<vda.linux@googlemail.com>
Sat, 26 Jul 2008 17:32:41 +0000
(17:32 -0000)
committer
Denis Vlasenko
<vda.linux@googlemail.com>
Sat, 26 Jul 2008 17:32:41 +0000
(17:32 -0000)
archival/unzip.c
patch
|
blob
|
history
diff --git
a/archival/unzip.c
b/archival/unzip.c
index 36490cb416a2f96f8188c84c7706a5519906df0f..1c9bc246c71accea6652db50fcc794c80c7df53e 100644
(file)
--- a/
archival/unzip.c
+++ b/
archival/unzip.c
@@
-99,12
+99,6
@@
static void unzip_create_leading_dirs(const char *fn)
static void unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
{
static void unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
{
- if (zip_header->formatted.flags & (0x0008|0x0001)) {
- /* 0x0001 - encrypted */
- /* 0x0008 - streaming. [u]cmpsize can be reliably gotten
- * only from Central Directory. See unzip_doc.txt */
- bb_error_msg_and_die("zip flags 8 and 1 are not supported");
- }
if (zip_header->formatted.method == 0) {
/* Method 0 - stored (not compressed) */
off_t size = zip_header->formatted.ucmpsize;
if (zip_header->formatted.method == 0) {
/* Method 0 - stored (not compressed) */
off_t size = zip_header->formatted.ucmpsize;
@@
-264,10
+258,11
@@
int unzip_main(int argc, char **argv)
/* Check magic number */
xread(src_fd, &magic, 4);
/* Check magic number */
xread(src_fd, &magic, 4);
+ /* Central directory? It's at the end, so exit */
if (magic == ZIP_CDS_MAGIC)
break;
if (magic != ZIP_FILEHEADER_MAGIC)
if (magic == ZIP_CDS_MAGIC)
break;
if (magic != ZIP_FILEHEADER_MAGIC)
- bb_error_msg_and_die("invalid zip magic %08X", magic);
+ bb_error_msg_and_die("invalid zip magic %08X",
(int)
magic);
/* Read the file header */
xread(src_fd, zip_header.raw, ZIP_HEADER_LEN);
/* Read the file header */
xread(src_fd, zip_header.raw, ZIP_HEADER_LEN);
@@
-275,6
+270,12
@@
int unzip_main(int argc, char **argv)
if ((zip_header.formatted.method != 0) && (zip_header.formatted.method != 8)) {
bb_error_msg_and_die("unsupported method %d", zip_header.formatted.method);
}
if ((zip_header.formatted.method != 0) && (zip_header.formatted.method != 8)) {
bb_error_msg_and_die("unsupported method %d", zip_header.formatted.method);
}
+ if (zip_header.formatted.flags & (0x0008|0x0001)) {
+ /* 0x0001 - encrypted */
+ /* 0x0008 - streaming. [u]cmpsize can be reliably gotten
+ * only from Central Directory. See unzip_doc.txt */
+ bb_error_msg_and_die("zip flags 8 and 1 are not supported");
+ }
/* Read filename */
free(dst_fn);
/* Read filename */
free(dst_fn);
@@
-331,7
+332,7
@@
int unzip_main(int argc, char **argv)
i = 'n';
} else { /* Extract file */
i = 'n';
} else { /* Extract file */
-
_
check_file:
+ check_file:
if (stat(dst_fn, &stat_buf) == -1) { /* File does not exist */
if (errno != ENOENT) {
bb_perror_msg_and_die("cannot stat '%s'", dst_fn);
if (stat(dst_fn, &stat_buf) == -1) { /* File does not exist */
if (errno != ENOENT) {
bb_perror_msg_and_die("cannot stat '%s'", dst_fn);
@@
-390,18
+391,19
@@
int unzip_main(int argc, char **argv)
free(dst_fn);
dst_fn = xstrdup(key_buf);
chomp(dst_fn);
free(dst_fn);
dst_fn = xstrdup(key_buf);
chomp(dst_fn);
- goto
_
check_file;
+ goto check_file;
default:
printf("error: invalid response [%c]\n",(char)i);
default:
printf("error: invalid response [%c]\n",(char)i);
- goto
_
check_file;
+ goto check_file;
}
}
- /* Data descriptor section */
- if (zip_header.formatted.flags & 4) {
- /* skip over duplicate crc, compressed size and uncompressed size */
- unzip_skip(src_fd, 12);
- }
+// Looks like bug (data descriptor cannot be identified this way)
+// /* Data descriptor section */
+// if (zip_header.formatted.flags & 4) {
+// /* skip over duplicate crc, compressed size and uncompressed size */
+// unzip_skip(src_fd, 12);
+// }
}
if (listing && verbose) {
}
if (listing && verbose) {