From b5b5ee12d4b9489cc29167420b33bcae6a22c568 Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Tue, 21 Oct 2008 18:23:06 -0400 Subject: [PATCH] IFC SVN-Revision: 232 --- libarchive/archive_read_support_format_zip.c | 16 ++++++++++----- libarchive/archive_util.c | 4 ++-- libarchive/config_windows.h | 3 --- libarchive/test/test_read_format_zip.c | 11 ++++++++-- libarchive/test/test_read_format_zip.zip.uu | 21 ++++++++++---------- 5 files changed, 33 insertions(+), 22 deletions(-) diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c index 920060d43..a7703502b 100644 --- a/libarchive/archive_read_support_format_zip.c +++ b/libarchive/archive_read_support_format_zip.c @@ -24,7 +24,7 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_zip.c,v 1.26 2008/06/30 16:19:26 des Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_zip.c,v 1.27 2008/10/21 05:08:35 kientzle Exp $"); #ifdef HAVE_ERRNO_H #include @@ -439,7 +439,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; @@ -568,12 +570,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); } /* diff --git a/libarchive/archive_util.c b/libarchive/archive_util.c index 7fb469677..556508551 100644 --- a/libarchive/archive_util.c +++ b/libarchive/archive_util.c @@ -24,7 +24,7 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_util.c,v 1.18 2008/05/26 17:00:22 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/archive_util.c,v 1.19 2008/10/21 12:10:30 des Exp $"); #ifdef HAVE_SYS_TYPES_H #include @@ -168,6 +168,7 @@ archive_set_error(struct archive *a, int error_number, const char *fmt, ...) va_start(ap, fmt); archive_string_vsprintf(&(a->error_string), fmt, ap); + va_end(ap); if (error_number > 0) { archive_strcat(&(a->error_string), ": "); #ifdef HAVE_STRERROR_R @@ -184,7 +185,6 @@ archive_set_error(struct archive *a, int error_number, const char *fmt, ...) archive_strcat(&(a->error_string), errp); } a->error = a->error_string.s; - va_end(ap); } void diff --git a/libarchive/config_windows.h b/libarchive/config_windows.h index 354b80aed..6a0560d9e 100644 --- a/libarchive/config_windows.h +++ b/libarchive/config_windows.h @@ -194,9 +194,6 @@ /* Define to 1 if you have the `geteuid' function. */ /* #undef HAVE_GETEUID */ -/* Define to 1 if you have the `getopt_long' function. */ -/* #undef HAVE_GETOPT_LONG */ - /* Define to 1 if you have the `getxattr' function. */ /* #undef HAVE_GETXATTR */ diff --git a/libarchive/test/test_read_format_zip.c b/libarchive/test/test_read_format_zip.c index edd26a403..a3da17e73 100644 --- a/libarchive/test/test_read_format_zip.c +++ b/libarchive/test/test_read_format_zip.c @@ -23,7 +23,13 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_zip.c,v 1.7 2008/09/01 05:38:33 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_zip.c,v 1.8 2008/10/21 05:08:35 kientzle Exp $"); + +/* + * The reference file for this has been manually tweaked so that: + * * file2 has length-at-end but file1 does not + * * file2 has an invalid CRC + */ DEFINE_TEST(test_read_format_zip) { @@ -57,7 +63,8 @@ DEFINE_TEST(test_read_format_zip) assertA(0 == archive_read_next_header(a, &ae)); assertEqualString("file2", archive_entry_pathname(ae)); assertEqualInt(1179605932, archive_entry_mtime(ae)); - assertEqualInt(18, archive_entry_size(ae)); + failure("file2 has length-at-end, so we shouldn't see a valid size"); + assertEqualInt(0, archive_entry_size_is_set(ae)); failure("file2 has a bad CRC, so reading to end should fail"); assertEqualInt(ARCHIVE_WARN, archive_read_data(a, buff, 19)); assert(0 == memcmp(buff, "hello\nhello\nhello\n", 18)); diff --git a/libarchive/test/test_read_format_zip.zip.uu b/libarchive/test/test_read_format_zip.zip.uu index cf84ad393..b1f04c4fe 100644 --- a/libarchive/test/test_read_format_zip.zip.uu +++ b/libarchive/test/test_read_format_zip.zip.uu @@ -1,13 +1,14 @@ -$FreeBSD: src/lib/libarchive/test/test_read_format_zip.zip.uu,v 1.2 2008/06/26 11:50:11 des Exp $ +$FreeBSD: src/lib/libarchive/test/test_read_format_zip.zip.uu,v 1.3 2008/10/21 05:08:35 kientzle Exp $ begin 644 test_read_format_zip.zip -M4$L#!`H``````%EFLS8````````````````$`!4`9&ER+U54"0`#&55/1AE5 -M3T95>`0`Z`/H`U!+`P04````"`!O9K,V.C=F/0H````2````!0`5`&9I;&4Q -M550)``-!54]&K%M/1E5X!`#H`^@#RTC-R%8T$@H````2````!0`5`&9I;&4R550)``.L6T]&K%M/1E5X!`#H`^@#RTC- -MR%8T$@H````2````!0`-```````!````I(%Y```` -H9FEL93)55`4``ZQ;3T95>```4$L%!@`````#``,`OP```+L````````` +M4$L#!`H`"````%EFLS8````````````````$`!4`9&ER+U54"0`#&55/1M19 +M_4A5>`0`Z`/H`U!+!P@```````````````!02P,$%`````@`;V:S-CHW9CT* +M````$@````4`%0!F:6QE,554"0`#055/1L!9_4A5>`0`Z`/H`\M(S`0`Z`/H`\M(S```4$L!`A<#%``(``@`;V:S-CHW9CT*````$@````4`#0`` +M`````0```.V!1P```&9I;&4Q550%``-!54]&57@``%!+`0(7`Q0`"``(`%IJ +MLS8Z-V8]"@```!(````%``T```````$```#M@8D```!F:6QE,E54!0`#K%M/ +;1E5X``!02P4&``````,``P"_````VP`````` ` end -- 2.47.3