aboutsummaryrefslogtreecommitdiff
path: root/lib/libarchive/archive_read_support_format_zip.c
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@FreeBSD.org>2008-10-21 05:08:35 +0000
committerTim Kientzle <kientzle@FreeBSD.org>2008-10-21 05:08:35 +0000
commitee8a341ef45634a56596d7275a26c239eb1f854a (patch)
tree1eaa7d660a6e74ae91fab7197af4d2a8d27708eb /lib/libarchive/archive_read_support_format_zip.c
parent1f6a1a7802ce7d2140334fcd730a7fba462c547c (diff)
Notes
Diffstat (limited to 'lib/libarchive/archive_read_support_format_zip.c')
-rw-r--r--lib/libarchive/archive_read_support_format_zip.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/libarchive/archive_read_support_format_zip.c b/lib/libarchive/archive_read_support_format_zip.c
index e64c62c0c950..575cd331e4b9 100644
--- a/lib/libarchive/archive_read_support_format_zip.c
+++ b/lib/libarchive/archive_read_support_format_zip.c
@@ -444,7 +444,9 @@ zip_read_file_header(struct archive_read *a, struct archive_entry *entry,
archive_entry_set_mtime(entry, zip->mtime, 0);
archive_entry_set_ctime(entry, zip->ctime, 0);
archive_entry_set_atime(entry, zip->atime, 0);
- archive_entry_set_size(entry, zip->uncompressed_size);
+ /* Set the size only if it's meaningful. */
+ if (0 == (zip->flags & ZIP_LENGTH_AT_END))
+ archive_entry_set_size(entry, zip->uncompressed_size);
zip->entry_bytes_remaining = zip->compressed_size;
zip->entry_offset = 0;
@@ -573,12 +575,16 @@ archive_read_format_zip_read_data(struct archive_read *a,
}
break;
}
+ if (r != ARCHIVE_OK)
+ return (r);
/* Update checksum */
- if (r == ARCHIVE_OK && *size) {
+ if (*size)
zip->entry_crc32 =
crc32(zip->entry_crc32, *buff, *size);
- }
- return (r);
+ /* Return EOF immediately if this is a non-regular file. */
+ if (AE_IFREG != (zip->mode & AE_IFMT))
+ return (ARCHIVE_EOF);
+ return (ARCHIVE_OK);
}
/*