test_read_format_zip.c revision 358090
1185290Salfred/*- 2185290Salfred * Copyright (c) 2003-2007 Tim Kientzle 3185290Salfred * Copyright (c) 2011 Michihiro NAKAJIMA 4185290Salfred * All rights reserved. 5185290Salfred * 6185290Salfred * Redistribution and use in source and binary forms, with or without 7185290Salfred * modification, are permitted provided that the following conditions 8185290Salfred * are met: 9185290Salfred * 1. Redistributions of source code must retain the above copyright 10185290Salfred * notice, this list of conditions and the following disclaimer. 11185290Salfred * 2. Redistributions in binary form must reproduce the above copyright 12185290Salfred * notice, this list of conditions and the following disclaimer in the 13185290Salfred * documentation and/or other materials provided with the distribution. 14185290Salfred * 15185290Salfred * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16185290Salfred * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17185290Salfred * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18185290Salfred * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19185290Salfred * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20185290Salfred * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21185290Salfred * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22185290Salfred * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23185290Salfred * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24185290Salfred * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25185290Salfred */ 26185290Salfred#include "test.h" 27185290Salfred__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/test/test_read_format_zip.c 358090 2020-02-19 01:51:44Z mm $"); 28185290Salfred 29185290Salfred#define __LIBARCHIVE_BUILD 30185290Salfred#include <archive_crc32.h> 31185290Salfred 32185290Salfredstatic 33194677Sthompsaint extract_one(struct archive* a, struct archive_entry* ae, uint32_t crc) 34194677Sthompsa{ 35194677Sthompsa la_ssize_t fsize, bytes_read; 36194677Sthompsa uint8_t* buf; 37194677Sthompsa int ret = 1; 38194677Sthompsa uint32_t computed_crc; 39194677Sthompsa 40194677Sthompsa fsize = (la_ssize_t) archive_entry_size(ae); 41194677Sthompsa buf = malloc(fsize); 42194677Sthompsa if(buf == NULL) 43194677Sthompsa return 1; 44194677Sthompsa 45194677Sthompsa bytes_read = archive_read_data(a, buf, fsize); 46194677Sthompsa if(bytes_read != fsize) { 47194677Sthompsa assertEqualInt(bytes_read, fsize); 48194677Sthompsa goto fn_exit; 49194677Sthompsa } 50194677Sthompsa 51194677Sthompsa computed_crc = crc32(0, buf, fsize); 52194677Sthompsa assertEqualInt(computed_crc, crc); 53194677Sthompsa ret = 0; 54194677Sthompsa 55194677Sthompsafn_exit: 56241555Sn_hibma free(buf); 57188746Sthompsa return ret; 58185290Salfred} 59185290Salfred 60188942Sthompsastatic 61188942Sthompsaint extract_one_using_blocks(struct archive* a, int block_size, uint32_t crc) 62188942Sthompsa{ 63185290Salfred uint8_t* buf; 64188942Sthompsa int ret = 1; 65215095Sn_hibma uint32_t computed_crc = 0; 66185290Salfred la_ssize_t bytes_read; 67207077Sthompsa 68185290Salfred buf = malloc(block_size); 69185290Salfred if(buf == NULL) 70227309Sed return 1; 71192502Sthompsa 72188989Sthompsa while(1) { 73185290Salfred bytes_read = archive_read_data(a, buf, block_size); 74185290Salfred if(bytes_read == ARCHIVE_RETRY) 75208015Sthompsa continue; 76185290Salfred else if(bytes_read == 0) 77185290Salfred break; 78271896Shselasky else if(bytes_read < 0) { 79271896Shselasky /* If we're here, it means the decompressor has failed 80185290Salfred * to properly decode test file. */ 81215095Sn_hibma assertA(0); 82201681Sthompsa ret = 1; 83201681Sthompsa goto fn_exit; 84201681Sthompsa } else { 85201681Sthompsa /* ok */ 86201681Sthompsa } 87201681Sthompsa 88201681Sthompsa computed_crc = crc32(computed_crc, buf, bytes_read); 89201681Sthompsa } 90203905Sthompsa 91273885Shselasky assertEqualInt(computed_crc, crc); 92273885Shselasky ret = 0; 93186730Salfred 94187259Sthompsafn_exit: 95187259Sthompsa free(buf); 96187259Sthompsa return ret; 97241555Sn_hibma} 98188413Sthompsa 99187259Sthompsa/* 100187259Sthompsa * The reference file for this has been manually tweaked so that: 101185290Salfred * * file2 has length-at-end but file1 does not 102192984Sthompsa * * file2 has an invalid CRC 103192984Sthompsa */ 104185290Salfredstatic void 105192984Sthompsaverify_basic(struct archive *a, int seek_checks) 106241555Sn_hibma{ 107241555Sn_hibma struct archive_entry *ae; 108241555Sn_hibma char *buff[128]; 109241555Sn_hibma const void *pv; 110241555Sn_hibma size_t s; 111192984Sthompsa int64_t o; 112189265Sthompsa 113185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 114241555Sn_hibma assertEqualString("ZIP 1.0 (uncompressed)", archive_format_name(a)); 115185290Salfred assertEqualString("dir/", archive_entry_pathname(ae)); 116185290Salfred assertEqualInt(1179604249, archive_entry_mtime(ae)); 117185290Salfred assertEqualInt(0, archive_entry_size(ae)); 118185290Salfred if (seek_checks) 119185290Salfred assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae)); 120239299Shselasky assertEqualInt(archive_entry_is_encrypted(ae), 0); 121185290Salfred assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); 122193045Sthompsa assertEqualIntA(a, ARCHIVE_EOF, 123193045Sthompsa archive_read_data_block(a, &pv, &s, &o)); 124241555Sn_hibma assertEqualInt((int)s, 0); 125185290Salfred 126241555Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 127241555Sn_hibma assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); 128241555Sn_hibma assertEqualString("file1", archive_entry_pathname(ae)); 129192984Sthompsa assertEqualInt(1179604289, archive_entry_mtime(ae)); 130192984Sthompsa if (seek_checks) 131192984Sthompsa assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 132192984Sthompsa assertEqualInt(18, archive_entry_size(ae)); 133241555Sn_hibma assertEqualInt(archive_entry_is_encrypted(ae), 0); 134241555Sn_hibma assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); 135185290Salfred failure("archive_read_data() returns number of bytes read"); 136200653Sthompsa if (archive_zlib_version() != NULL) { 137200653Sthompsa assertEqualInt(18, archive_read_data(a, buff, 19)); 138200653Sthompsa assertEqualMem(buff, "hello\nhello\nhello\n", 18); 139186730Salfred } else { 140186730Salfred assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19)); 141200653Sthompsa assertEqualString(archive_error_string(a), 142200653Sthompsa "Unsupported ZIP compression method (8: deflation)"); 143192984Sthompsa assert(archive_errno(a) != 0); 144185290Salfred } 145187259Sthompsa 146185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 147185290Salfred assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); 148185290Salfred assertEqualString("file2", archive_entry_pathname(ae)); 149190734Sthompsa assertEqualInt(1179605932, archive_entry_mtime(ae)); 150271896Shselasky assertEqualInt(archive_entry_is_encrypted(ae), 0); 151190734Sthompsa assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); 152190734Sthompsa if (seek_checks) { 153185290Salfred assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); 154185290Salfred } 155187259Sthompsa assert(archive_entry_size_is_set(ae)); 156185290Salfred assertEqualInt(18, archive_entry_size(ae)); 157185290Salfred if (archive_zlib_version() != NULL) { 158185290Salfred failure("file2 has a bad CRC, so read should fail and not change buff"); 159190734Sthompsa memset(buff, 'a', 19); 160190734Sthompsa assertEqualInt(ARCHIVE_WARN, archive_read_data(a, buff, 19)); 161190734Sthompsa assertEqualMem(buff, "aaaaaaaaaaaaaaaaaaa", 19); 162185290Salfred } else { 163241555Sn_hibma assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19)); 164241555Sn_hibma assertEqualString(archive_error_string(a), 165241555Sn_hibma "Unsupported ZIP compression method (8: deflation)"); 166241555Sn_hibma assert(archive_errno(a) != 0); 167241555Sn_hibma } 168241555Sn_hibma assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); 169241555Sn_hibma assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); 170241555Sn_hibma /* Verify the number of files read. */ 171241555Sn_hibma failure("the archive file has three files"); 172185290Salfred assertEqualInt(3, archive_file_count(a)); 173185290Salfred assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 174192984Sthompsa assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 175241555Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 176241555Sn_hibma assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 177241555Sn_hibma} 178194228Sthompsa 179194228Sthompsastatic void 180194228Sthompsatest_basic(void) 181194228Sthompsa{ 182241555Sn_hibma const char *refname = "test_read_format_zip.zip"; 183239180Shselasky struct archive *a; 184185290Salfred char *p; 185185290Salfred size_t s; 186185290Salfred 187185290Salfred extract_reference_file(refname); 188185290Salfred 189185290Salfred /* Verify with seeking reader. */ 190239180Shselasky assert((a = archive_read_new()) != NULL); 191185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 192185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 193185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240)); 194185290Salfred verify_basic(a, 1); 195185290Salfred 196185290Salfred /* Verify with streaming reader. */ 197185290Salfred p = slurpfile(&s, "%s", refname); 198185290Salfred assert((a = archive_read_new()) != NULL); 199185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 200185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 201189275Sthompsa assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 31)); 202188942Sthompsa verify_basic(a, 0); 203188942Sthompsa free(p); 204212122Sthompsa} 205185290Salfred 206223486Shselasky/* 207191868Sthompsa * Read Info-ZIP New Unix Extra Field 0x7875 "ux". 208200657Sthompsa * Currently stores Unix UID/GID up to 32 bits. 209200657Sthompsa */ 210200657Sthompsastatic void 211243663Seadlerverify_info_zip_ux(struct archive *a, int seek_checks) 212200657Sthompsa{ 213200657Sthompsa struct archive_entry *ae; 214200657Sthompsa char *buff[128]; 215200657Sthompsa 216200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 217200657Sthompsa assertEqualString("file1", archive_entry_pathname(ae)); 218200658Sthompsa assertEqualInt(1300668680, archive_entry_mtime(ae)); 219200657Sthompsa assertEqualInt(18, archive_entry_size(ae)); 220200657Sthompsa assertEqualInt(archive_entry_is_encrypted(ae), 0); 221200657Sthompsa assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); 222200657Sthompsa if (seek_checks) 223201681Sthompsa assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae)); 224200657Sthompsa failure("zip reader should read Info-ZIP New Unix Extra Field"); 225200657Sthompsa assertEqualInt(1001, archive_entry_uid(ae)); 226200657Sthompsa assertEqualInt(1001, archive_entry_gid(ae)); 227200657Sthompsa if (archive_zlib_version() != NULL) { 228200657Sthompsa failure("archive_read_data() returns number of bytes read"); 229200657Sthompsa assertEqualInt(18, archive_read_data(a, buff, 19)); 230200657Sthompsa assertEqualMem(buff, "hello\nhello\nhello\n", 18); 231200657Sthompsa } else { 232200657Sthompsa assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19)); 233200657Sthompsa assertEqualString(archive_error_string(a), 234200657Sthompsa "Unsupported ZIP compression method (8: deflation)"); 235200657Sthompsa assert(archive_errno(a) != 0); 236200657Sthompsa } 237200657Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 238200657Sthompsa 239200657Sthompsa /* Verify the number of files read. */ 240248499Shselasky failure("the archive file has just one file"); 241248499Shselasky assertEqualInt(1, archive_file_count(a)); 242277852Shselasky 243277852Shselasky assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); 244200657Sthompsa assertEqualIntA(a, ARCHIVE_FORMAT_ZIP, archive_format(a)); 245200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 246200657Sthompsa assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 247272218Shselasky} 248272218Shselasky 249201681Sthompsastatic void 250201681Sthompsatest_info_zip_ux(void) 251201681Sthompsa{ 252201681Sthompsa const char *refname = "test_read_format_zip_ux.zip"; 253201681Sthompsa struct archive *a; 254201681Sthompsa char *p; 255201681Sthompsa size_t s; 256201681Sthompsa 257201681Sthompsa extract_reference_file(refname); 258201681Sthompsa 259201681Sthompsa /* Verify with seeking reader. */ 260201681Sthompsa assert((a = archive_read_new()) != NULL); 261201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 262201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 263201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240)); 264201681Sthompsa verify_info_zip_ux(a, 1); 265201681Sthompsa 266201681Sthompsa /* Verify with streaming reader. */ 267201681Sthompsa p = slurpfile(&s, "%s", refname); 268201681Sthompsa assert((a = archive_read_new()) != NULL); 269201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 270201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 271201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 108)); 272201681Sthompsa verify_info_zip_ux(a, 0); 273201681Sthompsa free(p); 274201681Sthompsa} 275201681Sthompsa 276201681Sthompsa/* 277201681Sthompsa * Verify that test_read_extract correctly works with 278201681Sthompsa * Zip entries that use length-at-end. 279201681Sthompsa */ 280201681Sthompsastatic void 281201681Sthompsaverify_extract_length_at_end(struct archive *a, int seek_checks) 282201681Sthompsa{ 283201681Sthompsa struct archive_entry *ae; 284201681Sthompsa 285201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 286201681Sthompsa 287201681Sthompsa assertEqualInt(archive_entry_is_encrypted(ae), 0); 288201681Sthompsa assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); 289201681Sthompsa assertEqualString("hello.txt", archive_entry_pathname(ae)); 290201681Sthompsa if (seek_checks) { 291201681Sthompsa assertEqualInt(AE_IFREG | 0644, archive_entry_mode(ae)); 292201681Sthompsa assert(archive_entry_size_is_set(ae)); 293201681Sthompsa assertEqualInt(6, archive_entry_size(ae)); 294201681Sthompsa } else { 295201681Sthompsa assert(!archive_entry_size_is_set(ae)); 296201681Sthompsa assertEqualInt(0, archive_entry_size(ae)); 297201681Sthompsa } 298201681Sthompsa 299201681Sthompsa if (archive_zlib_version() != NULL) { 300201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_extract(a, ae, 0)); 301201681Sthompsa assertFileContents("hello\x0A", 6, "hello.txt"); 302201681Sthompsa } else { 303201681Sthompsa assertEqualIntA(a, ARCHIVE_FAILED, archive_read_extract(a, ae, 0)); 304201681Sthompsa assertEqualString(archive_error_string(a), 305201681Sthompsa "Unsupported ZIP compression method (8: deflation)"); 306201681Sthompsa assert(archive_errno(a) != 0); 307201681Sthompsa } 308201681Sthompsa 309201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 310201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 311225041Shselasky} 312225041Shselasky 313238493Shselaskystatic void 314238493Shselaskytest_extract_length_at_end(void) 315201681Sthompsa{ 316201681Sthompsa const char *refname = "test_read_format_zip_length_at_end.zip"; 317201681Sthompsa char *p; 318238717Srea size_t s; 319289215Shselasky struct archive *a; 320201681Sthompsa 321203905Sthompsa extract_reference_file(refname); 322215734Sn_hibma 323273886Shselasky /* Verify extraction with seeking reader. */ 324273886Shselasky assert((a = archive_read_new()) != NULL); 325213879Shselasky assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 326215326Sdd assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 327242906Shselasky assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240)); 328242906Shselasky verify_extract_length_at_end(a, 1); 329242906Shselasky 330242906Shselasky /* Verify extraction with streaming reader. */ 331238079Shselasky p = slurpfile(&s, "%s", refname); 332200658Sthompsa assert((a = archive_read_new()) != NULL); 333200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); 334210534Sgavin assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); 335215258Sn_hibma assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 108)); 336215258Sn_hibma verify_extract_length_at_end(a, 0); 337224239Shselasky free(p); 338199332Sthompsa} 339213879Shselasky 340200657Sthompsastatic void 341191868Sthompsatest_symlink(void) 342200657Sthompsa{ 343200657Sthompsa const char *refname = "test_read_format_zip_symlink.zip"; 344200657Sthompsa char *p; 345200657Sthompsa size_t s; 346200657Sthompsa struct archive *a; 347218178Sn_hibma struct archive_entry *ae; 348269270Shselasky 349191868Sthompsa extract_reference_file(refname); 350244837Shselasky p = slurpfile(&s, "%s", refname); 351259592Struckman 352191868Sthompsa /* Symlinks can only be extracted with the seeking reader. */ 353191868Sthompsa assert((a = archive_read_new()) != NULL); 354200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 355191868Sthompsa assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 1)); 356191868Sthompsa 357201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 358191868Sthompsa assertEqualString("file", archive_entry_pathname(ae)); 359191868Sthompsa assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 360191868Sthompsa assertEqualInt(archive_entry_is_encrypted(ae), 0); 361191868Sthompsa assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); 362191868Sthompsa 363191868Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 364191868Sthompsa assertEqualString("symlink", archive_entry_pathname(ae)); 365245427Shselasky assertEqualInt(AE_IFLNK, archive_entry_filetype(ae)); 366200657Sthompsa assertEqualInt(0, archive_entry_size(ae)); 367200657Sthompsa assertEqualString("file", archive_entry_symlink(ae)); 368200657Sthompsa assertEqualInt(archive_entry_is_encrypted(ae), 0); 369200657Sthompsa assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); 370200657Sthompsa 371200657Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 372200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 373200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 374200657Sthompsa 375200657Sthompsa free(p); 376200657Sthompsa} 377202054Sthompsa 378200657SthompsaDEFINE_TEST(test_read_format_zip) 379200657Sthompsa{ 380200657Sthompsa test_basic(); 381200658Sthompsa test_info_zip_ux(); 382200658Sthompsa test_extract_length_at_end(); 383200658Sthompsa test_symlink(); 384200658Sthompsa} 385200658Sthompsa 386200658SthompsaDEFINE_TEST(test_read_format_zip_ppmd_one_file) 387200657Sthompsa{ 388200658Sthompsa const char *refname = "test_read_format_zip_ppmd8.zipx"; 389200657Sthompsa struct archive *a; 390200657Sthompsa struct archive_entry *ae; 391200657Sthompsa 392200657Sthompsa extract_reference_file(refname); 393200657Sthompsa 394200658Sthompsa assert((a = archive_read_new()) != NULL); 395200658Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 396200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 397200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 398252294Sremko assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a)); 399200657Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 400200657Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA)); 401234541Skevlo assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 402278863Sdchagin assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 403230238Shselasky assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 404238529Shselasky} 405238526Shselasky 406275789ShselaskyDEFINE_TEST(test_read_format_zip_ppmd_one_file_blockread) 407275789Shselasky{ 408200658Sthompsa const char *refname = "test_read_format_zip_ppmd8.zipx"; 409275789Shselasky struct archive *a; 410275789Shselasky struct archive_entry *ae; 411200658Sthompsa 412200658Sthompsa extract_reference_file(refname); 413201681Sthompsa 414200657Sthompsa assert((a = archive_read_new()) != NULL); 415200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 416200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 417200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 418200657Sthompsa assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a)); 419200657Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 420200657Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xBA8E3BAA)); 421200657Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 422200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 423200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 424200657Sthompsa} 425200657Sthompsa 426200657SthompsaDEFINE_TEST(test_read_format_zip_ppmd_multi) 427200657Sthompsa{ 428200657Sthompsa const char *refname = "test_read_format_zip_ppmd8_multi.zipx"; 429200657Sthompsa struct archive *a; 430200657Sthompsa struct archive_entry *ae; 431200657Sthompsa 432200657Sthompsa extract_reference_file(refname); 433200657Sthompsa 434200657Sthompsa assert((a = archive_read_new()) != NULL); 435200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 436200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 437200657Sthompsa 438200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 439200657Sthompsa assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a)); 440200657Sthompsa assertEqualString("smartd.conf", archive_entry_pathname(ae)); 441200657Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0x8DD7379E)); 442200657Sthompsa 443200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 444200657Sthompsa assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a)); 445200657Sthompsa assertEqualString("ts.conf", archive_entry_pathname(ae)); 446200657Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0x7AE59B31)); 447200657Sthompsa 448200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 449200657Sthompsa assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a)); 450200657Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 451200657Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA)); 452200657Sthompsa 453200657Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 454200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 455200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 456200657Sthompsa} 457200657Sthompsa 458200657SthompsaDEFINE_TEST(test_read_format_zip_ppmd_multi_blockread) 459200657Sthompsa{ 460200657Sthompsa const char *refname = "test_read_format_zip_ppmd8_multi.zipx"; 461200657Sthompsa struct archive *a; 462200657Sthompsa struct archive_entry *ae; 463200657Sthompsa 464200657Sthompsa extract_reference_file(refname); 465200657Sthompsa 466200657Sthompsa assert((a = archive_read_new()) != NULL); 467200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 468200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 469200657Sthompsa 470200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 471200657Sthompsa assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a)); 472200657Sthompsa assertEqualString("smartd.conf", archive_entry_pathname(ae)); 473200657Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 12, 0x8DD7379E)); 474200657Sthompsa 475217637Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 476200657Sthompsa assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a)); 477200657Sthompsa assertEqualString("ts.conf", archive_entry_pathname(ae)); 478273886Shselasky assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0x7AE59B31)); 479273886Shselasky 480274699Shselasky assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 481274699Shselasky assertEqualString("ZIP 6.3 (ppmd-1)", archive_format_name(a)); 482200658Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 483200658Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 14, 0xBA8E3BAA)); 484203506Sthompsa 485280569Shselasky assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 486280569Shselasky assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 487200658Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 488200658Sthompsa} 489200658Sthompsa 490200657SthompsaDEFINE_TEST(test_read_format_zip_lzma_one_file) 491200657Sthompsa{ 492200657Sthompsa const char *refname = "test_read_format_zip_lzma.zipx"; 493191868Sthompsa struct archive *a; 494231713Shselasky struct archive_entry *ae; 495191868Sthompsa 496287655Sgarga assert((a = archive_read_new()) != NULL); 497200657Sthompsa if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { 498200657Sthompsa skipping("lzma reading not fully supported on this platform"); 499200657Sthompsa assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 500191868Sthompsa return; 501191868Sthompsa } 502191868Sthompsa extract_reference_file(refname); 503191868Sthompsa 504191868Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 505191868Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 506200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 507200657Sthompsa assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a)); 508191870Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 509200657Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA)); 510200657Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 511200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 512200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 513200657Sthompsa} 514200657Sthompsa 515200657SthompsaDEFINE_TEST(test_read_format_zip_lzma_one_file_blockread) 516200657Sthompsa{ 517191868Sthompsa const char *refname = "test_read_format_zip_lzma.zipx"; 518200657Sthompsa struct archive *a; 519191868Sthompsa struct archive_entry *ae; 520191868Sthompsa 521191868Sthompsa assert((a = archive_read_new()) != NULL); 522200657Sthompsa if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { 523200657Sthompsa skipping("lzma reading not fully supported on this platform"); 524200657Sthompsa assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 525282818Sgarga return; 526288101Sgarga } 527215330Sthompsa extract_reference_file(refname); 528191868Sthompsa 529191868Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 530191868Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 531200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 532191868Sthompsa assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a)); 533200657Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 534200657Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xBA8E3BAA)); 535200657Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 536191868Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 537191868Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 538200657Sthompsa} 539200657Sthompsa 540191868SthompsaDEFINE_TEST(test_read_format_zip_lzma_multi) 541200657Sthompsa{ 542200657Sthompsa const char *refname = "test_read_format_zip_lzma_multi.zipx"; 543200657Sthompsa struct archive *a; 544200657Sthompsa struct archive_entry *ae; 545200657Sthompsa 546200657Sthompsa assert((a = archive_read_new()) != NULL); 547200657Sthompsa if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { 548200657Sthompsa skipping("lzma reading not fully supported on this platform"); 549200657Sthompsa assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 550200657Sthompsa return; 551201681Sthompsa } 552200657Sthompsa extract_reference_file(refname); 553200657Sthompsa 554200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 555200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 556200657Sthompsa 557200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 558200657Sthompsa assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a)); 559200657Sthompsa assertEqualString("smartd.conf", archive_entry_pathname(ae)); 560200657Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0x8DD7379E)); 561200657Sthompsa 562200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 563200657Sthompsa assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a)); 564200657Sthompsa assertEqualString("ts.conf", archive_entry_pathname(ae)); 565200657Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0x7AE59B31)); 566200657Sthompsa 567200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 568200657Sthompsa assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a)); 569200657Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 570213480Sglebius assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA)); 571200657Sthompsa 572200657Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 573200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 574200657Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 575200657Sthompsa} 576200657Sthompsa 577244047ShselaskyDEFINE_TEST(test_read_format_zip_lzma_multi_blockread) 578200657Sthompsa{ 579201681Sthompsa const char *refname = "test_read_format_zip_lzma_multi.zipx"; 580201681Sthompsa struct archive *a; 581201681Sthompsa struct archive_entry *ae; 582203507Sthompsa 583206544Skevlo assert((a = archive_read_new()) != NULL); 584201681Sthompsa if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { 585200657Sthompsa skipping("lzma reading not fully supported on this platform"); 586186730Salfred assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 587186730Salfred return; 588201681Sthompsa } 589192984Sthompsa extract_reference_file(refname); 590186730Salfred 591192984Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 592186730Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 593186730Salfred 594186730Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 595186730Salfred assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a)); 596186730Salfred assertEqualString("smartd.conf", archive_entry_pathname(ae)); 597186730Salfred assertEqualIntA(a, 0, extract_one_using_blocks(a, 12, 0x8DD7379E)); 598186730Salfred 599194228Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 600186730Salfred assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a)); 601186730Salfred assertEqualString("ts.conf", archive_entry_pathname(ae)); 602186730Salfred assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0x7AE59B31)); 603201681Sthompsa 604186730Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 605186730Salfred assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a)); 606201681Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 607192984Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 14, 0xBA8E3BAA)); 608186730Salfred 609192984Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 610186730Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 611186730Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 612186730Salfred} 613186730Salfred 614186730Salfred 615186730SalfredDEFINE_TEST(test_read_format_zip_bzip2_one_file) 616186730Salfred{ 617194228Sthompsa const char *refname = "test_read_format_zip_bzip2.zipx"; 618186730Salfred struct archive *a; 619186730Salfred struct archive_entry *ae; 620186730Salfred 621201681Sthompsa assert((a = archive_read_new()) != NULL); 622186730Salfred if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { 623186730Salfred skipping("bzip2 is not fully supported on this platform"); 624188989Sthompsa archive_read_close(a); 625192984Sthompsa return; 626188989Sthompsa } 627188989Sthompsa extract_reference_file(refname); 628188989Sthompsa 629188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 630188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 631188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 632188989Sthompsa assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a)); 633188989Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 634188989Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA)); 635188989Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 636188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 637188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 638188989Sthompsa} 639188989Sthompsa 640188989SthompsaDEFINE_TEST(test_read_format_zip_bzip2_one_file_blockread) 641188989Sthompsa{ 642188989Sthompsa const char *refname = "test_read_format_zip_bzip2.zipx"; 643188989Sthompsa struct archive *a; 644188989Sthompsa struct archive_entry *ae; 645188989Sthompsa 646188989Sthompsa assert((a = archive_read_new()) != NULL); 647188989Sthompsa if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { 648188989Sthompsa skipping("bzip2 is not fully supported on this platform"); 649188989Sthompsa archive_read_close(a); 650188989Sthompsa return; 651188989Sthompsa } 652188989Sthompsa extract_reference_file(refname); 653188989Sthompsa 654188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 655188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 656188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 657192984Sthompsa assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a)); 658193045Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 659188989Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xBA8E3BAA)); 660188989Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 661188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 662188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 663188989Sthompsa} 664188989Sthompsa 665194228SthompsaDEFINE_TEST(test_read_format_zip_bzip2_multi) 666188989Sthompsa{ 667188989Sthompsa const char *refname = "test_read_format_zip_bzip2_multi.zipx"; 668188989Sthompsa struct archive *a; 669188989Sthompsa struct archive_entry *ae; 670188989Sthompsa 671188989Sthompsa assert((a = archive_read_new()) != NULL); 672188989Sthompsa if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { 673188989Sthompsa skipping("bzip2 is not fully supported on this platform"); 674188989Sthompsa archive_read_close(a); 675188989Sthompsa return; 676188989Sthompsa } 677188989Sthompsa extract_reference_file(refname); 678188989Sthompsa 679188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 680194228Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 681188989Sthompsa 682188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 683188989Sthompsa assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a)); 684188989Sthompsa assertEqualString("smartd.conf", archive_entry_pathname(ae)); 685188989Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0x8DD7379E)); 686194228Sthompsa 687189546Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 688189546Sthompsa assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a)); 689189546Sthompsa assertEqualString("ts.conf", archive_entry_pathname(ae)); 690189546Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0x7AE59B31)); 691189546Sthompsa 692189546Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 693189546Sthompsa assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a)); 694189546Sthompsa assertEqualString("vimrc", archive_entry_pathname(ae)); 695189546Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA)); 696189546Sthompsa 697189546Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 698189546Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 699188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 700188989Sthompsa} 701188989Sthompsa 702188989SthompsaDEFINE_TEST(test_read_format_zip_bzip2_multi_blockread) 703188989Sthompsa{ 704186730Salfred const char *refname = "test_read_format_zip_bzip2_multi.zipx"; 705186730Salfred struct archive *a; 706186730Salfred struct archive_entry *ae; 707186730Salfred 708186730Salfred assert((a = archive_read_new()) != NULL); 709186730Salfred if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { 710200653Sthompsa skipping("bzip2 is not fully supported on this platform"); 711200653Sthompsa archive_read_close(a); 712192984Sthompsa return; 713186730Salfred } 714192984Sthompsa extract_reference_file(refname); 715192984Sthompsa 716201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 717215095Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 718186730Salfred 719200653Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 720200653Sthompsa assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a)); 721200653Sthompsa assertEqualString("smartd.conf", archive_entry_pathname(ae)); 722194228Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 12, 0x8DD7379E)); 723200653Sthompsa 724200653Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 725186730Salfred assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a)); 726200653Sthompsa assertEqualString("ts.conf", archive_entry_pathname(ae)); 727200653Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0x7AE59B31)); 728215095Sn_hibma 729215095Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 730215095Sn_hibma assertEqualString("ZIP 4.6 (bzip)", archive_format_name(a)); 731215095Sn_hibma assertEqualString("vimrc", archive_entry_pathname(ae)); 732215095Sn_hibma assertEqualIntA(a, 0, extract_one_using_blocks(a, 14, 0xBA8E3BAA)); 733215095Sn_hibma 734215095Sn_hibma assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 735215095Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 736215095Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 737215095Sn_hibma} 738215095Sn_hibma 739215095Sn_hibmaDEFINE_TEST(test_read_format_zip_xz_multi) 740215095Sn_hibma{ 741215095Sn_hibma const char *refname = "test_read_format_zip_xz_multi.zipx"; 742215095Sn_hibma struct archive *a; 743215095Sn_hibma struct archive_entry *ae; 744215095Sn_hibma 745273885Shselasky assert((a = archive_read_new()) != NULL); 746273885Shselasky if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { 747215095Sn_hibma skipping("lzma reading not fully supported on this platform"); 748215095Sn_hibma assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 749215095Sn_hibma return; 750215095Sn_hibma } 751215095Sn_hibma extract_reference_file(refname); 752201681Sthompsa 753186730Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 754214852Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 755215095Sn_hibma 756215095Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 757215095Sn_hibma assertEqualString("ZIP 2.0 (xz)", archive_format_name(a)); 758214852Sn_hibma assertEqualString("bash.bashrc", archive_entry_pathname(ae)); 759214852Sn_hibma assertEqualIntA(a, 0, extract_one(a, ae, 0xF751B8C9)); 760215095Sn_hibma 761201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 762201681Sthompsa assertEqualString("ZIP 2.0 (xz)", archive_format_name(a)); 763201681Sthompsa assertEqualString("pacman.conf", archive_entry_pathname(ae)); 764203905Sthompsa assertEqualIntA(a, 0, extract_one(a, ae, 0xB20B7F88)); 765203905Sthompsa 766203905Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 767273885Shselasky assertEqualString("ZIP 2.0 (xz)", archive_format_name(a)); 768273885Shselasky assertEqualString("profile", archive_entry_pathname(ae)); 769273885Shselasky assertEqualIntA(a, 0, extract_one(a, ae, 0x2329F054)); 770201681Sthompsa 771201681Sthompsa assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 772201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 773201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 774201681Sthompsa} 775201681Sthompsa 776201681SthompsaDEFINE_TEST(test_read_format_zip_xz_multi_blockread) 777214852Sn_hibma{ 778214852Sn_hibma const char *refname = "test_read_format_zip_xz_multi.zipx"; 779201681Sthompsa struct archive *a; 780201681Sthompsa struct archive_entry *ae; 781201681Sthompsa 782201681Sthompsa assert((a = archive_read_new()) != NULL); 783213480Sglebius if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { 784213480Sglebius skipping("lzma reading not fully supported on this platform"); 785213480Sglebius assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 786201681Sthompsa return; 787201681Sthompsa } 788201681Sthompsa extract_reference_file(refname); 789201681Sthompsa 790201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 791201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 792201681Sthompsa 793201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 794201681Sthompsa assertEqualString("ZIP 2.0 (xz)", archive_format_name(a)); 795201681Sthompsa assertEqualString("bash.bashrc", archive_entry_pathname(ae)); 796201681Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 12, 0xF751B8C9)); 797186730Salfred 798201681Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 799201681Sthompsa assertEqualString("ZIP 2.0 (xz)", archive_format_name(a)); 800201681Sthompsa assertEqualString("pacman.conf", archive_entry_pathname(ae)); 801201681Sthompsa assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xB20B7F88)); 802186730Salfred 803186730Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 804186730Salfred assertEqualString("ZIP 2.0 (xz)", archive_format_name(a)); 805186730Salfred assertEqualString("profile", archive_entry_pathname(ae)); 806186730Salfred assertEqualIntA(a, 0, extract_one_using_blocks(a, 14, 0x2329F054)); 807186730Salfred 808186730Salfred assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 809186730Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 810200653Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 811200653Sthompsa} 812186730Salfred 813186730SalfredDEFINE_TEST(test_read_format_zip_ppmd8_crash_1) 814200653Sthompsa{ 815186730Salfred const char *refname = "test_read_format_zip_ppmd8_crash_2.zipx"; 816186730Salfred struct archive *a; 817186730Salfred struct archive_entry *ae; 818186730Salfred char buf[64]; 819186730Salfred 820186730Salfred extract_reference_file(refname); 821186730Salfred 822186730Salfred assert((a = archive_read_new()) != NULL); 823185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 824185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 100)); 825192984Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 826185290Salfred 827192499Sthompsa /* This file shouldn't be properly decompressed, because it's invalid. 828185290Salfred * However, unpacker should return an error during unpacking. Without the 829185290Salfred * proper fix, the unpacker was entering an unlimited loop. */ 830185290Salfred assertEqualIntA(a, ARCHIVE_FATAL, archive_read_data(a, buf, 1)); 831185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 832185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 833185290Salfred} 834185290Salfred 835185290SalfredDEFINE_TEST(test_read_format_zip_bz2_hang_on_invalid) 836200653Sthompsa{ 837185290Salfred const char *refname = "test_read_format_zip_bz2_hang.zip"; 838185290Salfred struct archive *a; 839185290Salfred struct archive_entry *ae; 840185290Salfred char buf[8]; 841185290Salfred 842192984Sthompsa assert((a = archive_read_new()) != NULL); 843192984Sthompsa if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { 844185290Salfred skipping("bzip2 is not fully supported on this platform"); 845192984Sthompsa archive_read_close(a); 846192984Sthompsa return; 847191892Sthompsa } 848201681Sthompsa extract_reference_file(refname); 849191869Sthompsa 850188413Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 851185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 852185290Salfred assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 853185290Salfred 854201681Sthompsa /* The file `refname` is invalid in this case, so this call should fail. 855215095Sn_hibma * But it shouldn't crash. */ 856215095Sn_hibma assertEqualIntA(a, ARCHIVE_FATAL, archive_read_data(a, buf, 64)); 857188989Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 858215095Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 859188989Sthompsa} 860187728Sthompsa 861187728SthompsaDEFINE_TEST(test_read_format_zip_ppmd8_crash_2) 862187728Sthompsa{ 863187728Sthompsa const char *refname = "test_read_format_zip_ppmd8_crash_2.zipx"; 864194228Sthompsa struct archive *a; 865189265Sthompsa struct archive_entry *ae; 866239180Shselasky char buf[64]; 867185290Salfred 868185290Salfred extract_reference_file(refname); 869185290Salfred 870191869Sthompsa assert((a = archive_read_new()) != NULL); 871191869Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 872191869Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 873194228Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 874191869Sthompsa 875191869Sthompsa /* The file `refname` is invalid in this case, so this call should fail. 876194228Sthompsa * But it shouldn't crash. */ 877191869Sthompsa assertEqualIntA(a, ARCHIVE_FATAL, archive_read_data(a, buf, 64)); 878191869Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 879194228Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 880191869Sthompsa} 881191869Sthompsa 882185290SalfredDEFINE_TEST(test_read_format_zip_lzma_alone_leak) 883191869Sthompsa{ 884191869Sthompsa const char *refname = "test_read_format_zip_lzma_alone_leak.zipx"; 885191869Sthompsa struct archive *a; 886191869Sthompsa struct archive_entry *ae; 887191869Sthompsa char buf[64]; 888191869Sthompsa 889191869Sthompsa /* OSSFuzz #14470 sample file. */ 890191869Sthompsa extract_reference_file(refname); 891188413Sthompsa 892187728Sthompsa assert((a = archive_read_new()) != NULL); 893191869Sthompsa if(ARCHIVE_OK != archive_read_support_filter_lzma(a)) { 894191869Sthompsa skipping("lzma reading is not fully supported on this platform"); 895187728Sthompsa archive_read_close(a); 896187728Sthompsa return; 897194228Sthompsa } 898191869Sthompsa 899191869Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); 900187728Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); 901188413Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 902191869Sthompsa 903191869Sthompsa /* Extraction of this file should fail, because the sample file is invalid. 904188413Sthompsa * But it shouldn't crash. */ 905187728Sthompsa assertEqualIntA(a, ARCHIVE_FAILED, archive_read_data(a, buf, sizeof(buf))); 906188413Sthompsa assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 907241555Sn_hibma 908241555Sn_hibma /* Extraction of this file should fail, because the sample file is invalid. 909241555Sn_hibma * But it shouldn't crash. */ 910241555Sn_hibma assertEqualIntA(a, ARCHIVE_FATAL, archive_read_data(a, buf, sizeof(buf))); 911241555Sn_hibma 912273883Shselasky assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 913241555Sn_hibma assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); 914241555Sn_hibma 915241555Sn_hibma /* This testcase shouldn't produce any memory leaks. When running test 916187728Sthompsa * suite under Valgrind or ASan, the test runner won't return with 917189265Sthompsa * exit code 0 in case if a memory leak. */ 918194677Sthompsa} 919194677Sthompsa