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