From: Michihiro NAKAJIMA Date: Thu, 15 Mar 2012 05:49:37 +0000 (+0900) Subject: Issue 249: Uncompressed CAB fails to read subfile when archive has certain structure. X-Git-Tag: v3.0.4~2^2~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34eb338153bfee607fdeabbf20602e6c645d3794;p=thirdparty%2Flibarchive.git Issue 249: Uncompressed CAB fails to read subfile when archive has certain structure. --- diff --git a/libarchive/archive_read_support_format_cab.c b/libarchive/archive_read_support_format_cab.c index d822acecb..d1ecd27b8 100644 --- a/libarchive/archive_read_support_format_cab.c +++ b/libarchive/archive_read_support_format_cab.c @@ -1794,9 +1794,8 @@ cab_consume_cfdata(struct archive_read *a, int64_t consumed_bytes) rbytes -= cbytes; if (cfdata->uncompressed_avail == 0 && - (cab->entry_cffolder->comptype == COMPTYPE_NONE || - cab->entry_cffile->folder == iFoldCONTINUED_PREV_AND_NEXT || - cab->entry_cffile->folder == iFoldCONTINUED_FROM_PREV)) { + (cab->entry_cffile->folder == iFoldCONTINUED_PREV_AND_NEXT || + cab->entry_cffile->folder == iFoldCONTINUED_FROM_PREV)) { /* We have not read any data yet. */ if (cbytes == cfdata->uncompressed_bytes_remaining) { /* Skip whole current CFDATA. */ diff --git a/libarchive/test/test_read_format_cab.c b/libarchive/test/test_read_format_cab.c index 4e8607ec8..8e7d55f84 100644 --- a/libarchive/test/test_read_format_cab.c +++ b/libarchive/test/test_read_format_cab.c @@ -269,13 +269,71 @@ finish: assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +/* + * Skip beginning files and Read the last file. + */ +static void +verify2(const char *refname, enum comp_type comp) +{ + struct archive_entry *ae; + struct archive *a; + char buff[128]; + char zero[128]; + + memset(zero, 0, sizeof(zero)); + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* Verify regular empty. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + if (comp != STORE) { + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + } + /* Verify regular file1. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + + /* Verify regular file2. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0777), archive_entry_mode(ae)); + assertEqualString("dir2/file2", archive_entry_pathname(ae)); + assertEqualInt(0, archive_entry_uid(ae)); + assertEqualInt(0, archive_entry_gid(ae)); + assertEqualInt(file2_size, archive_entry_size(ae)); + assertEqualInt(file2_size, archive_read_data(a, buff, file2_size)); + assertEqualMem(buff, file2, file2_size); + + /* End of archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + if (comp != STORE) { + assertEqualInt(4, archive_file_count(a)); + } else { + assertEqualInt(3, archive_file_count(a)); + } + + /* Verify archive format. */ + assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a)); + assertEqualIntA(a, ARCHIVE_FORMAT_CAB, archive_format(a)); + + /* Close the archive. */ + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + DEFINE_TEST(test_read_format_cab) { /* Verify Cabinet file in no compression. */ verify("test_read_format_cab_1.cab", STORE); + verify2("test_read_format_cab_1.cab", STORE); /* Verify Cabinet file in MSZIP. */ verify("test_read_format_cab_2.cab", MSZIP); + verify2("test_read_format_cab_2.cab", MSZIP); /* Verify Cabinet file in LZX. */ verify("test_read_format_cab_3.cab", LZX); + verify2("test_read_format_cab_3.cab", LZX); }