xref: /freebsd/contrib/libarchive/libarchive/test/test_read_format_rar.c (revision 185becb1e1bd2657c156f78aeb52edac05ba5fb5)
1 /*-
2  * Copyright (c) 2003-2007 Tim Kientzle
3  * Copyright (c) 2011 Andres Mejia
4  * Copyright (c) 2011-2012 Michihiro NAKAJIMA
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 #include "test.h"
28 
29 #include <locale.h>
30 
DEFINE_TEST(test_read_format_rar_set_format)31 DEFINE_TEST(test_read_format_rar_set_format)
32 {
33     struct archive *a;
34     struct archive_entry *ae;
35     const char reffile[] = "test_read_format_rar.rar";
36 
37     extract_reference_file(reffile);
38     assert((a = archive_read_new()) != NULL);
39     assertA(0 == archive_read_support_filter_all(a));
40     assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_RAR));
41     assertA(0 == archive_read_open_filename(a, reffile, 10240));
42     assertA(0 == archive_read_next_header(a, &ae));
43     assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
44     assertEqualInt(ARCHIVE_OK, archive_read_free(a));
45 }
46 
DEFINE_TEST(test_read_format_rar_basic)47 DEFINE_TEST(test_read_format_rar_basic)
48 {
49   char buff[64];
50   const char reffile[] = "test_read_format_rar.rar";
51   const char test_txt[] = "test text document\r\n";
52   int size = sizeof(test_txt)-1;
53   struct archive_entry *ae;
54   struct archive *a;
55 
56   extract_reference_file(reffile);
57   assert((a = archive_read_new()) != NULL);
58   assertA(0 == archive_read_support_filter_all(a));
59   assertA(0 == archive_read_support_format_all(a));
60   assertA(0 == archive_read_open_filename(a, reffile, 10240));
61 
62   /* First header. */
63   assertA(0 == archive_read_next_header(a, &ae));
64   assertEqualString("test.txt", archive_entry_pathname(ae));
65   assertA((int)archive_entry_mtime(ae));
66   assertA((int)archive_entry_ctime(ae));
67   assertA((int)archive_entry_atime(ae));
68   assertEqualInt(20, archive_entry_size(ae));
69   assertEqualInt(33188, archive_entry_mode(ae));
70   assertA(size == archive_read_data(a, buff, size));
71   assertEqualMem(buff, test_txt, size);
72   assertEqualInt(archive_entry_is_encrypted(ae), 0);
73   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
74 
75   /* Second header. */
76   assertA(0 == archive_read_next_header(a, &ae));
77   assertEqualString("testlink", archive_entry_pathname(ae));
78   assertA((int)archive_entry_mtime(ae));
79   assertA((int)archive_entry_ctime(ae));
80   assertA((int)archive_entry_atime(ae));
81   assertEqualInt(0, archive_entry_size(ae));
82   assertEqualInt(41471, archive_entry_mode(ae));
83   assertEqualString("test.txt", archive_entry_symlink(ae));
84   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
85   assertEqualInt(archive_entry_is_encrypted(ae), 0);
86   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
87 
88   /* Third header. */
89   assertA(0 == archive_read_next_header(a, &ae));
90   assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
91   assertA((int)archive_entry_mtime(ae));
92   assertA((int)archive_entry_ctime(ae));
93   assertA((int)archive_entry_atime(ae));
94   assertEqualInt(20, archive_entry_size(ae));
95   assertEqualInt(33188, archive_entry_mode(ae));
96   assertA(size == archive_read_data(a, buff, size));
97   assertEqualMem(buff, test_txt, size);
98   assertEqualInt(archive_entry_is_encrypted(ae), 0);
99   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
100 
101   /* Fourth header. */
102   assertA(0 == archive_read_next_header(a, &ae));
103   assertEqualString("testdir", archive_entry_pathname(ae));
104   assertA((int)archive_entry_mtime(ae));
105   assertA((int)archive_entry_ctime(ae));
106   assertA((int)archive_entry_atime(ae));
107   assertEqualInt(0, archive_entry_size(ae));
108   assertEqualInt(16877, archive_entry_mode(ae));
109   assertEqualInt(archive_entry_is_encrypted(ae), 0);
110   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
111 
112   /* Fifth header. */
113   assertA(0 == archive_read_next_header(a, &ae));
114   assertEqualString("testemptydir", archive_entry_pathname(ae));
115   assertA((int)archive_entry_mtime(ae));
116   assertA((int)archive_entry_ctime(ae));
117   assertA((int)archive_entry_atime(ae));
118   assertEqualInt(0, archive_entry_size(ae));
119   assertEqualInt(16877, archive_entry_mode(ae));
120   assertEqualInt(archive_entry_is_encrypted(ae), 0);
121   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
122 
123   /* Test EOF */
124   assertA(1 == archive_read_next_header(a, &ae));
125   assertEqualInt(5, archive_file_count(a));
126   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
127   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
128 }
129 
DEFINE_TEST(test_read_format_rar_subblock)130 DEFINE_TEST(test_read_format_rar_subblock)
131 {
132   char buff[64];
133   const char reffile[] = "test_read_format_rar_subblock.rar";
134   const char test_txt[] = "test text document\r\n";
135   int size = sizeof(test_txt)-1;
136   struct archive_entry *ae;
137   struct archive *a;
138 
139   extract_reference_file(reffile);
140   assert((a = archive_read_new()) != NULL);
141   assertA(0 == archive_read_support_filter_all(a));
142   assertA(0 == archive_read_support_format_all(a));
143   assertA(0 == archive_read_open_filename(a, reffile, 10240));
144 
145   /* First header. */
146   assertA(0 == archive_read_next_header(a, &ae));
147   assertEqualString("test.txt", archive_entry_pathname(ae));
148   assertA((int)archive_entry_mtime(ae));
149   assertA((int)archive_entry_ctime(ae));
150   assertA((int)archive_entry_atime(ae));
151   assertEqualInt(20, archive_entry_size(ae));
152   assertEqualInt(33188, archive_entry_mode(ae));
153   assertA(size == archive_read_data(a, buff, size));
154   assertEqualMem(buff, test_txt, size);
155   assertEqualInt(archive_entry_is_encrypted(ae), 0);
156   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
157 
158   /* Test EOF */
159   assertA(1 == archive_read_next_header(a, &ae));
160   assertEqualInt(1, archive_file_count(a));
161   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
162   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
163 }
164 
DEFINE_TEST(test_read_format_rar_noeof)165 DEFINE_TEST(test_read_format_rar_noeof)
166 {
167   char buff[64];
168   const char reffile[] = "test_read_format_rar_noeof.rar";
169   const char test_txt[] = "test text document\r\n";
170   int size = sizeof(test_txt)-1;
171   struct archive_entry *ae;
172   struct archive *a;
173 
174   extract_reference_file(reffile);
175   assert((a = archive_read_new()) != NULL);
176   assertA(0 == archive_read_support_filter_all(a));
177   assertA(0 == archive_read_support_format_all(a));
178   assertA(0 == archive_read_open_filename(a, reffile, 10240));
179 
180   /* First header. */
181   assertA(0 == archive_read_next_header(a, &ae));
182   assertEqualString("test.txt", archive_entry_pathname(ae));
183   assertA((int)archive_entry_mtime(ae));
184   assertA((int)archive_entry_ctime(ae));
185   assertA((int)archive_entry_atime(ae));
186   assertEqualInt(20, archive_entry_size(ae));
187   assertEqualInt(33188, archive_entry_mode(ae));
188   assertA(size == archive_read_data(a, buff, size));
189   assertEqualMem(buff, test_txt, size);
190   assertEqualInt(archive_entry_is_encrypted(ae), 0);
191   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
192 
193   /* Test EOF */
194   assertA(1 == archive_read_next_header(a, &ae));
195   assertEqualInt(1, archive_file_count(a));
196   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
197   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
198 }
199 
DEFINE_TEST(test_read_format_rar_unicode_UTF8)200 DEFINE_TEST(test_read_format_rar_unicode_UTF8)
201 {
202   char buff[30];
203   const char reffile[] = "test_read_format_rar_unicode.rar";
204   const char test_txt[] = "kanji";
205   struct archive_entry *ae;
206   struct archive *a;
207 
208   if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
209 	skipping("en_US.UTF-8 locale not available on this system.");
210 	return;
211   }
212 
213   extract_reference_file(reffile);
214   assert((a = archive_read_new()) != NULL);
215   assertA(0 == archive_read_support_filter_all(a));
216   assertA(0 == archive_read_support_format_all(a));
217 #if defined(_WIN32) && !defined(__CYGWIN__)
218   /* Windows will use OEMCP as default, but the file is UTF-8. */
219   if (ARCHIVE_OK != archive_read_set_options(a, "rar:hdrcharset=UTF-8")) {
220 	skipping("This system cannot read input as UTF-8.");
221 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
222 	return;
223   }
224 #endif
225   assertA(0 == archive_read_open_filename(a, reffile, 10240));
226 
227   /* First header. */
228   assertA(0 == archive_read_next_header(a, &ae));
229 #if defined(__APPLE__)
230 #define f1name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88/"\
231       "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x95\xE3\x82\xA9"\
232       "\xE3\x83\xAB\xE3\x82\xBF\xE3\x82\x99/\xE6\x96\xB0\xE8\xA6\x8F"\
233       "\xE3\x83\x86\xE3\x82\xAD\xE3\x82\xB9\xE3\x83\x88 "\
234       "\xE3\x83\x88\xE3\x82\x99\xE3\x82\xAD\xE3\x83\xA5\xE3\x83\xA1"\
235       "\xE3\x83\xB3\xE3\x83\x88.txt" /* NFD */
236 #else
237 #define f1name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88/"\
238       "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x95\xE3\x82\xA9"\
239       "\xE3\x83\xAB\xE3\x83\x80/\xE6\x96\xB0\xE8\xA6\x8F"\
240       "\xE3\x83\x86\xE3\x82\xAD\xE3\x82\xB9\xE3\x83\x88 "\
241       "\xE3\x83\x89\xE3\x82\xAD\xE3\x83\xA5\xE3\x83\xA1"\
242       "\xE3\x83\xB3\xE3\x83\x88.txt" /* NFC */
243 #endif
244   assertEqualUTF8String(f1name, archive_entry_pathname(ae));
245   assertA((int)archive_entry_mtime(ae));
246   assertEqualInt(0, archive_entry_size(ae));
247   assertEqualInt(33188, archive_entry_mode(ae));
248 
249   /* Second header. */
250   assertA(0 == archive_read_next_header(a, &ae));
251 #if defined(__APPLE__)
252 #define f2name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88/"\
253       "\xE6\xBC\xA2\xE5\xAD\x97\xE9\x95\xB7\xE3\x81\x84\xE3\x83\x95"\
254       "\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE5\x90\x8Dlong-filename-in-"\
255       "\xE6\xBC\xA2\xE5\xAD\x97.txt" /* NFD */
256 #else
257 #define f2name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88/"\
258       "\xE6\xBC\xA2\xE5\xAD\x97\xE9\x95\xB7\xE3\x81\x84\xE3\x83\x95"\
259       "\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE5\x90\x8Dlong-filename-in-"\
260       "\xE6\xBC\xA2\xE5\xAD\x97.txt" /* NFC */
261 #endif
262   assertEqualUTF8String(f2name, archive_entry_pathname(ae));
263   assertA((int)archive_entry_mtime(ae));
264   assertEqualInt(5, archive_entry_size(ae));
265   assertEqualInt(33188, archive_entry_mode(ae));
266   assertEqualIntA(a, 5, archive_read_data(a, buff, 5));
267   assertEqualMem(buff, test_txt, 5);
268   assertEqualInt(archive_entry_is_encrypted(ae), 0);
269   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
270 
271   /* Third header. */
272   assertA(0 == archive_read_next_header(a, &ae));
273 #if defined(__APPLE__)
274 #define f3name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88/"\
275       "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x95\xE3\x82"\
276       "\xA9\xE3\x83\xAB\xE3\x82\xBF\xE3\x82\x99" /* NFD */
277 #else
278 #define f3name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88/"\
279       "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x95\xE3\x82"\
280       "\xA9\xE3\x83\xAB\xE3\x83\x80" /* NFC */
281 #endif
282   assertEqualUTF8String(f3name, archive_entry_pathname(ae));
283   assertA((int)archive_entry_mtime(ae));
284   assertEqualInt(0, archive_entry_size(ae));
285   assertEqualInt(16877, archive_entry_mode(ae));
286 
287   /* Fourth header. */
288   assertA(0 == archive_read_next_header(a, &ae));
289 #if defined(__APPLE__)
290 #define f4name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88" /* NFD */
291 #else
292 #define f4name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88" /* NFC */
293 #endif
294   assertEqualUTF8String(f4name, archive_entry_pathname(ae));
295   assertA((int)archive_entry_mtime(ae));
296   assertEqualInt(0, archive_entry_size(ae));
297   assertEqualInt(16877, archive_entry_mode(ae));
298 
299   /* Fifth header, which has a symbolic-link name in multi-byte characters. */
300   assertA(0 == archive_read_next_header(a, &ae));
301 #if defined(__APPLE__)
302 #define f5name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88/"\
303       "\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB" /* NFD */
304 #else
305 #define f5name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88/"\
306       "\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB" /* NFC */
307 #endif
308   assertEqualUTF8String(f5name, archive_entry_pathname(ae));
309   assertEqualUTF8String(
310       "\xE6\xBC\xA2\xE5\xAD\x97\xE9\x95\xB7\xE3\x81\x84\xE3\x83\x95"
311       "\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE5\x90\x8Dlong-filename-in-"
312       "\xE6\xBC\xA2\xE5\xAD\x97.txt", archive_entry_symlink(ae));
313   assertA((int)archive_entry_mtime(ae));
314   assertEqualInt(0, archive_entry_size(ae));
315   assertEqualInt(41453, archive_entry_mode(ae));
316   assertEqualInt(archive_entry_is_encrypted(ae), 0);
317   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
318   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
319 
320   /* Sixth header */
321   assertA(0 == archive_read_next_header(a, &ae));
322   assertEqualUTF8String(
323     "abcdefghijklmnopqrs\xE3\x83\x86\xE3\x82\xB9\xE3\x83\x88.txt",
324     archive_entry_pathname(ae));
325   assertA((int)archive_entry_mtime(ae));
326   assertEqualInt(16, archive_entry_size(ae));
327   assertEqualInt(33204, archive_entry_mode(ae));
328   assertEqualInt(archive_entry_is_encrypted(ae), 0);
329   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
330   assertEqualIntA(a, 16, archive_read_data(a, buff, sizeof(buff)));
331 
332   /* Test EOF */
333   assertA(1 == archive_read_next_header(a, &ae));
334   assertEqualInt(6, archive_file_count(a));
335   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
336   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
337 }
338 
DEFINE_TEST(test_read_format_rar_unicode_CP932)339 DEFINE_TEST(test_read_format_rar_unicode_CP932)
340 {
341   char buff[30];
342   const char reffile[] = "test_read_format_rar_unicode.rar";
343   const char test_txt[] = "kanji";
344   struct archive_entry *ae;
345   struct archive *a;
346 
347   if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
348     NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
349 	skipping("CP932 locale not available on this system.");
350 	return;
351   }
352 
353   extract_reference_file(reffile);
354   assert((a = archive_read_new()) != NULL);
355   assertA(0 == archive_read_support_filter_all(a));
356   assertA(0 == archive_read_support_format_all(a));
357   /* Specify the charset of symbolic-link file name. */
358   if (ARCHIVE_OK != archive_read_set_options(a, "rar:hdrcharset=UTF-8")) {
359 	skipping("This system cannot convert character-set"
360 	    " from UTF-8 to CP932.");
361 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
362 	return;
363   }
364   assertA(0 == archive_read_open_filename(a, reffile, 10240));
365 
366   /* First header. */
367   assertA(0 == archive_read_next_header(a, &ae));
368   assertEqualString("\x95\x5c\x82\xbe\x82\xe6/\x90\x56\x82\xb5\x82\xa2"
369       "\x83\x74\x83\x48\x83\x8b\x83\x5f/\x90\x56\x8b\x4b\x83\x65\x83\x4c"
370       "\x83\x58\x83\x67 \x83\x68\x83\x4c\x83\x85\x83\x81\x83\x93\x83\x67.txt",
371       archive_entry_pathname(ae));
372   assertA((int)archive_entry_mtime(ae));
373   assertEqualInt(0, archive_entry_size(ae));
374   assertEqualInt(33188, archive_entry_mode(ae));
375   assertEqualInt(archive_entry_is_encrypted(ae), 0);
376   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
377 
378   /* Second header. */
379   assertA(0 == archive_read_next_header(a, &ae));
380   assertEqualString("\x95\x5c\x82\xbe\x82\xe6/\x8a\xbf\x8e\x9a"
381       "\x92\xb7\x82\xa2\x83\x74\x83\x40\x83\x43\x83\x8b\x96\xbc\x6c"
382       "\x6f\x6e\x67\x2d\x66\x69\x6c\x65\x6e\x61\x6d\x65\x2d\x69\x6e"
383       "\x2d\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
384   assertA((int)archive_entry_mtime(ae));
385   assertEqualInt(5, archive_entry_size(ae));
386   assertEqualInt(33188, archive_entry_mode(ae));
387   assertEqualInt(archive_entry_is_encrypted(ae), 0);
388   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
389   assertA(5 == archive_read_data(a, buff, 5));
390   assertEqualMem(buff, test_txt, 5);
391 
392   /* Third header. */
393   assertA(0 == archive_read_next_header(a, &ae));
394   assertEqualString("\x95\x5c\x82\xbe\x82\xe6/"
395       "\x90\x56\x82\xb5\x82\xa2\x83\x74\x83\x48\x83\x8b\x83\x5f",
396       archive_entry_pathname(ae));
397   assertA((int)archive_entry_mtime(ae));
398   assertEqualInt(0, archive_entry_size(ae));
399   assertEqualInt(16877, archive_entry_mode(ae));
400   assertEqualInt(archive_entry_is_encrypted(ae), 0);
401   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
402 
403   /* Fourth header. */
404   assertA(0 == archive_read_next_header(a, &ae));
405   assertEqualString("\x95\x5c\x82\xbe\x82\xe6", archive_entry_pathname(ae));
406   assertA((int)archive_entry_mtime(ae));
407   assertEqualInt(0, archive_entry_size(ae));
408   assertEqualInt(16877, archive_entry_mode(ae));
409   assertEqualInt(archive_entry_is_encrypted(ae), 0);
410   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
411 
412   /* Fifth header, which has a symbolic-link name in multi-byte characters. */
413   assertA(0 == archive_read_next_header(a, &ae));
414   assertEqualString("\x95\x5c\x82\xbe\x82\xe6/"
415       "\x83\x74\x83\x40\x83\x43\x83\x8B", archive_entry_pathname(ae));
416   assertEqualString("\x8a\xbf\x8e\x9a"
417       "\x92\xb7\x82\xa2\x83\x74\x83\x40\x83\x43\x83\x8b\x96\xbc\x6c"
418       "\x6f\x6e\x67\x2d\x66\x69\x6c\x65\x6e\x61\x6d\x65\x2d\x69\x6e"
419       "\x2d\x8a\xbf\x8e\x9a.txt", archive_entry_symlink(ae));
420   assertA((int)archive_entry_mtime(ae));
421   assertEqualInt(0, archive_entry_size(ae));
422   assertEqualInt(41453, archive_entry_mode(ae));
423   assertEqualInt(archive_entry_is_encrypted(ae), 0);
424   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
425   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
426 
427   /* Sixth header */
428   assertA(0 == archive_read_next_header(a, &ae));
429   assertEqualUTF8String(
430     "abcdefghijklmnopqrs\x83\x65\x83\x58\x83\x67.txt",
431     archive_entry_pathname(ae));
432   assertA((int)archive_entry_mtime(ae));
433   assertEqualInt(16, archive_entry_size(ae));
434   assertEqualInt(33204, archive_entry_mode(ae));
435   assertEqualInt(archive_entry_is_encrypted(ae), 0);
436   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
437   assertEqualIntA(a, 16, archive_read_data(a, buff, sizeof(buff)));
438 
439   /* Test EOF */
440   assertA(1 == archive_read_next_header(a, &ae));
441   assertEqualInt(6, archive_file_count(a));
442   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
443   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
444 }
445 
DEFINE_TEST(test_read_format_rar_compress_normal)446 DEFINE_TEST(test_read_format_rar_compress_normal)
447 {
448   const char reffile[] = "test_read_format_rar_compress_normal.rar";
449   char file1_buff[20111];
450   int file1_size = sizeof(file1_buff);
451   const char file1_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
452                                 "</P>\n"
453                                 "</BODY>\n"
454                                 "</HTML>";
455   char file2_buff[20];
456   int file2_size = sizeof(file2_buff);
457   const char file2_test_txt[] = "test text document\r\n";
458   struct archive_entry *ae;
459   struct archive *a;
460 
461   extract_reference_file(reffile);
462   assert((a = archive_read_new()) != NULL);
463   assertA(0 == archive_read_support_filter_all(a));
464   assertA(0 == archive_read_support_format_all(a));
465   assertA(0 == archive_read_open_filename(a, reffile, 10240));
466 
467   /* First header. */
468   assertA(0 == archive_read_next_header(a, &ae));
469   assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
470   assertA((int)archive_entry_mtime(ae));
471   assertA((int)archive_entry_ctime(ae));
472   assertA((int)archive_entry_atime(ae));
473   assertEqualInt(file1_size, archive_entry_size(ae));
474   assertEqualInt(33188, archive_entry_mode(ae));
475   assertEqualInt(archive_entry_is_encrypted(ae), 0);
476   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
477   assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
478   assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
479                  file1_test_txt, sizeof(file1_test_txt) - 1);
480 
481     /* Second header. */
482   assertA(0 == archive_read_next_header(a, &ae));
483   assertEqualString("testlink", archive_entry_pathname(ae));
484   assertA((int)archive_entry_mtime(ae));
485   assertA((int)archive_entry_ctime(ae));
486   assertA((int)archive_entry_atime(ae));
487   assertEqualInt(0, archive_entry_size(ae));
488   assertEqualInt(41471, archive_entry_mode(ae));
489   assertEqualInt(archive_entry_is_encrypted(ae), 0);
490   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
491   assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
492   assertEqualIntA(a, 0, archive_read_data(a, file1_buff, 30));
493 
494   /* Third header. */
495   assertA(0 == archive_read_next_header(a, &ae));
496   assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
497   assertA((int)archive_entry_mtime(ae));
498   assertA((int)archive_entry_ctime(ae));
499   assertA((int)archive_entry_atime(ae));
500   assertEqualInt(file2_size, archive_entry_size(ae));
501   assertEqualInt(33188, archive_entry_mode(ae));
502   assertEqualInt(archive_entry_is_encrypted(ae), 0);
503   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
504   assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
505   assertEqualMem(&file2_buff[file2_size + 1 - sizeof(file2_test_txt)],
506                  file2_test_txt, sizeof(file2_test_txt) - 1);
507 
508   /* Fourth header. */
509   assertA(0 == archive_read_next_header(a, &ae));
510   assertEqualString("testdir/LibarchiveAddingTest.html",
511                     archive_entry_pathname(ae));
512   assertA((int)archive_entry_mtime(ae));
513   assertA((int)archive_entry_ctime(ae));
514   assertA((int)archive_entry_atime(ae));
515   assertEqualInt(file1_size, archive_entry_size(ae));
516   assertEqualInt(33188, archive_entry_mode(ae));
517   assertEqualInt(archive_entry_is_encrypted(ae), 0);
518   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
519   assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
520   assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
521                  file1_test_txt, sizeof(file1_test_txt) - 1);
522 
523   /* Fifth header. */
524   assertA(0 == archive_read_next_header(a, &ae));
525   assertEqualString("testdir", archive_entry_pathname(ae));
526   assertA((int)archive_entry_mtime(ae));
527   assertA((int)archive_entry_ctime(ae));
528   assertA((int)archive_entry_atime(ae));
529   assertEqualInt(0, archive_entry_size(ae));
530   assertEqualInt(16877, archive_entry_mode(ae));
531   assertEqualInt(archive_entry_is_encrypted(ae), 0);
532   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
533 
534   /* Sixth header. */
535   assertA(0 == archive_read_next_header(a, &ae));
536   assertEqualString("testemptydir", archive_entry_pathname(ae));
537   assertA((int)archive_entry_mtime(ae));
538   assertA((int)archive_entry_ctime(ae));
539   assertA((int)archive_entry_atime(ae));
540   assertEqualInt(0, archive_entry_size(ae));
541   assertEqualInt(16877, archive_entry_mode(ae));
542   assertEqualInt(archive_entry_is_encrypted(ae), 0);
543   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
544 
545   /* Test EOF */
546   assertA(1 == archive_read_next_header(a, &ae));
547   assertEqualInt(6, archive_file_count(a));
548   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
549   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
550 }
551 
552 /* This test is for sufficiently large files that would have been compressed
553  * using multiple lzss blocks.
554  */
DEFINE_TEST(test_read_format_rar_multi_lzss_blocks)555 DEFINE_TEST(test_read_format_rar_multi_lzss_blocks)
556 {
557   const char reffile[] = "test_read_format_rar_multi_lzss_blocks.rar";
558   const char test_txt[] = "-bottom: 0in\"><BR>\n</P>\n</BODY>\n</HTML>";
559   int size = 20131111, offset = 0;
560   char buff[64];
561   struct archive_entry *ae;
562   struct archive *a;
563 
564   extract_reference_file(reffile);
565   assert((a = archive_read_new()) != NULL);
566   assertA(0 == archive_read_support_filter_all(a));
567   assertA(0 == archive_read_support_format_all(a));
568   assertA(0 == archive_read_open_filename(a, reffile, 10240));
569 
570   /* First header. */
571   assertA(0 == archive_read_next_header(a, &ae));
572   assertEqualString("multi_lzss_blocks_test.txt", archive_entry_pathname(ae));
573   assertA((int)archive_entry_mtime(ae));
574   assertA((int)archive_entry_ctime(ae));
575   assertA((int)archive_entry_atime(ae));
576   assertEqualInt(size, archive_entry_size(ae));
577   assertEqualInt(33188, archive_entry_mode(ae));
578   assertEqualInt(archive_entry_is_encrypted(ae), 0);
579   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
580   while (offset + (int)sizeof(buff) < size)
581   {
582     assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
583     offset += sizeof(buff);
584   }
585   assertA(size - offset == archive_read_data(a, buff, size - offset));
586   assertEqualMem(buff, test_txt, size - offset);
587 
588   /* Test EOF */
589   assertA(1 == archive_read_next_header(a, &ae));
590   assertEqualInt(1, archive_file_count(a));
591   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
592   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
593 }
594 
DEFINE_TEST(test_read_format_rar3_lowdist_reset)595 DEFINE_TEST(test_read_format_rar3_lowdist_reset)
596 {
597   const char reffile[] = "test_read_format_rar3_lowdist_reset.rar";
598   const unsigned char expected[] = {
599     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
600     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
601     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
602     0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
603     0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
604     0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0d, 0x0e,
605     0x0f, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
606     0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36
607   };
608   unsigned char buff[sizeof(expected)];
609   struct archive_entry *ae;
610   struct archive *a;
611 
612   extract_reference_file(reffile);
613   assert((a = archive_read_new()) != NULL);
614   assertA(0 == archive_read_support_filter_all(a));
615   assertA(0 == archive_read_support_format_rar(a));
616   assertA(0 == archive_read_open_filename(a, reffile, 10240));
617 
618   assertA(0 == archive_read_next_header(a, &ae));
619   assertEqualString("lowdist-reset.bin", archive_entry_pathname(ae));
620   assertEqualInt(sizeof(expected), archive_entry_size(ae));
621   assertEqualIntA(a, sizeof(expected),
622       archive_read_data(a, buff, sizeof(buff)));
623   assertEqualMem(buff, expected, sizeof(expected));
624 
625   assertA(1 == archive_read_next_header(a, &ae));
626   assertEqualInt(1, archive_file_count(a));
627   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
628   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
629 }
630 
DEFINE_TEST(test_read_format_rar_compress_best)631 DEFINE_TEST(test_read_format_rar_compress_best)
632 {
633   const char reffile[] = "test_read_format_rar_compress_best.rar";
634   char file1_buff[20111];
635   int file1_size = sizeof(file1_buff);
636   const char file1_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
637                                 "</P>\n"
638                                 "</BODY>\n"
639                                 "</HTML>";
640   char file2_buff[20];
641   int file2_size = sizeof(file2_buff);
642   const char file2_test_txt[] = "test text document\r\n";
643   struct archive_entry *ae;
644   struct archive *a;
645 
646   extract_reference_file(reffile);
647   assert((a = archive_read_new()) != NULL);
648   assertA(0 == archive_read_support_filter_all(a));
649   assertA(0 == archive_read_support_format_all(a));
650   assertA(0 == archive_read_open_filename(a, reffile, 10240));
651 
652   /* First header. */
653   assertA(0 == archive_read_next_header(a, &ae));
654   assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
655   assertA((int)archive_entry_mtime(ae));
656   assertA((int)archive_entry_ctime(ae));
657   assertA((int)archive_entry_atime(ae));
658   assertEqualInt(file1_size, archive_entry_size(ae));
659   assertEqualInt(33188, archive_entry_mode(ae));
660   assertEqualInt(archive_entry_is_encrypted(ae), 0);
661   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
662   assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
663   assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
664                  file1_test_txt, sizeof(file1_test_txt) - 1);
665 
666     /* Second header. */
667   assertA(0 == archive_read_next_header(a, &ae));
668   assertEqualString("testlink", archive_entry_pathname(ae));
669   assertA((int)archive_entry_mtime(ae));
670   assertA((int)archive_entry_ctime(ae));
671   assertA((int)archive_entry_atime(ae));
672   assertEqualInt(0, archive_entry_size(ae));
673   assertEqualInt(41471, archive_entry_mode(ae));
674   assertEqualInt(archive_entry_is_encrypted(ae), 0);
675   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
676   assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
677   assertEqualIntA(a, 0, archive_read_data(a, file1_buff, 30));
678 
679   /* Third header. */
680   assertA(0 == archive_read_next_header(a, &ae));
681   assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
682   assertA((int)archive_entry_mtime(ae));
683   assertA((int)archive_entry_ctime(ae));
684   assertA((int)archive_entry_atime(ae));
685   assertEqualInt(file2_size, archive_entry_size(ae));
686   assertEqualInt(33188, archive_entry_mode(ae));
687   assertEqualInt(archive_entry_is_encrypted(ae), 0);
688   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
689   assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
690   assertEqualMem(&file2_buff[file2_size + 1 - sizeof(file2_test_txt)],
691                  file2_test_txt, sizeof(file2_test_txt) - 1);
692 
693   /* Fourth header. */
694   assertA(0 == archive_read_next_header(a, &ae));
695   assertEqualString("testdir/LibarchiveAddingTest.html",
696                     archive_entry_pathname(ae));
697   assertA((int)archive_entry_mtime(ae));
698   assertA((int)archive_entry_ctime(ae));
699   assertA((int)archive_entry_atime(ae));
700   assertEqualInt(file1_size, archive_entry_size(ae));
701   assertEqualInt(33188, archive_entry_mode(ae));
702   assertEqualInt(archive_entry_is_encrypted(ae), 0);
703   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
704   assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
705   assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
706                  file1_test_txt, sizeof(file1_test_txt) - 1);
707 
708   /* Fifth header. */
709   assertA(0 == archive_read_next_header(a, &ae));
710   assertEqualString("testdir", archive_entry_pathname(ae));
711   assertA((int)archive_entry_mtime(ae));
712   assertA((int)archive_entry_ctime(ae));
713   assertA((int)archive_entry_atime(ae));
714   assertEqualInt(0, archive_entry_size(ae));
715   assertEqualInt(16877, archive_entry_mode(ae));
716   assertEqualInt(archive_entry_is_encrypted(ae), 0);
717   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
718 
719   /* Sixth header. */
720   assertA(0 == archive_read_next_header(a, &ae));
721   assertEqualString("testemptydir", archive_entry_pathname(ae));
722   assertA((int)archive_entry_mtime(ae));
723   assertA((int)archive_entry_ctime(ae));
724   assertA((int)archive_entry_atime(ae));
725   assertEqualInt(0, archive_entry_size(ae));
726   assertEqualInt(16877, archive_entry_mode(ae));
727   assertEqualInt(archive_entry_is_encrypted(ae), 0);
728   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
729 
730   /* Test EOF */
731   assertA(1 == archive_read_next_header(a, &ae));
732   assertEqualInt(6, archive_file_count(a));
733   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
734   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
735 }
736 
737 /* This is a test for RAR files compressed using a technique where compression
738  * switches back and forth to and from ppmd and lzss decoding.
739  */
DEFINE_TEST(test_read_format_rar_ppmd_lzss_conversion)740 DEFINE_TEST(test_read_format_rar_ppmd_lzss_conversion)
741 {
742   const char reffile[] = "test_read_format_rar_ppmd_lzss_conversion.rar";
743   const char test_txt[] = "gin-bottom: 0in\"><BR>\n</P>\n</BODY>\n</HTML>";
744   int size = 241647978, offset = 0;
745   char buff[64];
746   struct archive_entry *ae;
747   struct archive *a;
748 
749   extract_reference_file(reffile);
750   assert((a = archive_read_new()) != NULL);
751   assertA(0 == archive_read_support_filter_all(a));
752   assertA(0 == archive_read_support_format_all(a));
753   assertA(0 == archive_read_open_filename(a, reffile, 10240));
754 
755   /* First header. */
756   assertA(0 == archive_read_next_header(a, &ae));
757   assertEqualString("ppmd_lzss_conversion_test.txt",
758                     archive_entry_pathname(ae));
759   assertA((int)archive_entry_mtime(ae));
760   assertA((int)archive_entry_ctime(ae));
761   assertA((int)archive_entry_atime(ae));
762   assertEqualInt(size, archive_entry_size(ae));
763   assertEqualInt(33188, archive_entry_mode(ae));
764   assertEqualInt(archive_entry_is_encrypted(ae), 0);
765   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
766   while (offset + (int)sizeof(buff) < size)
767   {
768     assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
769     offset += sizeof(buff);
770   }
771   assertA(size - offset == archive_read_data(a, buff, size - offset));
772   assertEqualMem(buff, test_txt, size - offset);
773 
774   /* Test EOF */
775   assertA(1 == archive_read_next_header(a, &ae));
776   assertEqualInt(1, archive_file_count(a));
777   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
778   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
779 }
780 
DEFINE_TEST(test_read_format_rar_binary)781 DEFINE_TEST(test_read_format_rar_binary)
782 {
783   const char reffile[] = "test_read_format_rar_binary_data.rar";
784   char *file1_buff = malloc(1048576);
785   int file1_size = 1048576;
786   const char file1_test_txt[] = "\x37\xef\xb2\xbe\x33\xf6\xcc\xcb\xee\x2a\x10"
787                                 "\x9d\x2e\x01\xe9\xf6\xf9\xe5\xe6\x67\x0c\x2b"
788                                 "\xd8\x6b\xa0\x26\x9a\xf7\x93\x87\x42\xf1\x08"
789                                 "\x42\xdc\x9b\x76\x91\x20\xa4\x01\xbe\x67\xbd"
790                                 "\x08\x74\xde\xec";
791   char file2_buff[32618];
792   int file2_size = sizeof(file2_buff);
793   const char file2_test_txt[] = "\x00\xee\x78\x00\x00\x4d\x45\x54\x41\x2d\x49"
794                                 "\x4e\x46\x2f\x6d\x61\x6e\x69\x66\x65\x73\x74"
795                                 "\x2e\x78\x6d\x6c\x50\x4b\x05\x06\x00\x00\x00"
796                                 "\x00\x12\x00\x12\x00\xaa\x04\x00\x00\xaa\x7a"
797                                 "\x00\x00\x00\x00";
798   struct archive_entry *ae;
799   struct archive *a;
800 
801   extract_reference_file(reffile);
802   assert((a = archive_read_new()) != NULL);
803   assertA(0 == archive_read_support_filter_all(a));
804   assertA(0 == archive_read_support_format_all(a));
805   assertA(0 == archive_read_open_filename(a, reffile, 10240));
806 
807   /* First header. */
808   assertA(0 == archive_read_next_header(a, &ae));
809   assertEqualString("random_data.bin", archive_entry_pathname(ae));
810   assertA((int)archive_entry_mtime(ae));
811   assertA((int)archive_entry_ctime(ae));
812   assertA((int)archive_entry_atime(ae));
813   assertEqualInt(file1_size, archive_entry_size(ae));
814   assertEqualInt(33188, archive_entry_mode(ae));
815   assertEqualInt(archive_entry_is_encrypted(ae), 0);
816   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
817   assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
818   assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
819                  file1_test_txt, sizeof(file1_test_txt) - 1);
820 
821     /* Second header. */
822   assertA(0 == archive_read_next_header(a, &ae));
823   assertEqualString("LibarchiveAddingTest.odt", archive_entry_pathname(ae));
824   assertA((int)archive_entry_mtime(ae));
825   assertA((int)archive_entry_ctime(ae));
826   assertA((int)archive_entry_atime(ae));
827   assertEqualInt(file2_size, archive_entry_size(ae));
828   assertEqualInt(33188, archive_entry_mode(ae));
829   assertEqualInt(archive_entry_is_encrypted(ae), 0);
830   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
831   assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
832   assertEqualMem(&file2_buff[file2_size + 1 - sizeof(file2_test_txt)],
833                  file2_test_txt, sizeof(file2_test_txt) - 1);
834 
835   /* Test EOF */
836   assertA(1 == archive_read_next_header(a, &ae));
837   assertEqualInt(2, archive_file_count(a));
838   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
839   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
840 
841   free(file1_buff);
842 }
843 
DEFINE_TEST(test_read_format_rar_windows)844 DEFINE_TEST(test_read_format_rar_windows)
845 {
846   char buff[441];
847   const char reffile[] = "test_read_format_rar_windows.rar";
848   const char test_txt[] = "test text file\r\n";
849   int size = sizeof(test_txt)-1;
850   struct archive_entry *ae;
851   struct archive *a;
852 
853   extract_reference_file(reffile);
854   assert((a = archive_read_new()) != NULL);
855   assertA(0 == archive_read_support_filter_all(a));
856   assertA(0 == archive_read_support_format_all(a));
857   assertA(0 == archive_read_open_filename(a, reffile, 10240));
858 
859   /* First header. */
860   assertA(0 == archive_read_next_header(a, &ae));
861   assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
862   assertA((int)archive_entry_mtime(ae));
863   assertA((int)archive_entry_ctime(ae));
864   assertA((int)archive_entry_atime(ae));
865   assertEqualInt(16, archive_entry_size(ae));
866   assertEqualInt(33188, archive_entry_mode(ae));
867   assertEqualInt(archive_entry_is_encrypted(ae), 0);
868   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
869   assertA(size == archive_read_data(a, buff, size));
870   assertEqualMem(buff, test_txt, size);
871 
872   /* Second header. */
873   assertA(0 == archive_read_next_header(a, &ae));
874   assertEqualString("test.txt", archive_entry_pathname(ae));
875   assertA((int)archive_entry_mtime(ae));
876   assertA((int)archive_entry_ctime(ae));
877   assertA((int)archive_entry_atime(ae));
878   assertEqualInt(16, archive_entry_size(ae));
879   assertEqualInt(33188, archive_entry_mode(ae));
880   assertEqualInt(archive_entry_is_encrypted(ae), 0);
881   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
882   assertA(size == archive_read_data(a, buff, size));
883   assertEqualMem(buff, test_txt, size);
884 
885   /* Third header. */
886   assertA(0 == archive_read_next_header(a, &ae));
887   assertEqualString("testshortcut.lnk", archive_entry_pathname(ae));
888   assertA((int)archive_entry_mtime(ae));
889   assertA((int)archive_entry_ctime(ae));
890   assertA((int)archive_entry_atime(ae));
891   assertEqualInt(sizeof(buff), archive_entry_size(ae));
892   assertEqualInt(33188, archive_entry_mode(ae));
893   assertEqualInt(archive_entry_is_encrypted(ae), 0);
894   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
895   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
896 
897   /* Fourth header. */
898   assertA(0 == archive_read_next_header(a, &ae));
899   assertEqualString("testdir", archive_entry_pathname(ae));
900   assertA((int)archive_entry_mtime(ae));
901   assertA((int)archive_entry_ctime(ae));
902   assertA((int)archive_entry_atime(ae));
903   assertEqualInt(0, archive_entry_size(ae));
904   assertEqualInt(16877, archive_entry_mode(ae));
905   assertEqualInt(archive_entry_is_encrypted(ae), 0);
906   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
907 
908   /* Fifth header. */
909   assertA(0 == archive_read_next_header(a, &ae));
910   assertEqualString("testemptydir", archive_entry_pathname(ae));
911   assertA((int)archive_entry_mtime(ae));
912   assertA((int)archive_entry_ctime(ae));
913   assertA((int)archive_entry_atime(ae));
914   assertEqualInt(0, archive_entry_size(ae));
915   assertEqualInt(16877, archive_entry_mode(ae));
916   assertEqualInt(archive_entry_is_encrypted(ae), 0);
917   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
918 
919   /* Test EOF */
920   assertA(1 == archive_read_next_header(a, &ae));
921   assertEqualInt(5, archive_file_count(a));
922   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
923   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
924 }
925 
926 static void
test_read_format_rar_multivolume_test_body_helper(struct archive * a)927 test_read_format_rar_multivolume_test_body_helper(struct archive *a)
928 {
929   int file1_size = 241647978, offset = 0;
930   char buff[64];
931   const char file1_test_txt[] = "gin-bottom: 0in\"><BR>\n</P>\n</BODY>\n"
932                                 "</HTML>";
933   char file2_buff[20111];
934   int file2_size = sizeof(file2_buff);
935   const char file2_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
936                                 "</P>\n"
937                                 "</BODY>\n"
938                                 "</HTML>";
939   char file3_buff[20];
940   int file3_size = sizeof(file3_buff);
941   const char file3_test_txt[] = "test text document\r\n";
942   struct archive_entry *ae;
943 
944   /* First header. */
945   assertA(0 == archive_read_next_header(a, &ae));
946   assertEqualString("ppmd_lzss_conversion_test.txt",
947                     archive_entry_pathname(ae));
948   assertA((int)archive_entry_mtime(ae));
949   assertA((int)archive_entry_ctime(ae));
950   assertA((int)archive_entry_atime(ae));
951   assertEqualInt(file1_size, archive_entry_size(ae));
952   assertEqualInt(33188, archive_entry_mode(ae));
953   assertEqualInt(archive_entry_is_encrypted(ae), 0);
954   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
955   while (offset + (int)sizeof(buff) < file1_size)
956   {
957     assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
958     offset += sizeof(buff);
959   }
960   assertA(file1_size - offset ==
961     archive_read_data(a, buff, file1_size - offset));
962   assertEqualMem(buff, file1_test_txt, file1_size - offset);
963 
964   /* Second header. */
965   assertA(0 == archive_read_next_header(a, &ae));
966   assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
967   assertA((int)archive_entry_mtime(ae));
968   assertA((int)archive_entry_ctime(ae));
969   assertA((int)archive_entry_atime(ae));
970   assertEqualInt(file2_size, archive_entry_size(ae));
971   assertEqualInt(33188, archive_entry_mode(ae));
972   assertEqualInt(archive_entry_is_encrypted(ae), 0);
973   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
974   assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
975   assertEqualMem(&file2_buff[file2_size - sizeof(file2_test_txt) + 1],
976                  file2_test_txt, sizeof(file2_test_txt) - 1);
977 
978   /* Third header. */
979   assertA(0 == archive_read_next_header(a, &ae));
980   assertEqualString("testlink", archive_entry_pathname(ae));
981   assertA((int)archive_entry_mtime(ae));
982   assertA((int)archive_entry_ctime(ae));
983   assertA((int)archive_entry_atime(ae));
984   assertEqualInt(0, archive_entry_size(ae));
985   assertEqualInt(41471, archive_entry_mode(ae));
986   assertEqualInt(archive_entry_is_encrypted(ae), 0);
987   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
988   assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
989   assertEqualIntA(a, 0, archive_read_data(a, file2_buff, 30));
990 
991   /* Fourth header. */
992   assertA(0 == archive_read_next_header(a, &ae));
993   assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
994   assertA((int)archive_entry_mtime(ae));
995   assertA((int)archive_entry_ctime(ae));
996   assertA((int)archive_entry_atime(ae));
997   assertEqualInt(file3_size, archive_entry_size(ae));
998   assertEqualInt(33188, archive_entry_mode(ae));
999   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1000   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1001   assertA(file3_size == archive_read_data(a, file3_buff, file3_size));
1002   assertEqualMem(&file3_buff[file3_size + 1 - sizeof(file3_test_txt)],
1003                  file3_test_txt, sizeof(file3_test_txt) - 1);
1004 
1005   /* Fifth header. */
1006   assertA(0 == archive_read_next_header(a, &ae));
1007   assertEqualString("testdir/LibarchiveAddingTest.html",
1008                     archive_entry_pathname(ae));
1009   assertA((int)archive_entry_mtime(ae));
1010   assertA((int)archive_entry_ctime(ae));
1011   assertA((int)archive_entry_atime(ae));
1012   assertEqualInt(file2_size, archive_entry_size(ae));
1013   assertEqualInt(33188, archive_entry_mode(ae));
1014   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1015   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1016   assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
1017   assertEqualMem(&file2_buff[file2_size - sizeof(file2_test_txt) + 1],
1018                  file2_test_txt, sizeof(file2_test_txt) - 1);
1019 
1020   /* Sixth header. */
1021   assertA(0 == archive_read_next_header(a, &ae));
1022   assertEqualString("testdir", archive_entry_pathname(ae));
1023   assertA((int)archive_entry_mtime(ae));
1024   assertA((int)archive_entry_ctime(ae));
1025   assertA((int)archive_entry_atime(ae));
1026   assertEqualInt(0, archive_entry_size(ae));
1027   assertEqualInt(16877, archive_entry_mode(ae));
1028   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1029   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1030 
1031   /* Seventh header. */
1032   assertA(0 == archive_read_next_header(a, &ae));
1033   assertEqualString("testemptydir", archive_entry_pathname(ae));
1034   assertA((int)archive_entry_mtime(ae));
1035   assertA((int)archive_entry_ctime(ae));
1036   assertA((int)archive_entry_atime(ae));
1037   assertEqualInt(0, archive_entry_size(ae));
1038   assertEqualInt(16877, archive_entry_mode(ae));
1039   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1040   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1041 
1042   /* Test EOF */
1043   assertA(1 == archive_read_next_header(a, &ae));
1044   assertEqualInt(7, archive_file_count(a));
1045   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1046   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1047 }
1048 
DEFINE_TEST(test_read_format_rar_multivolume)1049 DEFINE_TEST(test_read_format_rar_multivolume)
1050 {
1051   const char *reffiles[] =
1052   {
1053     "test_read_format_rar_multivolume.part0001.rar",
1054     "test_read_format_rar_multivolume.part0002.rar",
1055     "test_read_format_rar_multivolume.part0003.rar",
1056     "test_read_format_rar_multivolume.part0004.rar",
1057     NULL
1058   };
1059 
1060   struct archive *a;
1061 
1062   extract_reference_files(reffiles);
1063   assert((a = archive_read_new()) != NULL);
1064   assertA(0 == archive_read_support_filter_all(a));
1065   assertA(0 == archive_read_support_format_all(a));
1066   assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1067 
1068   test_read_format_rar_multivolume_test_body_helper(a);
1069 }
1070 
1071 /* As above, but using read_open_filenames_w */
DEFINE_TEST(test_read_format_rar_multivolume_w)1072 DEFINE_TEST(test_read_format_rar_multivolume_w)
1073 {
1074 #if defined(_WIN32) && !defined(__CYGWIN__)
1075   const char *reffiles[] =
1076   {
1077     "test_read_format_rar_multivolume.part0001.rar",
1078     "test_read_format_rar_multivolume.part0002.rar",
1079     "test_read_format_rar_multivolume.part0003.rar",
1080     "test_read_format_rar_multivolume.part0004.rar",
1081     NULL
1082   };
1083 
1084   const wchar_t *wreffiles[] =
1085   {
1086     L"test_read_format_rar_multivolume.part0001.rar",
1087     L"test_read_format_rar_multivolume.part0002.rar",
1088     L"test_read_format_rar_multivolume.part0003.rar",
1089     L"test_read_format_rar_multivolume.part0004.rar",
1090     NULL
1091   };
1092 
1093   struct archive *a;
1094 
1095   extract_reference_files(reffiles);
1096   assert((a = archive_read_new()) != NULL);
1097   assertA(0 == archive_read_support_filter_all(a));
1098   assertA(0 == archive_read_support_format_all(a));
1099   assertA(0 == archive_read_open_filenames_w(a, wreffiles, 10240));
1100 
1101   test_read_format_rar_multivolume_test_body_helper(a);
1102 #else
1103   skipping("archive_read_open_filenames_w is not available on this platform");
1104   return;
1105 #endif
1106 }
1107 
DEFINE_TEST(test_read_format_rar_multivolume_skip)1108 DEFINE_TEST(test_read_format_rar_multivolume_skip)
1109 {
1110   const char *reffiles[] =
1111   {
1112     "test_read_format_rar_multivolume.part0001.rar",
1113     "test_read_format_rar_multivolume.part0002.rar",
1114     "test_read_format_rar_multivolume.part0003.rar",
1115     "test_read_format_rar_multivolume.part0004.rar",
1116     NULL
1117   };
1118   int file1_size = 241647978;
1119   int file2_size = 20111;
1120   int file3_size = 20;
1121   struct archive_entry *ae;
1122   struct archive *a;
1123 
1124   extract_reference_files(reffiles);
1125   assert((a = archive_read_new()) != NULL);
1126   assertA(0 == archive_read_support_filter_all(a));
1127   assertA(0 == archive_read_support_format_all(a));
1128   assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1129 
1130   /* First header. */
1131   assertA(0 == archive_read_next_header(a, &ae));
1132   assertEqualString("ppmd_lzss_conversion_test.txt",
1133                     archive_entry_pathname(ae));
1134   assertA((int)archive_entry_mtime(ae));
1135   assertA((int)archive_entry_ctime(ae));
1136   assertA((int)archive_entry_atime(ae));
1137   assertEqualInt(file1_size, archive_entry_size(ae));
1138   assertEqualInt(33188, archive_entry_mode(ae));
1139   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1140   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1141 
1142   /* Second header. */
1143   assertA(0 == archive_read_next_header(a, &ae));
1144   assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1145   assertA((int)archive_entry_mtime(ae));
1146   assertA((int)archive_entry_ctime(ae));
1147   assertA((int)archive_entry_atime(ae));
1148   assertEqualInt(file2_size, archive_entry_size(ae));
1149   assertEqualInt(33188, archive_entry_mode(ae));
1150   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1151   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1152 
1153   /* Third header. */
1154   assertA(0 == archive_read_next_header(a, &ae));
1155   assertEqualString("testlink", archive_entry_pathname(ae));
1156   assertA((int)archive_entry_mtime(ae));
1157   assertA((int)archive_entry_ctime(ae));
1158   assertA((int)archive_entry_atime(ae));
1159   assertEqualInt(0, archive_entry_size(ae));
1160   assertEqualInt(41471, archive_entry_mode(ae));
1161   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1162   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1163   assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
1164 
1165   /* Fourth header. */
1166   assertA(0 == archive_read_next_header(a, &ae));
1167   assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
1168   assertA((int)archive_entry_mtime(ae));
1169   assertA((int)archive_entry_ctime(ae));
1170   assertA((int)archive_entry_atime(ae));
1171   assertEqualInt(file3_size, archive_entry_size(ae));
1172   assertEqualInt(33188, archive_entry_mode(ae));
1173   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1174   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1175 
1176   /* Fifth header. */
1177   assertA(0 == archive_read_next_header(a, &ae));
1178   assertEqualString("testdir/LibarchiveAddingTest.html",
1179                     archive_entry_pathname(ae));
1180   assertA((int)archive_entry_mtime(ae));
1181   assertA((int)archive_entry_ctime(ae));
1182   assertA((int)archive_entry_atime(ae));
1183   assertEqualInt(file2_size, archive_entry_size(ae));
1184   assertEqualInt(33188, archive_entry_mode(ae));
1185   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1186   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1187 
1188   /* Sixth header. */
1189   assertA(0 == archive_read_next_header(a, &ae));
1190   assertEqualString("testdir", archive_entry_pathname(ae));
1191   assertA((int)archive_entry_mtime(ae));
1192   assertA((int)archive_entry_ctime(ae));
1193   assertA((int)archive_entry_atime(ae));
1194   assertEqualInt(0, archive_entry_size(ae));
1195   assertEqualInt(16877, archive_entry_mode(ae));
1196   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1197   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1198 
1199   /* Seventh header. */
1200   assertA(0 == archive_read_next_header(a, &ae));
1201   assertEqualString("testemptydir", archive_entry_pathname(ae));
1202   assertA((int)archive_entry_mtime(ae));
1203   assertA((int)archive_entry_ctime(ae));
1204   assertA((int)archive_entry_atime(ae));
1205   assertEqualInt(0, archive_entry_size(ae));
1206   assertEqualInt(16877, archive_entry_mode(ae));
1207   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1208   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1209 
1210   /* Test EOF */
1211   assertA(1 == archive_read_next_header(a, &ae));
1212   assertEqualInt(7, archive_file_count(a));
1213   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1214   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1215 }
1216 
DEFINE_TEST(test_read_format_rar_sfx)1217 DEFINE_TEST(test_read_format_rar_sfx)
1218 {
1219   char buff[441];
1220   const char reffile[] = "test_read_format_rar_sfx.exe";
1221   const char test_txt[] = "test text file\r\n";
1222   int size = sizeof(test_txt)-1;
1223   struct archive_entry *ae;
1224   struct archive *a;
1225 
1226   extract_reference_file(reffile);
1227   assert((a = archive_read_new()) != NULL);
1228   assertA(0 == archive_read_support_filter_all(a));
1229   assertA(0 == archive_read_support_format_all(a));
1230   assertA(0 == archive_read_open_filename(a, reffile, 10240));
1231 
1232   /* First header. */
1233   assertA(0 == archive_read_next_header(a, &ae));
1234   assertEqualString("test.txt", archive_entry_pathname(ae));
1235   assertA((int)archive_entry_mtime(ae));
1236   assertA((int)archive_entry_ctime(ae));
1237   assertA((int)archive_entry_atime(ae));
1238   assertEqualInt(16, archive_entry_size(ae));
1239   assertEqualInt(33188, archive_entry_mode(ae));
1240   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1241   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1242   assertA(size == archive_read_data(a, buff, size));
1243   assertEqualMem(buff, test_txt, size);
1244 
1245   /* Second header. */
1246   assertA(0 == archive_read_next_header(a, &ae));
1247   assertEqualString("testshortcut.lnk", archive_entry_pathname(ae));
1248   assertA((int)archive_entry_mtime(ae));
1249   assertA((int)archive_entry_ctime(ae));
1250   assertA((int)archive_entry_atime(ae));
1251   assertEqualInt(sizeof(buff), archive_entry_size(ae));
1252   assertEqualInt(33188, archive_entry_mode(ae));
1253   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1254   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1255   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1256 
1257   /* Third header. */
1258   assertA(0 == archive_read_next_header(a, &ae));
1259   assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
1260   assertA((int)archive_entry_mtime(ae));
1261   assertA((int)archive_entry_ctime(ae));
1262   assertA((int)archive_entry_atime(ae));
1263   assertEqualInt(16, archive_entry_size(ae));
1264   assertEqualInt(33188, archive_entry_mode(ae));
1265   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1266   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1267   assertA(size == archive_read_data(a, buff, size));
1268   assertEqualMem(buff, test_txt, size);
1269 
1270   /* Fourth header. */
1271   assertA(0 == archive_read_next_header(a, &ae));
1272   assertEqualString("testdir", archive_entry_pathname(ae));
1273   assertA((int)archive_entry_mtime(ae));
1274   assertA((int)archive_entry_ctime(ae));
1275   assertA((int)archive_entry_atime(ae));
1276   assertEqualInt(0, archive_entry_size(ae));
1277   assertEqualInt(16877, archive_entry_mode(ae));
1278   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1279   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1280 
1281   /* Fifth header. */
1282   assertA(0 == archive_read_next_header(a, &ae));
1283   assertEqualString("testemptydir", archive_entry_pathname(ae));
1284   assertA((int)archive_entry_mtime(ae));
1285   assertA((int)archive_entry_ctime(ae));
1286   assertA((int)archive_entry_atime(ae));
1287   assertEqualInt(0, archive_entry_size(ae));
1288   assertEqualInt(16877, archive_entry_mode(ae));
1289   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1290   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1291 
1292   /* Test EOF */
1293   assertA(1 == archive_read_next_header(a, &ae));
1294   assertEqualInt(5, archive_file_count(a));
1295   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1296   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1297 }
1298 
DEFINE_TEST(test_read_format_rar_multivolume_stored_file)1299 DEFINE_TEST(test_read_format_rar_multivolume_stored_file)
1300 {
1301   const char *reffiles[] =
1302   {
1303     "test_rar_multivolume_single_file.part1.rar",
1304     "test_rar_multivolume_single_file.part2.rar",
1305     "test_rar_multivolume_single_file.part3.rar",
1306     NULL
1307   };
1308   char file_buff[20111];
1309   int file_size = sizeof(file_buff);
1310   const char file_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1311                                 "</P>\n"
1312                                 "</BODY>\n"
1313                                 "</HTML>";
1314   struct archive_entry *ae;
1315   struct archive *a;
1316 
1317   extract_reference_files(reffiles);
1318   assert((a = archive_read_new()) != NULL);
1319   assertA(0 == archive_read_support_filter_all(a));
1320   assertA(0 == archive_read_support_format_all(a));
1321   assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1322 
1323   /* First header. */
1324   assertA(0 == archive_read_next_header(a, &ae));
1325   assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1326   assertA((int)archive_entry_mtime(ae));
1327   assertA((int)archive_entry_ctime(ae));
1328   assertA((int)archive_entry_atime(ae));
1329   assertEqualInt(file_size, archive_entry_size(ae));
1330   assertEqualInt(33188, archive_entry_mode(ae));
1331   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1332   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1333   assertA(file_size == archive_read_data(a, file_buff, file_size));
1334   assertEqualMem(&file_buff[file_size - sizeof(file_test_txt) + 1],
1335                  file_test_txt, sizeof(file_test_txt) - 1);
1336 
1337   /* Test EOF */
1338   assertA(1 == archive_read_next_header(a, &ae));
1339   assertEqualInt(1, archive_file_count(a));
1340   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1341   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1342 }
1343 
DEFINE_TEST(test_read_format_rar_multivolume_stored_file_skip)1344 DEFINE_TEST(test_read_format_rar_multivolume_stored_file_skip)
1345 {
1346   const char *reffiles[] =
1347   {
1348     "test_rar_multivolume_single_file.part1.rar",
1349     "test_rar_multivolume_single_file.part2.rar",
1350     "test_rar_multivolume_single_file.part3.rar",
1351     NULL
1352   };
1353   int file_size = 20111;
1354   struct archive_entry *ae;
1355   struct archive *a;
1356 
1357   extract_reference_files(reffiles);
1358   assert((a = archive_read_new()) != NULL);
1359   assertA(0 == archive_read_support_filter_all(a));
1360   assertA(0 == archive_read_support_format_all(a));
1361   assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1362 
1363   /* First header. */
1364   assertA(0 == archive_read_next_header(a, &ae));
1365   assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1366   assertA((int)archive_entry_mtime(ae));
1367   assertA((int)archive_entry_ctime(ae));
1368   assertA((int)archive_entry_atime(ae));
1369   assertEqualInt(file_size, archive_entry_size(ae));
1370   assertEqualInt(33188, archive_entry_mode(ae));
1371   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1372   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1373 
1374   /* Test EOF */
1375   assertA(1 == archive_read_next_header(a, &ae));
1376   assertEqualInt(1, archive_file_count(a));
1377   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1378   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1379 }
1380 
DEFINE_TEST(test_read_format_rar_multivolume_seek_data)1381 DEFINE_TEST(test_read_format_rar_multivolume_seek_data)
1382 {
1383   const char *reffiles[] =
1384   {
1385     "test_rar_multivolume_single_file.part1.rar",
1386     "test_rar_multivolume_single_file.part2.rar",
1387     "test_rar_multivolume_single_file.part3.rar",
1388     NULL
1389   };
1390   char buff[64];
1391   int file_size = 20111;
1392   const char file_test_txt1[] = "d. \n</P>\n<P STYLE=\"margin-bottom: 0in\">"
1393                                 "<BR>\n</P>\n</BODY>\n</HTML>";
1394   const char file_test_txt2[] = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4."
1395                                 "0 Transitional//EN\">\n<";
1396   const char file_test_txt3[] = "mplify writing such tests,\ntry to use plat"
1397                                 "form-independent codin";
1398   const char file_test_txt4[] = "lString</TT> in the example above)\ngenerat"
1399                                 "e detailed log message";
1400   const char file_test_txt5[] = "SS=\"western\">make check</TT> will usually"
1401                                 " run\n\tall of the tests.";
1402   struct archive_entry *ae;
1403   struct archive *a;
1404 
1405   extract_reference_files(reffiles);
1406   assert((a = archive_read_new()) != NULL);
1407   assertA(0 == archive_read_support_filter_all(a));
1408   assertA(0 == archive_read_support_format_all(a));
1409   assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1410 
1411   /* First header. */
1412   assertA(0 == archive_read_next_header(a, &ae));
1413   assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1414   assertA((int)archive_entry_mtime(ae));
1415   assertA((int)archive_entry_ctime(ae));
1416   assertA((int)archive_entry_atime(ae));
1417   assertEqualInt(file_size, archive_entry_size(ae));
1418   assertEqualInt(33188, archive_entry_mode(ae));
1419   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1420   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1421 
1422   /* Seek to the end minus 64 bytes */
1423   assertA(file_size - (int)sizeof(buff) ==
1424     archive_seek_data(a, file_size - (int)sizeof(buff), SEEK_SET));
1425   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1426   assertEqualMem(buff, file_test_txt1, sizeof(file_test_txt1) - 1);
1427 
1428   /* Seek back to the beginning */
1429   assertA(0 == archive_seek_data(a, 0, SEEK_SET));
1430   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1431   assertEqualMem(buff, file_test_txt2, sizeof(file_test_txt2) - 1);
1432 
1433   /* Seek to the middle of the combined data block */
1434   assertA(10054 == archive_seek_data(a, 10054, SEEK_SET));
1435   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1436   assertEqualMem(buff, file_test_txt3, sizeof(file_test_txt3) - 1);
1437 
1438   /* Seek to 32 bytes before the end of the first data sub-block */
1439   assertA(6860 == archive_seek_data(a, 6860, SEEK_SET));
1440   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1441   assertEqualMem(buff, file_test_txt4, sizeof(file_test_txt4) - 1);
1442 
1443   /* Seek to 32 bytes before the end of the second data sub-block */
1444   assertA(13752 == archive_seek_data(a, 13752, SEEK_SET));
1445   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1446   assertEqualMem(buff, file_test_txt5, sizeof(file_test_txt5) - 1);
1447 
1448   /* Use various combinations of SEEK_SET, SEEK_CUR, and SEEK_END */
1449   assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1450   assertEqualInt(0, archive_seek_data(a, 0, SEEK_SET));
1451   assertEqualInt(0, archive_seek_data(a, 0, SEEK_CUR));
1452   assertEqualInt(-1, archive_seek_data(a, -10, SEEK_CUR));
1453   assertEqualInt(10, archive_seek_data(a, 10, SEEK_CUR));
1454   assertEqualInt(-1, archive_seek_data(a, -20, SEEK_CUR));
1455   assertEqualInt(10, archive_seek_data(a, 0, SEEK_CUR));
1456   assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1457   assertEqualInt(file_size - 20, archive_seek_data(a, -20, SEEK_END));
1458   assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_END));
1459   assertEqualInt(file_size + 40, archive_seek_data(a, 0, SEEK_CUR));
1460   assertEqualInt(file_size + 40 + 20, archive_seek_data(a, 20, SEEK_CUR));
1461   assertEqualInt(file_size + 40 + 20 + 20, archive_seek_data(a, 20, SEEK_CUR));
1462   assertEqualInt(file_size + 20, archive_seek_data(a, 20, SEEK_END));
1463   assertEqualInt(file_size - 20, archive_seek_data(a, -20, SEEK_END));
1464 
1465   /*
1466    * Attempt to read from the end of the file. These should return
1467    * 0 for end of file.
1468    */
1469   assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1470   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1471   assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1472   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1473 
1474   /* Seek to the end minus 64 bytes */
1475   assertA(0 == archive_seek_data(a, 0, SEEK_SET));
1476   assertA(file_size - (int)sizeof(buff) ==
1477     archive_seek_data(a, -(int)sizeof(buff), SEEK_END));
1478   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1479   assertEqualMem(buff, file_test_txt1, sizeof(file_test_txt1) - 1);
1480 
1481   /* The file position should be at the end of the file here */
1482   assertA(file_size == archive_seek_data(a, 0, SEEK_CUR));
1483 
1484   /* Seek back to the beginning */
1485   assertA(0 == archive_seek_data(a, -file_size, SEEK_CUR));
1486   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1487   assertEqualMem(buff, file_test_txt2, sizeof(file_test_txt2) - 1);
1488 
1489   /* Seek to the middle of the combined data block */
1490   assertA(10054 == archive_seek_data(a, 10054 - (int)sizeof(buff), SEEK_CUR));
1491   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1492   assertEqualMem(buff, file_test_txt3, sizeof(file_test_txt3) - 1);
1493 
1494   /* Seek to 32 bytes before the end of the first data sub-block */
1495   assertA(6860 == archive_seek_data(a, 6860 - (10054 + (int)sizeof(buff)),
1496                                     SEEK_CUR));
1497   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1498   assertEqualMem(buff, file_test_txt4, sizeof(file_test_txt4) - 1);
1499 
1500   /* Seek to 32 bytes before the end of the second data sub-block */
1501   assertA(13752 == archive_seek_data(a, 13752 - file_size, SEEK_END));
1502   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1503   assertEqualMem(buff, file_test_txt5, sizeof(file_test_txt5) - 1);
1504 
1505   /* Test EOF */
1506   assertA(1 == archive_read_next_header(a, &ae));
1507   assertEqualInt(1, archive_file_count(a));
1508   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1509   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1510 }
1511 
DEFINE_TEST(test_read_format_rar_multivolume_seek_multiple_files)1512 DEFINE_TEST(test_read_format_rar_multivolume_seek_multiple_files)
1513 {
1514   const char *reffiles[] =
1515   {
1516     "test_rar_multivolume_multiple_files.part1.rar",
1517     "test_rar_multivolume_multiple_files.part2.rar",
1518     "test_rar_multivolume_multiple_files.part3.rar",
1519     "test_rar_multivolume_multiple_files.part4.rar",
1520     "test_rar_multivolume_multiple_files.part5.rar",
1521     "test_rar_multivolume_multiple_files.part6.rar",
1522     NULL
1523   };
1524   char buff[64];
1525   int file_size = 20111;
1526   const char file_test_txt1[] = "d. \n</P>\n<P STYLE=\"margin-bottom: 0in\">"
1527                                 "<BR>\n</P>\n</BODY>\n</HTML>";
1528   const char file_test_txt2[] = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4."
1529                                 "0 Transitional//EN\">\n<";
1530   const char file_test_txt3[] = "mplify writing such tests,\ntry to use plat"
1531                                 "form-independent codin";
1532   const char file_test_txt4[] = "\nfailures. \n</P>\n<H1 CLASS=\"western\"><"
1533                                 "A NAME=\"Life_cycle_of_a_te";
1534   const char file_test_txt5[] = "LE=\"margin-bottom: 0in\">DO use runtime te"
1535                                 "sts for platform\n\tfeatu";
1536   const char file_test_txt6[] = "rough test suite is essential\nboth for ver"
1537                                 "ifying new ports and f";
1538   const char file_test_txt7[] = "m: 0in\">Creates a temporary directory\n\tw"
1539                                 "hose name matches the na";
1540   const char file_test_txt8[] = "lt\ninput file and verify the results. Thes"
1541                                 "e use <TT CLASS=\"weste";
1542   struct archive_entry *ae;
1543   struct archive *a;
1544 
1545   extract_reference_files(reffiles);
1546   assert((a = archive_read_new()) != NULL);
1547   assertA(0 == archive_read_support_filter_all(a));
1548   assertA(0 == archive_read_support_format_all(a));
1549   assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1550 
1551   /* First header. */
1552   assertA(0 == archive_read_next_header(a, &ae));
1553   assertEqualString("LibarchiveAddingTest2.html", archive_entry_pathname(ae));
1554   assertA((int)archive_entry_mtime(ae));
1555   assertA((int)archive_entry_ctime(ae));
1556   assertA((int)archive_entry_atime(ae));
1557   assertEqualInt(file_size, archive_entry_size(ae));
1558   assertEqualInt(33188, archive_entry_mode(ae));
1559   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1560   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1561 
1562   /* Attempt to read past end of file */
1563   assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1564   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1565   assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1566   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1567 
1568   /* Seek to the end minus 64 bytes */
1569   assertA(file_size - (int)sizeof(buff) ==
1570     archive_seek_data(a, -(int)sizeof(buff), SEEK_END));
1571   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1572   assertEqualMem(buff, file_test_txt1, sizeof(file_test_txt1) - 1);
1573 
1574   /* Seek back to the beginning */
1575   assertA(0 == archive_seek_data(a, -file_size, SEEK_END));
1576   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1577   assertEqualMem(buff, file_test_txt2, sizeof(file_test_txt2) - 1);
1578 
1579   /* Seek to the middle of the combined data block */
1580   assertA(10054 == archive_seek_data(a, 10054 - (int)sizeof(buff), SEEK_CUR));
1581   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1582   assertEqualMem(buff, file_test_txt3, sizeof(file_test_txt3) - 1);
1583 
1584   /* Seek to 32 bytes before the end of the first data sub-block */
1585   assertA(7027 == archive_seek_data(a, 7027 - (10054 + (int)sizeof(buff)),
1586                                     SEEK_CUR));
1587   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1588   assertEqualMem(buff, file_test_txt4, sizeof(file_test_txt4) - 1);
1589 
1590   /* Seek to 32 bytes before the end of the second data sub-block */
1591   assertA(14086 == archive_seek_data(a, 14086 - file_size, SEEK_END));
1592   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1593   assertEqualMem(buff, file_test_txt5, sizeof(file_test_txt5) - 1);
1594 
1595   /* Attempt to read past end of file */
1596   assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1597   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1598   assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1599   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1600 
1601   /* Second header. */
1602   assertA(0 == archive_read_next_header(a, &ae));
1603   assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1604   assertA((int)archive_entry_mtime(ae));
1605   assertA((int)archive_entry_ctime(ae));
1606   assertA((int)archive_entry_atime(ae));
1607   assertEqualInt(file_size, archive_entry_size(ae));
1608   assertEqualInt(33188, archive_entry_mode(ae));
1609   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1610   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1611 
1612   /* Attempt to read past end of file */
1613   assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1614   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1615   assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1616   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1617 
1618   /* Seek to the end minus 64 bytes */
1619   assertA(file_size - (int)sizeof(buff) ==
1620     archive_seek_data(a, file_size - (int)sizeof(buff), SEEK_SET));
1621   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1622   assertEqualMem(buff, file_test_txt1, sizeof(file_test_txt1) - 1);
1623 
1624   /* Seek back to the beginning */
1625   assertA(0 == archive_seek_data(a, 0, SEEK_SET));
1626   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1627   assertEqualMem(buff, file_test_txt2, sizeof(file_test_txt2) - 1);
1628 
1629   /* Seek to the middle of the combined data block */
1630   assertA(10054 == archive_seek_data(a, 10054 - (int)sizeof(buff), SEEK_CUR));
1631   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1632   assertEqualMem(buff, file_test_txt3, sizeof(file_test_txt3) - 1);
1633 
1634   /* Seek to 32 bytes before the end of the first data sub-block */
1635   assertA(969 == archive_seek_data(a, 969 - (10054 + (int)sizeof(buff)), SEEK_CUR));
1636   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1637   assertEqualMem(buff, file_test_txt6, sizeof(file_test_txt4) - 1);
1638 
1639   /* Seek to 32 bytes before the end of the second data sub-block */
1640   assertA(8029 == archive_seek_data(a, 8029 - file_size, SEEK_END));
1641   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1642   assertEqualMem(buff, file_test_txt7, sizeof(file_test_txt5) - 1);
1643 
1644   /* Seek to 32 bytes before the end of the third data sub-block */
1645   assertA(15089 == archive_seek_data(a, 15089 - file_size, SEEK_END));
1646   assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1647   assertEqualMem(buff, file_test_txt8, sizeof(file_test_txt5) - 1);
1648 
1649   /* Attempt to read past end of file */
1650   assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1651   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1652   assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1653   assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1654 
1655   /* Test EOF */
1656   assertA(1 == archive_read_next_header(a, &ae));
1657   assertEqualInt(2, archive_file_count(a));
1658   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1659   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1660 }
1661 
1662 static void
test_read_format_rar_multivolume_uncompressed_files_helper(struct archive * a)1663 test_read_format_rar_multivolume_uncompressed_files_helper(struct archive *a)
1664 {
1665   char buff[64];
1666 
1667   /* Do checks for seeks/reads past beginning and end of file */
1668   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1669   memset(buff, 0, sizeof(buff));
1670   assertEqualIntA(a, -1, archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_SET));
1671   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_CUR));
1672   assertEqualIntA(a, (sizeof(buff)-1),
1673     archive_read_data(a, buff, (sizeof(buff)-1)));
1674   assertEqualIntA(a, (sizeof(buff)-1), archive_seek_data(a, 0, SEEK_CUR));
1675   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD "
1676                         "HTML 4.0 Transitional//EN\">\n", buff);
1677   memset(buff, 0, sizeof(buff));
1678   assertEqualIntA(a, -1, archive_seek_data(a, -(((int)sizeof(buff)-1)*2), SEEK_CUR));
1679   assertEqualIntA(a, (sizeof(buff)-1), archive_seek_data(a, 0, SEEK_CUR));
1680   assertEqualIntA(a, (sizeof(buff)-1),
1681     archive_read_data(a, buff, (sizeof(buff)-1)));
1682   assertEqualIntA(a, ((sizeof(buff)-1)*2), archive_seek_data(a, 0, SEEK_CUR));
1683   assertEqualStringA(a, "<HTML>\n<HEAD>\n\t<META HTTP-EQUIV=\"CONTENT-TYPE\" "
1684                         "CONTENT=\"text/ht", buff);
1685   memset(buff, 0, sizeof(buff));
1686   assertEqualIntA(a, -1, archive_seek_data(a, -(20111+32), SEEK_END));
1687   assertEqualIntA(a, ((sizeof(buff)-1)*2), archive_seek_data(a, 0, SEEK_CUR));
1688   assertEqualIntA(a, (sizeof(buff)-1),
1689     archive_read_data(a, buff, (sizeof(buff)-1)));
1690   assertEqualIntA(a, ((sizeof(buff)-1)*3), archive_seek_data(a, 0, SEEK_CUR));
1691   assertEqualStringA(a, "ml; charset=utf-8\">\n\t<TITLE></TITLE>\n\t<META "
1692                         "NAME=\"GENERATOR\" CO", buff);
1693 
1694   memset(buff, 0, sizeof(buff));
1695   assertEqualIntA(a, 20111, archive_seek_data(a, 20111, SEEK_SET));
1696   assertEqualIntA(a, 20111, archive_seek_data(a, 0, SEEK_CUR));
1697   assertEqualIntA(a, 0, archive_read_data(a, buff, (sizeof(buff)-1)));
1698   assertEqualIntA(a, 20111, archive_seek_data(a, 0, SEEK_CUR));
1699   assertEqualStringA(a, "", buff);
1700   memset(buff, 0, sizeof(buff));
1701   assertEqualIntA(a, 20111 + (sizeof(buff)-1),
1702     archive_seek_data(a, (sizeof(buff)-1), SEEK_CUR));
1703   assertEqualIntA(a, 0, archive_read_data(a, buff, (sizeof(buff)-1)));
1704   assertEqualIntA(a, 20111 + (sizeof(buff)-1),
1705     archive_seek_data(a, 0, SEEK_CUR));
1706   assertEqualStringA(a, "", buff);
1707   memset(buff, 0, sizeof(buff));
1708   assertEqualIntA(a, 20111 + ((sizeof(buff)-1)*2),
1709     archive_seek_data(a, ((sizeof(buff)-1)*2), SEEK_END));
1710   assertEqualIntA(a, 0, archive_read_data(a, buff, (sizeof(buff)-1)));
1711   assertEqualIntA(a, 20111 + ((sizeof(buff)-1)*2),
1712     archive_seek_data(a, 0, SEEK_CUR));
1713   assertEqualStringA(a, "", buff);
1714 }
1715 
DEFINE_TEST(test_read_format_rar_multivolume_uncompressed_files)1716 DEFINE_TEST(test_read_format_rar_multivolume_uncompressed_files)
1717 {
1718   const char *reffiles[] =
1719   {
1720     "test_rar_multivolume_uncompressed_files.part01.rar",
1721     "test_rar_multivolume_uncompressed_files.part02.rar",
1722     "test_rar_multivolume_uncompressed_files.part03.rar",
1723     "test_rar_multivolume_uncompressed_files.part04.rar",
1724     "test_rar_multivolume_uncompressed_files.part05.rar",
1725     "test_rar_multivolume_uncompressed_files.part06.rar",
1726     "test_rar_multivolume_uncompressed_files.part07.rar",
1727     "test_rar_multivolume_uncompressed_files.part08.rar",
1728     "test_rar_multivolume_uncompressed_files.part09.rar",
1729     "test_rar_multivolume_uncompressed_files.part10.rar",
1730     NULL
1731   };
1732   char buff[64];
1733   ssize_t bytes_read;
1734   struct archive *a;
1735   struct archive_entry *ae;
1736 
1737   extract_reference_files(reffiles);
1738   assert((a = archive_read_new()) != NULL);
1739   assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
1740   assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
1741   assertEqualIntA(a, ARCHIVE_OK,
1742                   archive_read_open_filenames(a, reffiles, 10240));
1743 
1744   /*
1745    * First header.
1746    */
1747   assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1748   assertEqualStringA(a, "testdir/LibarchiveAddingTest2.html",
1749                      archive_entry_pathname(ae));
1750   assertA((int)archive_entry_mtime(ae));
1751   assertA((int)archive_entry_ctime(ae));
1752   assertA((int)archive_entry_atime(ae));
1753   assertEqualIntA(a, 20111, archive_entry_size(ae));
1754   assertEqualIntA(a, 33188, archive_entry_mode(ae));
1755   assertEqualInt(archive_entry_is_encrypted(ae), 0);
1756   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1757 
1758   test_read_format_rar_multivolume_uncompressed_files_helper(a);
1759 
1760   /* Read from the beginning to the end of the file */
1761   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1762   do
1763   {
1764     memset(buff, 0, sizeof(buff));
1765     bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
1766   } while (bytes_read > 0);
1767 
1768   /* Seek to the end minus (sizeof(buff)-1) bytes */
1769   memset(buff, 0, sizeof(buff));
1770   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1771     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1772   assertEqualIntA(a, (sizeof(buff)-1),
1773     archive_read_data(a, buff, (sizeof(buff)-1)));
1774   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1775                         "</P>\n</BODY>\n</HTML>", buff);
1776 
1777   /* Seek back to the beginning */
1778   memset(buff, 0, sizeof(buff));
1779   assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
1780   assertEqualIntA(a, (sizeof(buff)-1),
1781     archive_read_data(a, buff, (sizeof(buff)-1)));
1782   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1783                         "Transitional//EN\">\n", buff);
1784 
1785   /* Test that SEEK_SET works correctly between data blocks */
1786   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1787   memset(buff, 0, sizeof(buff));
1788   assertEqualIntA(a, 13164,
1789     archive_seek_data(a, 13164, SEEK_SET));
1790   assertEqualIntA(a, (sizeof(buff)-1),
1791     archive_read_data(a, buff, (sizeof(buff)-1)));
1792   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1793                         "assertEqualMem to test equalit", buff);
1794 
1795   memset(buff, 0, sizeof(buff));
1796   assertEqualIntA(a, 0,
1797     archive_seek_data(a, 0, SEEK_SET));
1798   assertEqualIntA(a, (sizeof(buff)-1),
1799     archive_read_data(a, buff, (sizeof(buff)-1)));
1800   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1801                         "Transitional//EN\">\n", buff);
1802 
1803   memset(buff, 0, sizeof(buff));
1804   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1805     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
1806   assertEqualIntA(a, (sizeof(buff)-1),
1807     archive_read_data(a, buff, (sizeof(buff)-1)));
1808   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1809                         "</P>\n</BODY>\n</HTML>", buff);
1810 
1811   memset(buff, 0, sizeof(buff));
1812   assertEqualIntA(a, 13164,
1813     archive_seek_data(a, 13164, SEEK_SET));
1814   assertEqualIntA(a, (sizeof(buff)-1),
1815     archive_read_data(a, buff, (sizeof(buff)-1)));
1816   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1817                         "assertEqualMem to test equalit", buff);
1818 
1819   memset(buff, 0, sizeof(buff));
1820   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1821     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
1822   assertEqualIntA(a, (sizeof(buff)-1),
1823     archive_read_data(a, buff, (sizeof(buff)-1)));
1824   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1825                         "</P>\n</BODY>\n</HTML>", buff);
1826 
1827   memset(buff, 0, sizeof(buff));
1828   assertEqualIntA(a, 0,
1829     archive_seek_data(a, 0, SEEK_SET));
1830   assertEqualIntA(a, (sizeof(buff)-1),
1831     archive_read_data(a, buff, (sizeof(buff)-1)));
1832   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1833                         "Transitional//EN\">\n", buff);
1834 
1835   memset(buff, 0, sizeof(buff));
1836   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1837     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
1838   assertEqualIntA(a, (sizeof(buff)-1),
1839     archive_read_data(a, buff, (sizeof(buff)-1)));
1840   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1841                         "</P>\n</BODY>\n</HTML>", buff);
1842 
1843   memset(buff, 0, sizeof(buff));
1844   assertEqualIntA(a, 13164,
1845     archive_seek_data(a, 13164, SEEK_SET));
1846   assertEqualIntA(a, (sizeof(buff)-1),
1847     archive_read_data(a, buff, (sizeof(buff)-1)));
1848   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1849                         "assertEqualMem to test equalit", buff);
1850 
1851   memset(buff, 0, sizeof(buff));
1852   assertEqualIntA(a, 0,
1853     archive_seek_data(a, 0, SEEK_SET));
1854   assertEqualIntA(a, (sizeof(buff)-1),
1855     archive_read_data(a, buff, (sizeof(buff)-1)));
1856   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1857                         "Transitional//EN\">\n", buff);
1858 
1859   /* Test that SEEK_CUR works correctly between data blocks */
1860   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1861   memset(buff, 0, sizeof(buff));
1862   assertEqualIntA(a, 13164,
1863     archive_seek_data(a, 13164, SEEK_CUR));
1864   assertEqualIntA(a, (sizeof(buff)-1),
1865     archive_read_data(a, buff, (sizeof(buff)-1)));
1866   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1867                         "assertEqualMem to test equalit", buff);
1868 
1869   memset(buff, 0, sizeof(buff));
1870   assertEqualIntA(a, 0,
1871     archive_seek_data(a, -13227, SEEK_CUR));
1872   assertEqualIntA(a, (sizeof(buff)-1),
1873     archive_read_data(a, buff, (sizeof(buff)-1)));
1874   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1875                         "Transitional//EN\">\n", buff);
1876 
1877   memset(buff, 0, sizeof(buff));
1878   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1879     archive_seek_data(a, 19985, SEEK_CUR));
1880   assertEqualIntA(a, (sizeof(buff)-1),
1881     archive_read_data(a, buff, (sizeof(buff)-1)));
1882   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1883                         "</P>\n</BODY>\n</HTML>", buff);
1884 
1885   memset(buff, 0, sizeof(buff));
1886   assertEqualIntA(a, 13164,
1887     archive_seek_data(a, -6947, SEEK_CUR));
1888   assertEqualIntA(a, (sizeof(buff)-1),
1889     archive_read_data(a, buff, (sizeof(buff)-1)));
1890   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1891                         "assertEqualMem to test equalit", buff);
1892 
1893   memset(buff, 0, sizeof(buff));
1894   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1895     archive_seek_data(a, 6821, SEEK_CUR));
1896   assertEqualIntA(a, (sizeof(buff)-1),
1897     archive_read_data(a, buff, (sizeof(buff)-1)));
1898   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1899                         "</P>\n</BODY>\n</HTML>", buff);
1900 
1901   memset(buff, 0, sizeof(buff));
1902   assertEqualIntA(a, 0,
1903     archive_seek_data(a, -20111, SEEK_CUR));
1904   assertEqualIntA(a, (sizeof(buff)-1),
1905     archive_read_data(a, buff, (sizeof(buff)-1)));
1906   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1907                         "Transitional//EN\">\n", buff);
1908 
1909   memset(buff, 0, sizeof(buff));
1910   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1911     archive_seek_data(a, 19985, SEEK_CUR));
1912   assertEqualIntA(a, (sizeof(buff)-1),
1913     archive_read_data(a, buff, (sizeof(buff)-1)));
1914   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1915                         "</P>\n</BODY>\n</HTML>", buff);
1916 
1917   memset(buff, 0, sizeof(buff));
1918   assertEqualIntA(a, 13164,
1919     archive_seek_data(a, -6947, SEEK_CUR));
1920   assertEqualIntA(a, (sizeof(buff)-1),
1921     archive_read_data(a, buff, (sizeof(buff)-1)));
1922   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1923                         "assertEqualMem to test equalit", buff);
1924 
1925   memset(buff, 0, sizeof(buff));
1926   assertEqualIntA(a, 0,
1927     archive_seek_data(a, -13227, SEEK_CUR));
1928   assertEqualIntA(a, (sizeof(buff)-1),
1929     archive_read_data(a, buff, (sizeof(buff)-1)));
1930   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1931                         "Transitional//EN\">\n", buff);
1932 
1933   /* Test that SEEK_END works correctly between data blocks */
1934   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1935   memset(buff, 0, sizeof(buff));
1936   assertEqualIntA(a, 13164,
1937     archive_seek_data(a, -6947, SEEK_END));
1938   assertEqualIntA(a, (sizeof(buff)-1),
1939     archive_read_data(a, buff, (sizeof(buff)-1)));
1940   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1941                         "assertEqualMem to test equalit", buff);
1942 
1943   memset(buff, 0, sizeof(buff));
1944   assertEqualIntA(a, 0,
1945     archive_seek_data(a, -20111, SEEK_END));
1946   assertEqualIntA(a, (sizeof(buff)-1),
1947     archive_read_data(a, buff, (sizeof(buff)-1)));
1948   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1949                         "Transitional//EN\">\n", buff);
1950 
1951   memset(buff, 0, sizeof(buff));
1952   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1953     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1954   assertEqualIntA(a, (sizeof(buff)-1),
1955     archive_read_data(a, buff, (sizeof(buff)-1)));
1956   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1957                         "</P>\n</BODY>\n</HTML>", buff);
1958 
1959   memset(buff, 0, sizeof(buff));
1960   assertEqualIntA(a, 13164,
1961     archive_seek_data(a, -6947, SEEK_END));
1962   assertEqualIntA(a, (sizeof(buff)-1),
1963     archive_read_data(a, buff, (sizeof(buff)-1)));
1964   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1965                         "assertEqualMem to test equalit", buff);
1966 
1967   memset(buff, 0, sizeof(buff));
1968   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1969     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1970   assertEqualIntA(a, (sizeof(buff)-1),
1971     archive_read_data(a, buff, (sizeof(buff)-1)));
1972   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1973                         "</P>\n</BODY>\n</HTML>", buff);
1974 
1975   memset(buff, 0, sizeof(buff));
1976   assertEqualIntA(a, 0,
1977     archive_seek_data(a, -20111, SEEK_END));
1978   assertEqualIntA(a, (sizeof(buff)-1),
1979     archive_read_data(a, buff, (sizeof(buff)-1)));
1980   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1981                         "Transitional//EN\">\n", buff);
1982 
1983   memset(buff, 0, sizeof(buff));
1984   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1985     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1986   assertEqualIntA(a, (sizeof(buff)-1),
1987     archive_read_data(a, buff, (sizeof(buff)-1)));
1988   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1989                         "</P>\n</BODY>\n</HTML>", buff);
1990 
1991   memset(buff, 0, sizeof(buff));
1992   assertEqualIntA(a, 13164,
1993     archive_seek_data(a, -6947, SEEK_END));
1994   assertEqualIntA(a, (sizeof(buff)-1),
1995     archive_read_data(a, buff, (sizeof(buff)-1)));
1996   assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1997                         "assertEqualMem to test equalit", buff);
1998 
1999   memset(buff, 0, sizeof(buff));
2000   assertEqualIntA(a, 0,
2001     archive_seek_data(a, -20111, SEEK_END));
2002   assertEqualIntA(a, (sizeof(buff)-1),
2003     archive_read_data(a, buff, (sizeof(buff)-1)));
2004   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2005                         "Transitional//EN\">\n", buff);
2006 
2007   test_read_format_rar_multivolume_uncompressed_files_helper(a);
2008 
2009   /*
2010    * Second header.
2011    */
2012   assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
2013   assertEqualStringA(a, "testdir/testsubdir/LibarchiveAddingTest2.html",
2014                      archive_entry_pathname(ae));
2015   assertA((int)archive_entry_mtime(ae));
2016   assertA((int)archive_entry_ctime(ae));
2017   assertA((int)archive_entry_atime(ae));
2018   assertEqualIntA(a, 20111, archive_entry_size(ae));
2019   assertEqualIntA(a, 33188, archive_entry_mode(ae));
2020   assertEqualInt(archive_entry_is_encrypted(ae), 0);
2021   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
2022 
2023   test_read_format_rar_multivolume_uncompressed_files_helper(a);
2024 
2025   /* Read from the beginning to the end of the file */
2026   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2027   do
2028   {
2029     memset(buff, 0, sizeof(buff));
2030     bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
2031   } while (bytes_read > 0);
2032 
2033   /* Seek to the end minus (sizeof(buff)-1) bytes */
2034   memset(buff, 0, sizeof(buff));
2035   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2036     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2037   assertEqualIntA(a, (sizeof(buff)-1),
2038     archive_read_data(a, buff, (sizeof(buff)-1)));
2039   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2040                         "</P>\n</BODY>\n</HTML>", buff);
2041 
2042   /* Seek back to the beginning */
2043   memset(buff, 0, sizeof(buff));
2044   assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
2045   assertEqualIntA(a, (sizeof(buff)-1),
2046     archive_read_data(a, buff, (sizeof(buff)-1)));
2047   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2048                         "Transitional//EN\">\n", buff);
2049 
2050   /* Test that SEEK_SET works correctly between data blocks */
2051   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2052   memset(buff, 0, sizeof(buff));
2053   assertEqualIntA(a, 6162,
2054     archive_seek_data(a, 6162, SEEK_SET));
2055   assertEqualIntA(a, (sizeof(buff)-1),
2056     archive_read_data(a, buff, (sizeof(buff)-1)));
2057   assertEqualStringA(a, "arguments satisfy certain conditions. "
2058                         "If the assertion fails--f", buff);
2059 
2060   memset(buff, 0, sizeof(buff));
2061   assertEqualIntA(a, 19347,
2062     archive_seek_data(a, 19347, SEEK_SET));
2063   assertEqualIntA(a, (sizeof(buff)-1),
2064     archive_read_data(a, buff, (sizeof(buff)-1)));
2065   assertEqualStringA(a, " when a block being written out by\n"
2066                         "the archive writer is the sa", buff);
2067 
2068   memset(buff, 0, sizeof(buff));
2069   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2070     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2071   assertEqualIntA(a, (sizeof(buff)-1),
2072     archive_read_data(a, buff, (sizeof(buff)-1)));
2073   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2074                         "</P>\n</BODY>\n</HTML>", buff);
2075 
2076   memset(buff, 0, sizeof(buff));
2077   assertEqualIntA(a, 19347,
2078     archive_seek_data(a, 19347, SEEK_SET));
2079   assertEqualIntA(a, (sizeof(buff)-1),
2080     archive_read_data(a, buff, (sizeof(buff)-1)));
2081   assertEqualStringA(a, " when a block being written out by\n"
2082                         "the archive writer is the sa", buff);
2083 
2084   memset(buff, 0, sizeof(buff));
2085   assertEqualIntA(a, 6162,
2086     archive_seek_data(a, 6162, SEEK_SET));
2087   assertEqualIntA(a, (sizeof(buff)-1),
2088     archive_read_data(a, buff, (sizeof(buff)-1)));
2089   assertEqualStringA(a, "arguments satisfy certain conditions. "
2090                         "If the assertion fails--f", buff);
2091 
2092   memset(buff, 0, sizeof(buff));
2093   assertEqualIntA(a, 0,
2094     archive_seek_data(a, 0, SEEK_SET));
2095   assertEqualIntA(a, (sizeof(buff)-1),
2096     archive_read_data(a, buff, (sizeof(buff)-1)));
2097   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2098                         "Transitional//EN\">\n", buff);
2099 
2100   memset(buff, 0, sizeof(buff));
2101   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2102     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2103   assertEqualIntA(a, (sizeof(buff)-1),
2104     archive_read_data(a, buff, (sizeof(buff)-1)));
2105   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2106                         "</P>\n</BODY>\n</HTML>", buff);
2107 
2108   memset(buff, 0, sizeof(buff));
2109   assertEqualIntA(a, 6162,
2110     archive_seek_data(a, 6162, SEEK_SET));
2111   assertEqualIntA(a, (sizeof(buff)-1),
2112     archive_read_data(a, buff, (sizeof(buff)-1)));
2113   assertEqualStringA(a, "arguments satisfy certain conditions. "
2114                         "If the assertion fails--f", buff);
2115 
2116   memset(buff, 0, sizeof(buff));
2117   assertEqualIntA(a, 19347,
2118     archive_seek_data(a, 19347, SEEK_SET));
2119   assertEqualIntA(a, (sizeof(buff)-1),
2120     archive_read_data(a, buff, (sizeof(buff)-1)));
2121   assertEqualStringA(a, " when a block being written out by\n"
2122                         "the archive writer is the sa", buff);
2123 
2124   memset(buff, 0, sizeof(buff));
2125   assertEqualIntA(a, 0,
2126     archive_seek_data(a, 0, SEEK_SET));
2127   assertEqualIntA(a, (sizeof(buff)-1),
2128     archive_read_data(a, buff, (sizeof(buff)-1)));
2129   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2130                         "Transitional//EN\">\n", buff);
2131 
2132   memset(buff, 0, sizeof(buff));
2133   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2134     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2135   assertEqualIntA(a, (sizeof(buff)-1),
2136     archive_read_data(a, buff, (sizeof(buff)-1)));
2137   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2138                         "</P>\n</BODY>\n</HTML>", buff);
2139 
2140   memset(buff, 0, sizeof(buff));
2141   assertEqualIntA(a, 0,
2142     archive_seek_data(a, 0, SEEK_SET));
2143   assertEqualIntA(a, (sizeof(buff)-1),
2144     archive_read_data(a, buff, (sizeof(buff)-1)));
2145   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2146                         "Transitional//EN\">\n", buff);
2147 
2148   memset(buff, 0, sizeof(buff));
2149   assertEqualIntA(a, 19347,
2150     archive_seek_data(a, 19347, SEEK_SET));
2151   assertEqualIntA(a, (sizeof(buff)-1),
2152     archive_read_data(a, buff, (sizeof(buff)-1)));
2153   assertEqualStringA(a, " when a block being written out by\n"
2154                         "the archive writer is the sa", buff);
2155 
2156   memset(buff, 0, sizeof(buff));
2157   assertEqualIntA(a, 6162,
2158     archive_seek_data(a, 6162, SEEK_SET));
2159   assertEqualIntA(a, (sizeof(buff)-1),
2160     archive_read_data(a, buff, (sizeof(buff)-1)));
2161   assertEqualStringA(a, "arguments satisfy certain conditions. "
2162                         "If the assertion fails--f", buff);
2163 
2164   /* Test that SEEK_CUR works correctly between data blocks */
2165   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2166   memset(buff, 0, sizeof(buff));
2167   assertEqualIntA(a, 6162,
2168     archive_seek_data(a, 6162, SEEK_CUR));
2169   assertEqualIntA(a, (sizeof(buff)-1),
2170     archive_read_data(a, buff, (sizeof(buff)-1)));
2171   assertEqualStringA(a, "arguments satisfy certain conditions. "
2172                         "If the assertion fails--f", buff);
2173 
2174   memset(buff, 0, sizeof(buff));
2175   assertEqualIntA(a, 19347,
2176     archive_seek_data(a, 13122, SEEK_CUR));
2177   assertEqualIntA(a, (sizeof(buff)-1),
2178     archive_read_data(a, buff, (sizeof(buff)-1)));
2179   assertEqualStringA(a, " when a block being written out by\n"
2180                         "the archive writer is the sa", buff);
2181 
2182   memset(buff, 0, sizeof(buff));
2183   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2184     archive_seek_data(a, 638, SEEK_CUR));
2185   assertEqualIntA(a, (sizeof(buff)-1),
2186     archive_read_data(a, buff, (sizeof(buff)-1)));
2187   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2188                         "</P>\n</BODY>\n</HTML>", buff);
2189 
2190   memset(buff, 0, sizeof(buff));
2191   assertEqualIntA(a, 19347,
2192     archive_seek_data(a, -764, SEEK_CUR));
2193   assertEqualIntA(a, (sizeof(buff)-1),
2194     archive_read_data(a, buff, (sizeof(buff)-1)));
2195   assertEqualStringA(a, " when a block being written out by\n"
2196                         "the archive writer is the sa", buff);
2197 
2198   memset(buff, 0, sizeof(buff));
2199   assertEqualIntA(a, 6162,
2200     archive_seek_data(a, -13248, SEEK_CUR));
2201   assertEqualIntA(a, (sizeof(buff)-1),
2202     archive_read_data(a, buff, (sizeof(buff)-1)));
2203   assertEqualStringA(a, "arguments satisfy certain conditions. "
2204                         "If the assertion fails--f", buff);
2205 
2206   memset(buff, 0, sizeof(buff));
2207   assertEqualIntA(a, 0,
2208     archive_seek_data(a, -6225, SEEK_CUR));
2209   assertEqualIntA(a, (sizeof(buff)-1),
2210     archive_read_data(a, buff, (sizeof(buff)-1)));
2211   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2212                         "Transitional//EN\">\n", buff);
2213 
2214   memset(buff, 0, sizeof(buff));
2215   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2216     archive_seek_data(a, 19985, SEEK_CUR));
2217   assertEqualIntA(a, (sizeof(buff)-1),
2218     archive_read_data(a, buff, (sizeof(buff)-1)));
2219   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2220                         "</P>\n</BODY>\n</HTML>", buff);
2221 
2222   memset(buff, 0, sizeof(buff));
2223   assertEqualIntA(a, 6162,
2224     archive_seek_data(a, -13949, SEEK_CUR));
2225   assertEqualIntA(a, (sizeof(buff)-1),
2226     archive_read_data(a, buff, (sizeof(buff)-1)));
2227   assertEqualStringA(a, "arguments satisfy certain conditions. "
2228                         "If the assertion fails--f", buff);
2229 
2230   memset(buff, 0, sizeof(buff));
2231   assertEqualIntA(a, 19347,
2232     archive_seek_data(a, 13122, SEEK_CUR));
2233   assertEqualIntA(a, (sizeof(buff)-1),
2234     archive_read_data(a, buff, (sizeof(buff)-1)));
2235   assertEqualStringA(a, " when a block being written out by\n"
2236                         "the archive writer is the sa", buff);
2237 
2238   memset(buff, 0, sizeof(buff));
2239   assertEqualIntA(a, 0,
2240     archive_seek_data(a, -19410, SEEK_CUR));
2241   assertEqualIntA(a, (sizeof(buff)-1),
2242     archive_read_data(a, buff, (sizeof(buff)-1)));
2243   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2244                         "Transitional//EN\">\n", buff);
2245 
2246   memset(buff, 0, sizeof(buff));
2247   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2248     archive_seek_data(a, 19985, SEEK_CUR));
2249   assertEqualIntA(a, (sizeof(buff)-1),
2250     archive_read_data(a, buff, (sizeof(buff)-1)));
2251   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2252                         "</P>\n</BODY>\n</HTML>", buff);
2253 
2254   memset(buff, 0, sizeof(buff));
2255   assertEqualIntA(a, 0,
2256     archive_seek_data(a, -20111, SEEK_CUR));
2257   assertEqualIntA(a, (sizeof(buff)-1),
2258     archive_read_data(a, buff, (sizeof(buff)-1)));
2259   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2260                         "Transitional//EN\">\n", buff);
2261 
2262   memset(buff, 0, sizeof(buff));
2263   assertEqualIntA(a, 19347,
2264     archive_seek_data(a, 19284, SEEK_CUR));
2265   assertEqualIntA(a, (sizeof(buff)-1),
2266     archive_read_data(a, buff, (sizeof(buff)-1)));
2267   assertEqualStringA(a, " when a block being written out by\n"
2268                         "the archive writer is the sa", buff);
2269 
2270   memset(buff, 0, sizeof(buff));
2271   assertEqualIntA(a, 6162,
2272     archive_seek_data(a, -13248, SEEK_CUR));
2273   assertEqualIntA(a, (sizeof(buff)-1),
2274     archive_read_data(a, buff, (sizeof(buff)-1)));
2275   assertEqualStringA(a, "arguments satisfy certain conditions. "
2276                         "If the assertion fails--f", buff);
2277 
2278   /* Test that SEEK_END works correctly between data blocks */
2279   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2280   memset(buff, 0, sizeof(buff));
2281   assertEqualIntA(a, 6162,
2282     archive_seek_data(a, -13949, SEEK_END));
2283   assertEqualIntA(a, (sizeof(buff)-1),
2284     archive_read_data(a, buff, (sizeof(buff)-1)));
2285   assertEqualStringA(a, "arguments satisfy certain conditions. "
2286                         "If the assertion fails--f", buff);
2287 
2288   memset(buff, 0, sizeof(buff));
2289   assertEqualIntA(a, 19347,
2290     archive_seek_data(a, -764, SEEK_END));
2291   assertEqualIntA(a, (sizeof(buff)-1),
2292     archive_read_data(a, buff, (sizeof(buff)-1)));
2293   assertEqualStringA(a, " when a block being written out by\n"
2294                         "the archive writer is the sa", buff);
2295 
2296   memset(buff, 0, sizeof(buff));
2297   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2298     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2299   assertEqualIntA(a, (sizeof(buff)-1),
2300     archive_read_data(a, buff, (sizeof(buff)-1)));
2301   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2302                         "</P>\n</BODY>\n</HTML>", buff);
2303 
2304   memset(buff, 0, sizeof(buff));
2305   assertEqualIntA(a, 19347,
2306     archive_seek_data(a, -764, SEEK_END));
2307   assertEqualIntA(a, (sizeof(buff)-1),
2308     archive_read_data(a, buff, (sizeof(buff)-1)));
2309   assertEqualStringA(a, " when a block being written out by\n"
2310                         "the archive writer is the sa", buff);
2311 
2312   memset(buff, 0, sizeof(buff));
2313   assertEqualIntA(a, 6162,
2314     archive_seek_data(a, -13949, SEEK_END));
2315   assertEqualIntA(a, (sizeof(buff)-1),
2316     archive_read_data(a, buff, (sizeof(buff)-1)));
2317   assertEqualStringA(a, "arguments satisfy certain conditions. "
2318                         "If the assertion fails--f", buff);
2319 
2320   memset(buff, 0, sizeof(buff));
2321   assertEqualIntA(a, 0,
2322     archive_seek_data(a, -20111, SEEK_END));
2323   assertEqualIntA(a, (sizeof(buff)-1),
2324     archive_read_data(a, buff, (sizeof(buff)-1)));
2325   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2326                         "Transitional//EN\">\n", buff);
2327 
2328   memset(buff, 0, sizeof(buff));
2329   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2330     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2331   assertEqualIntA(a, (sizeof(buff)-1),
2332     archive_read_data(a, buff, (sizeof(buff)-1)));
2333   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2334                         "</P>\n</BODY>\n</HTML>", buff);
2335 
2336   memset(buff, 0, sizeof(buff));
2337   assertEqualIntA(a, 6162,
2338     archive_seek_data(a, -13949, SEEK_END));
2339   assertEqualIntA(a, (sizeof(buff)-1),
2340     archive_read_data(a, buff, (sizeof(buff)-1)));
2341   assertEqualStringA(a, "arguments satisfy certain conditions. "
2342                         "If the assertion fails--f", buff);
2343 
2344   memset(buff, 0, sizeof(buff));
2345   assertEqualIntA(a, 19347,
2346     archive_seek_data(a, -764, SEEK_END));
2347   assertEqualIntA(a, (sizeof(buff)-1),
2348     archive_read_data(a, buff, (sizeof(buff)-1)));
2349   assertEqualStringA(a, " when a block being written out by\n"
2350                         "the archive writer is the sa", buff);
2351 
2352   memset(buff, 0, sizeof(buff));
2353   assertEqualIntA(a, 0,
2354     archive_seek_data(a, -20111, SEEK_END));
2355   assertEqualIntA(a, (sizeof(buff)-1),
2356     archive_read_data(a, buff, (sizeof(buff)-1)));
2357   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2358                         "Transitional//EN\">\n", buff);
2359 
2360   memset(buff, 0, sizeof(buff));
2361   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2362     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2363   assertEqualIntA(a, (sizeof(buff)-1),
2364     archive_read_data(a, buff, (sizeof(buff)-1)));
2365   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2366                         "</P>\n</BODY>\n</HTML>", buff);
2367 
2368   memset(buff, 0, sizeof(buff));
2369   assertEqualIntA(a, 0,
2370     archive_seek_data(a, -20111, SEEK_END));
2371   assertEqualIntA(a, (sizeof(buff)-1),
2372     archive_read_data(a, buff, (sizeof(buff)-1)));
2373   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2374                         "Transitional//EN\">\n", buff);
2375 
2376   memset(buff, 0, sizeof(buff));
2377   assertEqualIntA(a, 19347,
2378     archive_seek_data(a, -764, SEEK_END));
2379   assertEqualIntA(a, (sizeof(buff)-1),
2380     archive_read_data(a, buff, (sizeof(buff)-1)));
2381   assertEqualStringA(a, " when a block being written out by\n"
2382                         "the archive writer is the sa", buff);
2383 
2384   memset(buff, 0, sizeof(buff));
2385   assertEqualIntA(a, 6162,
2386     archive_seek_data(a, -13949, SEEK_END));
2387   assertEqualIntA(a, (sizeof(buff)-1),
2388     archive_read_data(a, buff, (sizeof(buff)-1)));
2389   assertEqualStringA(a, "arguments satisfy certain conditions. "
2390                         "If the assertion fails--f", buff);
2391 
2392   test_read_format_rar_multivolume_uncompressed_files_helper(a);
2393 
2394   /*
2395    * Third header.
2396    */
2397   assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
2398   assertEqualStringA(a, "LibarchiveAddingTest2.html",
2399                      archive_entry_pathname(ae));
2400   assertA((int)archive_entry_mtime(ae));
2401   assertA((int)archive_entry_ctime(ae));
2402   assertA((int)archive_entry_atime(ae));
2403   assertEqualIntA(a, 20111, archive_entry_size(ae));
2404   assertEqualIntA(a, 33188, archive_entry_mode(ae));
2405   assertEqualInt(archive_entry_is_encrypted(ae), 0);
2406   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
2407 
2408   test_read_format_rar_multivolume_uncompressed_files_helper(a);
2409 
2410   /* Read from the beginning to the end of the file */
2411   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2412   do
2413   {
2414     memset(buff, 0, sizeof(buff));
2415     bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
2416   } while (bytes_read > 0);
2417 
2418   /* Seek to the end minus (sizeof(buff)-1) bytes */
2419   memset(buff, 0, sizeof(buff));
2420   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2421     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2422   assertEqualIntA(a, (sizeof(buff)-1),
2423     archive_read_data(a, buff, (sizeof(buff)-1)));
2424   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2425                         "</P>\n</BODY>\n</HTML>", buff);
2426 
2427   /* Seek back to the beginning */
2428   memset(buff, 0, sizeof(buff));
2429   assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
2430   assertEqualIntA(a, (sizeof(buff)-1),
2431     archive_read_data(a, buff, (sizeof(buff)-1)));
2432   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2433                         "Transitional//EN\">\n", buff);
2434 
2435   /* Test that SEEK_SET works correctly between data blocks */
2436   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2437   memset(buff, 0, sizeof(buff));
2438   assertEqualIntA(a, 12353,
2439     archive_seek_data(a, 12353, SEEK_SET));
2440   assertEqualIntA(a, (sizeof(buff)-1),
2441     archive_read_data(a, buff, (sizeof(buff)-1)));
2442   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2443                         "extract_reference_file(&quot;test_foo.tar", buff);
2444 
2445   memset(buff, 0, sizeof(buff));
2446   assertEqualIntA(a, 0,
2447     archive_seek_data(a, 0, SEEK_SET));
2448   assertEqualIntA(a, (sizeof(buff)-1),
2449     archive_read_data(a, buff, (sizeof(buff)-1)));
2450   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2451                         "Transitional//EN\">\n", buff);
2452 
2453   memset(buff, 0, sizeof(buff));
2454   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2455     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2456   assertEqualIntA(a, (sizeof(buff)-1),
2457     archive_read_data(a, buff, (sizeof(buff)-1)));
2458   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2459                         "</P>\n</BODY>\n</HTML>", buff);
2460 
2461   memset(buff, 0, sizeof(buff));
2462   assertEqualIntA(a, 12353,
2463     archive_seek_data(a, 12353, SEEK_SET));
2464   assertEqualIntA(a, (sizeof(buff)-1),
2465     archive_read_data(a, buff, (sizeof(buff)-1)));
2466   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2467                         "extract_reference_file(&quot;test_foo.tar", buff);
2468 
2469   memset(buff, 0, sizeof(buff));
2470   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2471     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2472   assertEqualIntA(a, (sizeof(buff)-1),
2473     archive_read_data(a, buff, (sizeof(buff)-1)));
2474   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2475                         "</P>\n</BODY>\n</HTML>", buff);
2476 
2477   memset(buff, 0, sizeof(buff));
2478   assertEqualIntA(a, 0,
2479     archive_seek_data(a, 0, SEEK_SET));
2480   assertEqualIntA(a, (sizeof(buff)-1),
2481     archive_read_data(a, buff, (sizeof(buff)-1)));
2482   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2483                         "Transitional//EN\">\n", buff);
2484 
2485   memset(buff, 0, sizeof(buff));
2486   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2487     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2488   assertEqualIntA(a, (sizeof(buff)-1),
2489     archive_read_data(a, buff, (sizeof(buff)-1)));
2490   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2491                         "</P>\n</BODY>\n</HTML>", buff);
2492 
2493   memset(buff, 0, sizeof(buff));
2494   assertEqualIntA(a, 12353,
2495     archive_seek_data(a, 12353, SEEK_SET));
2496   assertEqualIntA(a, (sizeof(buff)-1),
2497     archive_read_data(a, buff, (sizeof(buff)-1)));
2498   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2499                         "extract_reference_file(&quot;test_foo.tar", buff);
2500 
2501   memset(buff, 0, sizeof(buff));
2502   assertEqualIntA(a, 0,
2503     archive_seek_data(a, 0, SEEK_SET));
2504   assertEqualIntA(a, (sizeof(buff)-1),
2505     archive_read_data(a, buff, (sizeof(buff)-1)));
2506   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2507                         "Transitional//EN\">\n", buff);
2508 
2509   /* Test that SEEK_CUR works correctly between data blocks */
2510   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2511   memset(buff, 0, sizeof(buff));
2512   assertEqualIntA(a, 12353,
2513     archive_seek_data(a, 12353, SEEK_CUR));
2514   assertEqualIntA(a, (sizeof(buff)-1),
2515     archive_read_data(a, buff, (sizeof(buff)-1)));
2516   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2517                         "extract_reference_file(&quot;test_foo.tar", buff);
2518 
2519   memset(buff, 0, sizeof(buff));
2520   assertEqualIntA(a, 0,
2521     archive_seek_data(a, -12416, SEEK_CUR));
2522   assertEqualIntA(a, (sizeof(buff)-1),
2523     archive_read_data(a, buff, (sizeof(buff)-1)));
2524   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2525                         "Transitional//EN\">\n", buff);
2526 
2527   memset(buff, 0, sizeof(buff));
2528   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2529     archive_seek_data(a, 19985, SEEK_CUR));
2530   assertEqualIntA(a, (sizeof(buff)-1),
2531     archive_read_data(a, buff, (sizeof(buff)-1)));
2532   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2533                         "</P>\n</BODY>\n</HTML>", buff);
2534 
2535   memset(buff, 0, sizeof(buff));
2536   assertEqualIntA(a, 12353,
2537     archive_seek_data(a, -7758, SEEK_CUR));
2538   assertEqualIntA(a, (sizeof(buff)-1),
2539     archive_read_data(a, buff, (sizeof(buff)-1)));
2540   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2541                         "extract_reference_file(&quot;test_foo.tar", buff);
2542 
2543   memset(buff, 0, sizeof(buff));
2544   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2545     archive_seek_data(a, 7632, SEEK_CUR));
2546   assertEqualIntA(a, (sizeof(buff)-1),
2547     archive_read_data(a, buff, (sizeof(buff)-1)));
2548   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2549                         "</P>\n</BODY>\n</HTML>", buff);
2550 
2551   memset(buff, 0, sizeof(buff));
2552   assertEqualIntA(a, 0,
2553     archive_seek_data(a, -20111, SEEK_CUR));
2554   assertEqualIntA(a, (sizeof(buff)-1),
2555     archive_read_data(a, buff, (sizeof(buff)-1)));
2556   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2557                         "Transitional//EN\">\n", buff);
2558 
2559   memset(buff, 0, sizeof(buff));
2560   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2561     archive_seek_data(a, 19985, SEEK_CUR));
2562   assertEqualIntA(a, (sizeof(buff)-1),
2563     archive_read_data(a, buff, (sizeof(buff)-1)));
2564   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2565                         "</P>\n</BODY>\n</HTML>", buff);
2566 
2567   memset(buff, 0, sizeof(buff));
2568   assertEqualIntA(a, 12353,
2569     archive_seek_data(a, -7758, SEEK_CUR));
2570   assertEqualIntA(a, (sizeof(buff)-1),
2571     archive_read_data(a, buff, (sizeof(buff)-1)));
2572   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2573                         "extract_reference_file(&quot;test_foo.tar", buff);
2574 
2575   memset(buff, 0, sizeof(buff));
2576   assertEqualIntA(a, 0,
2577     archive_seek_data(a, -12416, SEEK_CUR));
2578   assertEqualIntA(a, (sizeof(buff)-1),
2579     archive_read_data(a, buff, (sizeof(buff)-1)));
2580   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2581                         "Transitional//EN\">\n", buff);
2582 
2583   /* Test that SEEK_END works correctly between data blocks */
2584   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2585   memset(buff, 0, sizeof(buff));
2586   assertEqualIntA(a, 12353,
2587     archive_seek_data(a, -7758, SEEK_END));
2588   assertEqualIntA(a, (sizeof(buff)-1),
2589     archive_read_data(a, buff, (sizeof(buff)-1)));
2590   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2591                         "extract_reference_file(&quot;test_foo.tar", buff);
2592 
2593   memset(buff, 0, sizeof(buff));
2594   assertEqualIntA(a, 0,
2595     archive_seek_data(a, -20111, SEEK_END));
2596   assertEqualIntA(a, (sizeof(buff)-1),
2597     archive_read_data(a, buff, (sizeof(buff)-1)));
2598   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2599                         "Transitional//EN\">\n", buff);
2600 
2601   memset(buff, 0, sizeof(buff));
2602   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2603     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2604   assertEqualIntA(a, (sizeof(buff)-1),
2605     archive_read_data(a, buff, (sizeof(buff)-1)));
2606   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2607                         "</P>\n</BODY>\n</HTML>", buff);
2608 
2609   memset(buff, 0, sizeof(buff));
2610   assertEqualIntA(a, 12353,
2611     archive_seek_data(a, -7758, SEEK_END));
2612   assertEqualIntA(a, (sizeof(buff)-1),
2613     archive_read_data(a, buff, (sizeof(buff)-1)));
2614   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2615                         "extract_reference_file(&quot;test_foo.tar", buff);
2616 
2617   memset(buff, 0, sizeof(buff));
2618   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2619     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2620   assertEqualIntA(a, (sizeof(buff)-1),
2621     archive_read_data(a, buff, (sizeof(buff)-1)));
2622   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2623                         "</P>\n</BODY>\n</HTML>", buff);
2624 
2625   memset(buff, 0, sizeof(buff));
2626   assertEqualIntA(a, 0,
2627     archive_seek_data(a, -20111, SEEK_END));
2628   assertEqualIntA(a, (sizeof(buff)-1),
2629     archive_read_data(a, buff, (sizeof(buff)-1)));
2630   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2631                         "Transitional//EN\">\n", buff);
2632 
2633   memset(buff, 0, sizeof(buff));
2634   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2635     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2636   assertEqualIntA(a, (sizeof(buff)-1),
2637     archive_read_data(a, buff, (sizeof(buff)-1)));
2638   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2639                         "</P>\n</BODY>\n</HTML>", buff);
2640 
2641   memset(buff, 0, sizeof(buff));
2642   assertEqualIntA(a, 12353,
2643     archive_seek_data(a, -7758, SEEK_END));
2644   assertEqualIntA(a, (sizeof(buff)-1),
2645     archive_read_data(a, buff, (sizeof(buff)-1)));
2646   assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2647                         "extract_reference_file(&quot;test_foo.tar", buff);
2648 
2649   memset(buff, 0, sizeof(buff));
2650   assertEqualIntA(a, 0,
2651     archive_seek_data(a, -20111, SEEK_END));
2652   assertEqualIntA(a, (sizeof(buff)-1),
2653     archive_read_data(a, buff, (sizeof(buff)-1)));
2654   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2655                         "Transitional//EN\">\n", buff);
2656 
2657   test_read_format_rar_multivolume_uncompressed_files_helper(a);
2658 
2659   /*
2660    * Fourth header.
2661    */
2662   assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
2663   assertEqualStringA(a, "testdir/LibarchiveAddingTest.html",
2664                      archive_entry_pathname(ae));
2665   assertA((int)archive_entry_mtime(ae));
2666   assertA((int)archive_entry_ctime(ae));
2667   assertA((int)archive_entry_atime(ae));
2668   assertEqualIntA(a, 20111, archive_entry_size(ae));
2669   assertEqualIntA(a, 33188, archive_entry_mode(ae));
2670   assertEqualInt(archive_entry_is_encrypted(ae), 0);
2671   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
2672 
2673   test_read_format_rar_multivolume_uncompressed_files_helper(a);
2674 
2675   /* Read from the beginning to the end of the file */
2676   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2677   do
2678   {
2679     memset(buff, 0, sizeof(buff));
2680     bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
2681   } while (bytes_read > 0);
2682 
2683   /* Seek to the end minus (sizeof(buff)-1) bytes */
2684   memset(buff, 0, sizeof(buff));
2685   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2686     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2687   assertEqualIntA(a, (sizeof(buff)-1),
2688     archive_read_data(a, buff, (sizeof(buff)-1)));
2689   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2690                         "</P>\n</BODY>\n</HTML>", buff);
2691 
2692   /* Seek back to the beginning */
2693   memset(buff, 0, sizeof(buff));
2694   assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
2695   assertEqualIntA(a, (sizeof(buff)-1),
2696     archive_read_data(a, buff, (sizeof(buff)-1)));
2697   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2698                         "Transitional//EN\">\n", buff);
2699 
2700   /* Test that SEEK_SET works correctly between data blocks */
2701   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2702   memset(buff, 0, sizeof(buff));
2703   assertEqualIntA(a, 5371,
2704     archive_seek_data(a, 5371, SEEK_SET));
2705   assertEqualIntA(a, (sizeof(buff)-1),
2706     archive_read_data(a, buff, (sizeof(buff)-1)));
2707   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2708                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2709 
2710   memset(buff, 0, sizeof(buff));
2711   assertEqualIntA(a, 13165,
2712     archive_seek_data(a, 13165, SEEK_SET));
2713   assertEqualIntA(a, (sizeof(buff)-1),
2714     archive_read_data(a, buff, (sizeof(buff)-1)));
2715   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2716                         "assertEqualMem to test equality", buff);
2717 
2718   memset(buff, 0, sizeof(buff));
2719   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2720     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2721   assertEqualIntA(a, (sizeof(buff)-1),
2722     archive_read_data(a, buff, (sizeof(buff)-1)));
2723   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2724                         "</P>\n</BODY>\n</HTML>", buff);
2725 
2726   memset(buff, 0, sizeof(buff));
2727   assertEqualIntA(a, 13165,
2728     archive_seek_data(a, 13165, SEEK_SET));
2729   assertEqualIntA(a, (sizeof(buff)-1),
2730     archive_read_data(a, buff, (sizeof(buff)-1)));
2731   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2732                         "assertEqualMem to test equality", buff);
2733 
2734   memset(buff, 0, sizeof(buff));
2735   assertEqualIntA(a, 5371,
2736     archive_seek_data(a, 5371, SEEK_SET));
2737   assertEqualIntA(a, (sizeof(buff)-1),
2738     archive_read_data(a, buff, (sizeof(buff)-1)));
2739   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2740                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2741 
2742   memset(buff, 0, sizeof(buff));
2743   assertEqualIntA(a, 0,
2744     archive_seek_data(a, 0, SEEK_SET));
2745   assertEqualIntA(a, (sizeof(buff)-1),
2746     archive_read_data(a, buff, (sizeof(buff)-1)));
2747   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2748                         "Transitional//EN\">\n", buff);
2749 
2750   memset(buff, 0, sizeof(buff));
2751   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2752     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2753   assertEqualIntA(a, (sizeof(buff)-1),
2754     archive_read_data(a, buff, (sizeof(buff)-1)));
2755   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2756                         "</P>\n</BODY>\n</HTML>", buff);
2757 
2758   memset(buff, 0, sizeof(buff));
2759   assertEqualIntA(a, 5371,
2760     archive_seek_data(a, 5371, SEEK_SET));
2761   assertEqualIntA(a, (sizeof(buff)-1),
2762     archive_read_data(a, buff, (sizeof(buff)-1)));
2763   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2764                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2765 
2766   memset(buff, 0, sizeof(buff));
2767   assertEqualIntA(a, 13165,
2768     archive_seek_data(a, 13165, SEEK_SET));
2769   assertEqualIntA(a, (sizeof(buff)-1),
2770     archive_read_data(a, buff, (sizeof(buff)-1)));
2771   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2772                         "assertEqualMem to test equality", buff);
2773 
2774   memset(buff, 0, sizeof(buff));
2775   assertEqualIntA(a, 0,
2776     archive_seek_data(a, 0, SEEK_SET));
2777   assertEqualIntA(a, (sizeof(buff)-1),
2778     archive_read_data(a, buff, (sizeof(buff)-1)));
2779   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2780                         "Transitional//EN\">\n", buff);
2781 
2782   memset(buff, 0, sizeof(buff));
2783   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2784     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2785   assertEqualIntA(a, (sizeof(buff)-1),
2786     archive_read_data(a, buff, (sizeof(buff)-1)));
2787   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2788                         "</P>\n</BODY>\n</HTML>", buff);
2789 
2790   memset(buff, 0, sizeof(buff));
2791   assertEqualIntA(a, 0,
2792     archive_seek_data(a, 0, SEEK_SET));
2793   assertEqualIntA(a, (sizeof(buff)-1),
2794     archive_read_data(a, buff, (sizeof(buff)-1)));
2795   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2796                         "Transitional//EN\">\n", buff);
2797 
2798   memset(buff, 0, sizeof(buff));
2799   assertEqualIntA(a, 13165,
2800     archive_seek_data(a, 13165, SEEK_SET));
2801   assertEqualIntA(a, (sizeof(buff)-1),
2802     archive_read_data(a, buff, (sizeof(buff)-1)));
2803   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2804                         "assertEqualMem to test equality", buff);
2805 
2806   memset(buff, 0, sizeof(buff));
2807   assertEqualIntA(a, 5371,
2808     archive_seek_data(a, 5371, SEEK_SET));
2809   assertEqualIntA(a, (sizeof(buff)-1),
2810     archive_read_data(a, buff, (sizeof(buff)-1)));
2811   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2812                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2813 
2814   /* Test that SEEK_CUR works correctly between data blocks */
2815   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2816   memset(buff, 0, sizeof(buff));
2817   assertEqualIntA(a, 5371,
2818     archive_seek_data(a, 5371, SEEK_CUR));
2819   assertEqualIntA(a, (sizeof(buff)-1),
2820     archive_read_data(a, buff, (sizeof(buff)-1)));
2821   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2822                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2823 
2824   memset(buff, 0, sizeof(buff));
2825   assertEqualIntA(a, 13165,
2826     archive_seek_data(a, 7731, SEEK_CUR));
2827   assertEqualIntA(a, (sizeof(buff)-1),
2828     archive_read_data(a, buff, (sizeof(buff)-1)));
2829   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2830                         "assertEqualMem to test equality", buff);
2831 
2832   memset(buff, 0, sizeof(buff));
2833   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2834     archive_seek_data(a, 6820, SEEK_CUR));
2835   assertEqualIntA(a, (sizeof(buff)-1),
2836     archive_read_data(a, buff, (sizeof(buff)-1)));
2837   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2838                         "</P>\n</BODY>\n</HTML>", buff);
2839 
2840   memset(buff, 0, sizeof(buff));
2841   assertEqualIntA(a, 13165,
2842     archive_seek_data(a, -6946, SEEK_CUR));
2843   assertEqualIntA(a, (sizeof(buff)-1),
2844     archive_read_data(a, buff, (sizeof(buff)-1)));
2845   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2846                         "assertEqualMem to test equality", buff);
2847 
2848   memset(buff, 0, sizeof(buff));
2849   assertEqualIntA(a, 5371,
2850     archive_seek_data(a, -7857, SEEK_CUR));
2851   assertEqualIntA(a, (sizeof(buff)-1),
2852     archive_read_data(a, buff, (sizeof(buff)-1)));
2853   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2854                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2855 
2856   memset(buff, 0, sizeof(buff));
2857   assertEqualIntA(a, 0,
2858     archive_seek_data(a, -5434, SEEK_CUR));
2859   assertEqualIntA(a, (sizeof(buff)-1),
2860     archive_read_data(a, buff, (sizeof(buff)-1)));
2861   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2862                         "Transitional//EN\">\n", buff);
2863 
2864   memset(buff, 0, sizeof(buff));
2865   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2866     archive_seek_data(a, 19985, SEEK_CUR));
2867   assertEqualIntA(a, (sizeof(buff)-1),
2868     archive_read_data(a, buff, (sizeof(buff)-1)));
2869   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2870                         "</P>\n</BODY>\n</HTML>", buff);
2871 
2872   memset(buff, 0, sizeof(buff));
2873   assertEqualIntA(a, 5371,
2874     archive_seek_data(a, -14740, SEEK_CUR));
2875   assertEqualIntA(a, (sizeof(buff)-1),
2876     archive_read_data(a, buff, (sizeof(buff)-1)));
2877   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2878                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2879 
2880   memset(buff, 0, sizeof(buff));
2881   assertEqualIntA(a, 13165,
2882     archive_seek_data(a, 7731, SEEK_CUR));
2883   assertEqualIntA(a, (sizeof(buff)-1),
2884     archive_read_data(a, buff, (sizeof(buff)-1)));
2885   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2886                         "assertEqualMem to test equality", buff);
2887 
2888   memset(buff, 0, sizeof(buff));
2889   assertEqualIntA(a, 0,
2890     archive_seek_data(a, -13228, SEEK_CUR));
2891   assertEqualIntA(a, (sizeof(buff)-1),
2892     archive_read_data(a, buff, (sizeof(buff)-1)));
2893   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2894                         "Transitional//EN\">\n", buff);
2895 
2896   memset(buff, 0, sizeof(buff));
2897   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2898     archive_seek_data(a, 19985, SEEK_CUR));
2899   assertEqualIntA(a, (sizeof(buff)-1),
2900     archive_read_data(a, buff, (sizeof(buff)-1)));
2901   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2902                         "</P>\n</BODY>\n</HTML>", buff);
2903 
2904   memset(buff, 0, sizeof(buff));
2905   assertEqualIntA(a, 0,
2906     archive_seek_data(a, -20111, SEEK_CUR));
2907   assertEqualIntA(a, (sizeof(buff)-1),
2908     archive_read_data(a, buff, (sizeof(buff)-1)));
2909   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2910                         "Transitional//EN\">\n", buff);
2911 
2912   memset(buff, 0, sizeof(buff));
2913   assertEqualIntA(a, 13165,
2914     archive_seek_data(a, 13102, SEEK_CUR));
2915   assertEqualIntA(a, (sizeof(buff)-1),
2916     archive_read_data(a, buff, (sizeof(buff)-1)));
2917   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2918                         "assertEqualMem to test equality", buff);
2919 
2920   memset(buff, 0, sizeof(buff));
2921   assertEqualIntA(a, 5371,
2922     archive_seek_data(a, -7857, SEEK_CUR));
2923   assertEqualIntA(a, (sizeof(buff)-1),
2924     archive_read_data(a, buff, (sizeof(buff)-1)));
2925   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2926                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2927 
2928   /* Test that SEEK_END works correctly between data blocks */
2929   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2930   memset(buff, 0, sizeof(buff));
2931   assertEqualIntA(a, 5371,
2932     archive_seek_data(a, -14740, SEEK_END));
2933   assertEqualIntA(a, (sizeof(buff)-1),
2934     archive_read_data(a, buff, (sizeof(buff)-1)));
2935   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2936                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2937 
2938   memset(buff, 0, sizeof(buff));
2939   assertEqualIntA(a, 13165,
2940     archive_seek_data(a, -6946, SEEK_END));
2941   assertEqualIntA(a, (sizeof(buff)-1),
2942     archive_read_data(a, buff, (sizeof(buff)-1)));
2943   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2944                         "assertEqualMem to test equality", buff);
2945 
2946   memset(buff, 0, sizeof(buff));
2947   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2948     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2949   assertEqualIntA(a, (sizeof(buff)-1),
2950     archive_read_data(a, buff, (sizeof(buff)-1)));
2951   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2952                         "</P>\n</BODY>\n</HTML>", buff);
2953 
2954   memset(buff, 0, sizeof(buff));
2955   assertEqualIntA(a, 13165,
2956     archive_seek_data(a, -6946, SEEK_END));
2957   assertEqualIntA(a, (sizeof(buff)-1),
2958     archive_read_data(a, buff, (sizeof(buff)-1)));
2959   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2960                         "assertEqualMem to test equality", buff);
2961 
2962   memset(buff, 0, sizeof(buff));
2963   assertEqualIntA(a, 5371,
2964     archive_seek_data(a, -14740, SEEK_END));
2965   assertEqualIntA(a, (sizeof(buff)-1),
2966     archive_read_data(a, buff, (sizeof(buff)-1)));
2967   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2968                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2969 
2970   memset(buff, 0, sizeof(buff));
2971   assertEqualIntA(a, 0,
2972     archive_seek_data(a, -20111, SEEK_END));
2973   assertEqualIntA(a, (sizeof(buff)-1),
2974     archive_read_data(a, buff, (sizeof(buff)-1)));
2975   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2976                         "Transitional//EN\">\n", buff);
2977 
2978   memset(buff, 0, sizeof(buff));
2979   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2980     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2981   assertEqualIntA(a, (sizeof(buff)-1),
2982     archive_read_data(a, buff, (sizeof(buff)-1)));
2983   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2984                         "</P>\n</BODY>\n</HTML>", buff);
2985 
2986   memset(buff, 0, sizeof(buff));
2987   assertEqualIntA(a, 5371,
2988     archive_seek_data(a, -14740, SEEK_END));
2989   assertEqualIntA(a, (sizeof(buff)-1),
2990     archive_read_data(a, buff, (sizeof(buff)-1)));
2991   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2992                         "/* ... setup omitted ... */\n&nbsp; ", buff);
2993 
2994   memset(buff, 0, sizeof(buff));
2995   assertEqualIntA(a, 13165,
2996     archive_seek_data(a, -6946, SEEK_END));
2997   assertEqualIntA(a, (sizeof(buff)-1),
2998     archive_read_data(a, buff, (sizeof(buff)-1)));
2999   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
3000                         "assertEqualMem to test equality", buff);
3001 
3002   memset(buff, 0, sizeof(buff));
3003   assertEqualIntA(a, 0,
3004     archive_seek_data(a, -20111, SEEK_END));
3005   assertEqualIntA(a, (sizeof(buff)-1),
3006     archive_read_data(a, buff, (sizeof(buff)-1)));
3007   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3008                         "Transitional//EN\">\n", buff);
3009 
3010   memset(buff, 0, sizeof(buff));
3011   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3012     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3013   assertEqualIntA(a, (sizeof(buff)-1),
3014     archive_read_data(a, buff, (sizeof(buff)-1)));
3015   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3016                         "</P>\n</BODY>\n</HTML>", buff);
3017 
3018   memset(buff, 0, sizeof(buff));
3019   assertEqualIntA(a, 0,
3020     archive_seek_data(a, -20111, SEEK_END));
3021   assertEqualIntA(a, (sizeof(buff)-1),
3022     archive_read_data(a, buff, (sizeof(buff)-1)));
3023   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3024                         "Transitional//EN\">\n", buff);
3025 
3026   memset(buff, 0, sizeof(buff));
3027   assertEqualIntA(a, 13165,
3028     archive_seek_data(a, -6946, SEEK_END));
3029   assertEqualIntA(a, (sizeof(buff)-1),
3030     archive_read_data(a, buff, (sizeof(buff)-1)));
3031   assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
3032                         "assertEqualMem to test equality", buff);
3033 
3034   memset(buff, 0, sizeof(buff));
3035   assertEqualIntA(a, 5371,
3036     archive_seek_data(a, -14740, SEEK_END));
3037   assertEqualIntA(a, (sizeof(buff)-1),
3038     archive_read_data(a, buff, (sizeof(buff)-1)));
3039   assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
3040                         "/* ... setup omitted ... */\n&nbsp; ", buff);
3041 
3042   test_read_format_rar_multivolume_uncompressed_files_helper(a);
3043 
3044   /*
3045    * Fifth header.
3046    */
3047   assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
3048   assertEqualStringA(a, "testdir/testsubdir/LibarchiveAddingTest.html",
3049                      archive_entry_pathname(ae));
3050   assertA((int)archive_entry_mtime(ae));
3051   assertA((int)archive_entry_ctime(ae));
3052   assertA((int)archive_entry_atime(ae));
3053   assertEqualIntA(a, 20111, archive_entry_size(ae));
3054   assertEqualIntA(a, 33188, archive_entry_mode(ae));
3055   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3056   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3057 
3058   test_read_format_rar_multivolume_uncompressed_files_helper(a);
3059 
3060   /* Read from the beginning to the end of the file */
3061   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3062   do
3063   {
3064     memset(buff, 0, sizeof(buff));
3065     bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
3066   } while (bytes_read > 0);
3067 
3068   /* Seek to the end minus (sizeof(buff)-1) bytes */
3069   memset(buff, 0, sizeof(buff));
3070   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3071     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3072   assertEqualIntA(a, (sizeof(buff)-1),
3073     archive_read_data(a, buff, (sizeof(buff)-1)));
3074   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3075                         "</P>\n</BODY>\n</HTML>", buff);
3076 
3077   /* Seek back to the beginning */
3078   memset(buff, 0, sizeof(buff));
3079   assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
3080   assertEqualIntA(a, (sizeof(buff)-1),
3081     archive_read_data(a, buff, (sizeof(buff)-1)));
3082   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3083                         "Transitional//EN\">\n", buff);
3084 
3085   /* Test that SEEK_SET works correctly between data blocks */
3086   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3087   memset(buff, 0, sizeof(buff));
3088   assertEqualIntA(a, 11568,
3089     archive_seek_data(a, 11568, SEEK_SET));
3090   assertEqualIntA(a, (sizeof(buff)-1),
3091     archive_read_data(a, buff, (sizeof(buff)-1)));
3092   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3093                         "\n\t<TT CLASS=\"west", buff);
3094 
3095   memset(buff, 0, sizeof(buff));
3096   assertEqualIntA(a, 0,
3097     archive_seek_data(a, 0, SEEK_SET));
3098   assertEqualIntA(a, (sizeof(buff)-1),
3099     archive_read_data(a, buff, (sizeof(buff)-1)));
3100   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3101                         "Transitional//EN\">\n", buff);
3102 
3103   memset(buff, 0, sizeof(buff));
3104   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3105     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3106   assertEqualIntA(a, (sizeof(buff)-1),
3107     archive_read_data(a, buff, (sizeof(buff)-1)));
3108   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3109                         "</P>\n</BODY>\n</HTML>", buff);
3110 
3111   memset(buff, 0, sizeof(buff));
3112   assertEqualIntA(a, 11568,
3113     archive_seek_data(a, 11568, SEEK_SET));
3114   assertEqualIntA(a, (sizeof(buff)-1),
3115     archive_read_data(a, buff, (sizeof(buff)-1)));
3116   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3117                         "\n\t<TT CLASS=\"west", buff);
3118 
3119   memset(buff, 0, sizeof(buff));
3120   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3121     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3122   assertEqualIntA(a, (sizeof(buff)-1),
3123     archive_read_data(a, buff, (sizeof(buff)-1)));
3124   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3125                         "</P>\n</BODY>\n</HTML>", buff);
3126 
3127   memset(buff, 0, sizeof(buff));
3128   assertEqualIntA(a, 0,
3129     archive_seek_data(a, 0, SEEK_SET));
3130   assertEqualIntA(a, (sizeof(buff)-1),
3131     archive_read_data(a, buff, (sizeof(buff)-1)));
3132   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3133                         "Transitional//EN\">\n", buff);
3134 
3135   memset(buff, 0, sizeof(buff));
3136   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3137     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3138   assertEqualIntA(a, (sizeof(buff)-1),
3139     archive_read_data(a, buff, (sizeof(buff)-1)));
3140   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3141                         "</P>\n</BODY>\n</HTML>", buff);
3142 
3143   memset(buff, 0, sizeof(buff));
3144   assertEqualIntA(a, 11568,
3145     archive_seek_data(a, 11568, SEEK_SET));
3146   assertEqualIntA(a, (sizeof(buff)-1),
3147     archive_read_data(a, buff, (sizeof(buff)-1)));
3148   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3149                         "\n\t<TT CLASS=\"west", buff);
3150 
3151   memset(buff, 0, sizeof(buff));
3152   assertEqualIntA(a, 0,
3153     archive_seek_data(a, 0, SEEK_SET));
3154   assertEqualIntA(a, (sizeof(buff)-1),
3155     archive_read_data(a, buff, (sizeof(buff)-1)));
3156   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3157                         "Transitional//EN\">\n", buff);
3158 
3159   /* Test that SEEK_CUR works correctly between data blocks */
3160   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3161   memset(buff, 0, sizeof(buff));
3162   assertEqualIntA(a, 11568,
3163     archive_seek_data(a, 11568, SEEK_CUR));
3164   assertEqualIntA(a, (sizeof(buff)-1),
3165     archive_read_data(a, buff, (sizeof(buff)-1)));
3166   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3167                         "\n\t<TT CLASS=\"west", buff);
3168 
3169   memset(buff, 0, sizeof(buff));
3170   assertEqualIntA(a, 0,
3171     archive_seek_data(a, -11631, SEEK_CUR));
3172   assertEqualIntA(a, (sizeof(buff)-1),
3173     archive_read_data(a, buff, (sizeof(buff)-1)));
3174   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3175                         "Transitional//EN\">\n", buff);
3176 
3177   memset(buff, 0, sizeof(buff));
3178   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3179     archive_seek_data(a, 19985, SEEK_CUR));
3180   assertEqualIntA(a, (sizeof(buff)-1),
3181     archive_read_data(a, buff, (sizeof(buff)-1)));
3182   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3183                         "</P>\n</BODY>\n</HTML>", buff);
3184 
3185   memset(buff, 0, sizeof(buff));
3186   assertEqualIntA(a, 11568,
3187     archive_seek_data(a, -8543, SEEK_CUR));
3188   assertEqualIntA(a, (sizeof(buff)-1),
3189     archive_read_data(a, buff, (sizeof(buff)-1)));
3190   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3191                         "\n\t<TT CLASS=\"west", buff);
3192 
3193   memset(buff, 0, sizeof(buff));
3194   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3195     archive_seek_data(a, 8417, SEEK_CUR));
3196   assertEqualIntA(a, (sizeof(buff)-1),
3197     archive_read_data(a, buff, (sizeof(buff)-1)));
3198   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3199                         "</P>\n</BODY>\n</HTML>", buff);
3200 
3201   memset(buff, 0, sizeof(buff));
3202   assertEqualIntA(a, 0,
3203     archive_seek_data(a, -20111, SEEK_CUR));
3204   assertEqualIntA(a, (sizeof(buff)-1),
3205     archive_read_data(a, buff, (sizeof(buff)-1)));
3206   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3207                         "Transitional//EN\">\n", buff);
3208 
3209   memset(buff, 0, sizeof(buff));
3210   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3211     archive_seek_data(a, 19985, SEEK_CUR));
3212   assertEqualIntA(a, (sizeof(buff)-1),
3213     archive_read_data(a, buff, (sizeof(buff)-1)));
3214   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3215                         "</P>\n</BODY>\n</HTML>", buff);
3216 
3217   memset(buff, 0, sizeof(buff));
3218   assertEqualIntA(a, 11568,
3219     archive_seek_data(a, -8543, SEEK_CUR));
3220   assertEqualIntA(a, (sizeof(buff)-1),
3221     archive_read_data(a, buff, (sizeof(buff)-1)));
3222   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3223                         "\n\t<TT CLASS=\"west", buff);
3224 
3225   memset(buff, 0, sizeof(buff));
3226   assertEqualIntA(a, 0,
3227     archive_seek_data(a, -11631, SEEK_CUR));
3228   assertEqualIntA(a, (sizeof(buff)-1),
3229     archive_read_data(a, buff, (sizeof(buff)-1)));
3230   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3231                         "Transitional//EN\">\n", buff);
3232 
3233   /* Test that SEEK_END works correctly between data blocks */
3234   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3235   memset(buff, 0, sizeof(buff));
3236   assertEqualIntA(a, 11568,
3237     archive_seek_data(a, -8543, SEEK_END));
3238   assertEqualIntA(a, (sizeof(buff)-1),
3239     archive_read_data(a, buff, (sizeof(buff)-1)));
3240   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3241                         "\n\t<TT CLASS=\"west", buff);
3242 
3243   memset(buff, 0, sizeof(buff));
3244   assertEqualIntA(a, 0,
3245     archive_seek_data(a, -20111, SEEK_END));
3246   assertEqualIntA(a, (sizeof(buff)-1),
3247     archive_read_data(a, buff, (sizeof(buff)-1)));
3248   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3249                         "Transitional//EN\">\n", buff);
3250 
3251   memset(buff, 0, sizeof(buff));
3252   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3253     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3254   assertEqualIntA(a, (sizeof(buff)-1),
3255     archive_read_data(a, buff, (sizeof(buff)-1)));
3256   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3257                         "</P>\n</BODY>\n</HTML>", buff);
3258 
3259   memset(buff, 0, sizeof(buff));
3260   assertEqualIntA(a, 11568,
3261     archive_seek_data(a, -8543, SEEK_END));
3262   assertEqualIntA(a, (sizeof(buff)-1),
3263     archive_read_data(a, buff, (sizeof(buff)-1)));
3264   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3265                         "\n\t<TT CLASS=\"west", buff);
3266 
3267   memset(buff, 0, sizeof(buff));
3268   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3269     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3270   assertEqualIntA(a, (sizeof(buff)-1),
3271     archive_read_data(a, buff, (sizeof(buff)-1)));
3272   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3273                         "</P>\n</BODY>\n</HTML>", buff);
3274 
3275   memset(buff, 0, sizeof(buff));
3276   assertEqualIntA(a, 0,
3277     archive_seek_data(a, -20111, SEEK_END));
3278   assertEqualIntA(a, (sizeof(buff)-1),
3279     archive_read_data(a, buff, (sizeof(buff)-1)));
3280   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3281                         "Transitional//EN\">\n", buff);
3282 
3283   memset(buff, 0, sizeof(buff));
3284   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3285     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3286   assertEqualIntA(a, (sizeof(buff)-1),
3287     archive_read_data(a, buff, (sizeof(buff)-1)));
3288   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3289                         "</P>\n</BODY>\n</HTML>", buff);
3290 
3291   memset(buff, 0, sizeof(buff));
3292   assertEqualIntA(a, 11568,
3293     archive_seek_data(a, -8543, SEEK_END));
3294   assertEqualIntA(a, (sizeof(buff)-1),
3295     archive_read_data(a, buff, (sizeof(buff)-1)));
3296   assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3297                         "\n\t<TT CLASS=\"west", buff);
3298 
3299   memset(buff, 0, sizeof(buff));
3300   assertEqualIntA(a, 0,
3301     archive_seek_data(a, -20111, SEEK_END));
3302   assertEqualIntA(a, (sizeof(buff)-1),
3303     archive_read_data(a, buff, (sizeof(buff)-1)));
3304   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3305                         "Transitional//EN\">\n", buff);
3306 
3307   test_read_format_rar_multivolume_uncompressed_files_helper(a);
3308 
3309   /*
3310    * Sixth header.
3311    */
3312   assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
3313   assertEqualStringA(a, "LibarchiveAddingTest.html",
3314                      archive_entry_pathname(ae));
3315   assertA((int)archive_entry_mtime(ae));
3316   assertA((int)archive_entry_ctime(ae));
3317   assertA((int)archive_entry_atime(ae));
3318   assertEqualIntA(a, 20111, archive_entry_size(ae));
3319   assertEqualIntA(a, 33188, archive_entry_mode(ae));
3320   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3321   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3322 
3323   test_read_format_rar_multivolume_uncompressed_files_helper(a);
3324 
3325   /* Read from the beginning to the end of the file */
3326   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3327   do
3328   {
3329     memset(buff, 0, sizeof(buff));
3330     bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
3331   } while (bytes_read > 0);
3332 
3333   /* Seek to the end minus (sizeof(buff)-1) bytes */
3334   memset(buff, 0, sizeof(buff));
3335   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3336     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3337   assertEqualIntA(a, (sizeof(buff)-1),
3338     archive_read_data(a, buff, (sizeof(buff)-1)));
3339   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3340                         "</P>\n</BODY>\n</HTML>", buff);
3341 
3342   /* Seek back to the beginning */
3343   memset(buff, 0, sizeof(buff));
3344   assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
3345   assertEqualIntA(a, (sizeof(buff)-1),
3346     archive_read_data(a, buff, (sizeof(buff)-1)));
3347   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3348                         "Transitional//EN\">\n", buff);
3349 
3350   /* Test that SEEK_SET works correctly between data blocks */
3351   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3352   memset(buff, 0, sizeof(buff));
3353   assertEqualIntA(a, 4576,
3354     archive_seek_data(a, 4576, SEEK_SET));
3355   assertEqualIntA(a, (sizeof(buff)-1),
3356     archive_read_data(a, buff, (sizeof(buff)-1)));
3357   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3358                         "NAME=\"Basic_test", buff);
3359 
3360   memset(buff, 0, sizeof(buff));
3361   assertEqualIntA(a, 17749,
3362     archive_seek_data(a, 17749, SEEK_SET));
3363   assertEqualIntA(a, (sizeof(buff)-1),
3364     archive_read_data(a, buff, (sizeof(buff)-1)));
3365   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3366                         "large tar tester attempts to", buff);
3367 
3368   memset(buff, 0, sizeof(buff));
3369   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3370     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3371   assertEqualIntA(a, (sizeof(buff)-1),
3372     archive_read_data(a, buff, (sizeof(buff)-1)));
3373   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3374                         "</P>\n</BODY>\n</HTML>", buff);
3375 
3376   memset(buff, 0, sizeof(buff));
3377   assertEqualIntA(a, 17749,
3378     archive_seek_data(a, 17749, SEEK_SET));
3379   assertEqualIntA(a, (sizeof(buff)-1),
3380     archive_read_data(a, buff, (sizeof(buff)-1)));
3381   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3382                         "large tar tester attempts to", buff);
3383 
3384   memset(buff, 0, sizeof(buff));
3385   assertEqualIntA(a, 4576,
3386     archive_seek_data(a, 4576, SEEK_SET));
3387   assertEqualIntA(a, (sizeof(buff)-1),
3388     archive_read_data(a, buff, (sizeof(buff)-1)));
3389   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3390                         "NAME=\"Basic_test", buff);
3391 
3392   memset(buff, 0, sizeof(buff));
3393   assertEqualIntA(a, 0,
3394     archive_seek_data(a, 0, SEEK_SET));
3395   assertEqualIntA(a, (sizeof(buff)-1),
3396     archive_read_data(a, buff, (sizeof(buff)-1)));
3397   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3398                         "Transitional//EN\">\n", buff);
3399 
3400   memset(buff, 0, sizeof(buff));
3401   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3402     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3403   assertEqualIntA(a, (sizeof(buff)-1),
3404     archive_read_data(a, buff, (sizeof(buff)-1)));
3405   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3406                         "</P>\n</BODY>\n</HTML>", buff);
3407 
3408   memset(buff, 0, sizeof(buff));
3409   assertEqualIntA(a, 4576,
3410     archive_seek_data(a, 4576, SEEK_SET));
3411   assertEqualIntA(a, (sizeof(buff)-1),
3412     archive_read_data(a, buff, (sizeof(buff)-1)));
3413   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3414                         "NAME=\"Basic_test", buff);
3415 
3416   memset(buff, 0, sizeof(buff));
3417   assertEqualIntA(a, 17749,
3418     archive_seek_data(a, 17749, SEEK_SET));
3419   assertEqualIntA(a, (sizeof(buff)-1),
3420     archive_read_data(a, buff, (sizeof(buff)-1)));
3421   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3422                         "large tar tester attempts to", buff);
3423 
3424   memset(buff, 0, sizeof(buff));
3425   assertEqualIntA(a, 0,
3426     archive_seek_data(a, 0, SEEK_SET));
3427   assertEqualIntA(a, (sizeof(buff)-1),
3428     archive_read_data(a, buff, (sizeof(buff)-1)));
3429   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3430                         "Transitional//EN\">\n", buff);
3431 
3432   memset(buff, 0, sizeof(buff));
3433   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3434     archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3435   assertEqualIntA(a, (sizeof(buff)-1),
3436     archive_read_data(a, buff, (sizeof(buff)-1)));
3437   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3438                         "</P>\n</BODY>\n</HTML>", buff);
3439 
3440   memset(buff, 0, sizeof(buff));
3441   assertEqualIntA(a, 0,
3442     archive_seek_data(a, 0, SEEK_SET));
3443   assertEqualIntA(a, (sizeof(buff)-1),
3444     archive_read_data(a, buff, (sizeof(buff)-1)));
3445   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3446                         "Transitional//EN\">\n", buff);
3447 
3448   memset(buff, 0, sizeof(buff));
3449   assertEqualIntA(a, 17749,
3450     archive_seek_data(a, 17749, SEEK_SET));
3451   assertEqualIntA(a, (sizeof(buff)-1),
3452     archive_read_data(a, buff, (sizeof(buff)-1)));
3453   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3454                         "large tar tester attempts to", buff);
3455 
3456   memset(buff, 0, sizeof(buff));
3457   assertEqualIntA(a, 4576,
3458     archive_seek_data(a, 4576, SEEK_SET));
3459   assertEqualIntA(a, (sizeof(buff)-1),
3460     archive_read_data(a, buff, (sizeof(buff)-1)));
3461   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3462                         "NAME=\"Basic_test", buff);
3463 
3464   /* Test that SEEK_CUR works correctly between data blocks */
3465   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3466   memset(buff, 0, sizeof(buff));
3467   assertEqualIntA(a, 4576,
3468     archive_seek_data(a, 4576, SEEK_CUR));
3469   assertEqualIntA(a, (sizeof(buff)-1),
3470     archive_read_data(a, buff, (sizeof(buff)-1)));
3471   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3472                         "NAME=\"Basic_test", buff);
3473 
3474   memset(buff, 0, sizeof(buff));
3475   assertEqualIntA(a, 17749,
3476     archive_seek_data(a, 13110, SEEK_CUR));
3477   assertEqualIntA(a, (sizeof(buff)-1),
3478     archive_read_data(a, buff, (sizeof(buff)-1)));
3479   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3480                         "large tar tester attempts to", buff);
3481 
3482   memset(buff, 0, sizeof(buff));
3483   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3484     archive_seek_data(a, 2236, SEEK_CUR));
3485   assertEqualIntA(a, (sizeof(buff)-1),
3486     archive_read_data(a, buff, (sizeof(buff)-1)));
3487   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3488                         "</P>\n</BODY>\n</HTML>", buff);
3489 
3490   memset(buff, 0, sizeof(buff));
3491   assertEqualIntA(a, 17749,
3492     archive_seek_data(a, -2362, SEEK_CUR));
3493   assertEqualIntA(a, (sizeof(buff)-1),
3494     archive_read_data(a, buff, (sizeof(buff)-1)));
3495   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3496                         "large tar tester attempts to", buff);
3497 
3498   memset(buff, 0, sizeof(buff));
3499   assertEqualIntA(a, 4576,
3500     archive_seek_data(a, -13236, SEEK_CUR));
3501   assertEqualIntA(a, (sizeof(buff)-1),
3502     archive_read_data(a, buff, (sizeof(buff)-1)));
3503   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3504                         "NAME=\"Basic_test", buff);
3505 
3506   memset(buff, 0, sizeof(buff));
3507   assertEqualIntA(a, 0,
3508     archive_seek_data(a, -4639, SEEK_CUR));
3509   assertEqualIntA(a, (sizeof(buff)-1),
3510     archive_read_data(a, buff, (sizeof(buff)-1)));
3511   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3512                         "Transitional//EN\">\n", buff);
3513 
3514   memset(buff, 0, sizeof(buff));
3515   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3516     archive_seek_data(a, 19985, SEEK_CUR));
3517   assertEqualIntA(a, (sizeof(buff)-1),
3518     archive_read_data(a, buff, (sizeof(buff)-1)));
3519   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3520                         "</P>\n</BODY>\n</HTML>", buff);
3521 
3522   memset(buff, 0, sizeof(buff));
3523   assertEqualIntA(a, 4576,
3524     archive_seek_data(a, -15535, SEEK_CUR));
3525   assertEqualIntA(a, (sizeof(buff)-1),
3526     archive_read_data(a, buff, (sizeof(buff)-1)));
3527   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3528                         "NAME=\"Basic_test", buff);
3529 
3530   memset(buff, 0, sizeof(buff));
3531   assertEqualIntA(a, 17749,
3532     archive_seek_data(a, 13110, SEEK_CUR));
3533   assertEqualIntA(a, (sizeof(buff)-1),
3534     archive_read_data(a, buff, (sizeof(buff)-1)));
3535   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3536                         "large tar tester attempts to", buff);
3537 
3538   memset(buff, 0, sizeof(buff));
3539   assertEqualIntA(a, 0,
3540     archive_seek_data(a, -17812, SEEK_CUR));
3541   assertEqualIntA(a, (sizeof(buff)-1),
3542     archive_read_data(a, buff, (sizeof(buff)-1)));
3543   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3544                         "Transitional//EN\">\n", buff);
3545 
3546   memset(buff, 0, sizeof(buff));
3547   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3548     archive_seek_data(a, 19985, SEEK_CUR));
3549   assertEqualIntA(a, (sizeof(buff)-1),
3550     archive_read_data(a, buff, (sizeof(buff)-1)));
3551   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3552                         "</P>\n</BODY>\n</HTML>", buff);
3553 
3554   memset(buff, 0, sizeof(buff));
3555   assertEqualIntA(a, 0,
3556     archive_seek_data(a, -20111, SEEK_CUR));
3557   assertEqualIntA(a, (sizeof(buff)-1),
3558     archive_read_data(a, buff, (sizeof(buff)-1)));
3559   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3560                         "Transitional//EN\">\n", buff);
3561 
3562   memset(buff, 0, sizeof(buff));
3563   assertEqualIntA(a, 17749,
3564     archive_seek_data(a, 17686, SEEK_CUR));
3565   assertEqualIntA(a, (sizeof(buff)-1),
3566     archive_read_data(a, buff, (sizeof(buff)-1)));
3567   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3568                         "large tar tester attempts to", buff);
3569 
3570   memset(buff, 0, sizeof(buff));
3571   assertEqualIntA(a, 4576,
3572     archive_seek_data(a, -13236, SEEK_CUR));
3573   assertEqualIntA(a, (sizeof(buff)-1),
3574     archive_read_data(a, buff, (sizeof(buff)-1)));
3575   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3576                         "NAME=\"Basic_test", buff);
3577 
3578   /* Test that SEEK_END works correctly between data blocks */
3579   assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3580   memset(buff, 0, sizeof(buff));
3581   assertEqualIntA(a, 4576,
3582     archive_seek_data(a, -15535, SEEK_END));
3583   assertEqualIntA(a, (sizeof(buff)-1),
3584     archive_read_data(a, buff, (sizeof(buff)-1)));
3585   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3586                         "NAME=\"Basic_test", buff);
3587 
3588   memset(buff, 0, sizeof(buff));
3589   assertEqualIntA(a, 17749,
3590     archive_seek_data(a, -2362, SEEK_END));
3591   assertEqualIntA(a, (sizeof(buff)-1),
3592     archive_read_data(a, buff, (sizeof(buff)-1)));
3593   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3594                         "large tar tester attempts to", buff);
3595 
3596   memset(buff, 0, sizeof(buff));
3597   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3598     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3599   assertEqualIntA(a, (sizeof(buff)-1),
3600     archive_read_data(a, buff, (sizeof(buff)-1)));
3601   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3602                         "</P>\n</BODY>\n</HTML>", buff);
3603 
3604   memset(buff, 0, sizeof(buff));
3605   assertEqualIntA(a, 17749,
3606     archive_seek_data(a, -2362, SEEK_END));
3607   assertEqualIntA(a, (sizeof(buff)-1),
3608     archive_read_data(a, buff, (sizeof(buff)-1)));
3609   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3610                         "large tar tester attempts to", buff);
3611 
3612   memset(buff, 0, sizeof(buff));
3613   assertEqualIntA(a, 4576,
3614     archive_seek_data(a, -15535, SEEK_END));
3615   assertEqualIntA(a, (sizeof(buff)-1),
3616     archive_read_data(a, buff, (sizeof(buff)-1)));
3617   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3618                         "NAME=\"Basic_test", buff);
3619 
3620   memset(buff, 0, sizeof(buff));
3621   assertEqualIntA(a, 0,
3622     archive_seek_data(a, -20111, SEEK_END));
3623   assertEqualIntA(a, (sizeof(buff)-1),
3624     archive_read_data(a, buff, (sizeof(buff)-1)));
3625   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3626                         "Transitional//EN\">\n", buff);
3627 
3628   memset(buff, 0, sizeof(buff));
3629   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3630     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3631   assertEqualIntA(a, (sizeof(buff)-1),
3632     archive_read_data(a, buff, (sizeof(buff)-1)));
3633   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3634                         "</P>\n</BODY>\n</HTML>", buff);
3635 
3636   memset(buff, 0, sizeof(buff));
3637   assertEqualIntA(a, 4576,
3638     archive_seek_data(a, -15535, SEEK_END));
3639   assertEqualIntA(a, (sizeof(buff)-1),
3640     archive_read_data(a, buff, (sizeof(buff)-1)));
3641   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3642                         "NAME=\"Basic_test", buff);
3643 
3644   memset(buff, 0, sizeof(buff));
3645   assertEqualIntA(a, 17749,
3646     archive_seek_data(a, -2362, SEEK_END));
3647   assertEqualIntA(a, (sizeof(buff)-1),
3648     archive_read_data(a, buff, (sizeof(buff)-1)));
3649   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3650                         "large tar tester attempts to", buff);
3651 
3652   memset(buff, 0, sizeof(buff));
3653   assertEqualIntA(a, 0,
3654     archive_seek_data(a, -20111, SEEK_END));
3655   assertEqualIntA(a, (sizeof(buff)-1),
3656     archive_read_data(a, buff, (sizeof(buff)-1)));
3657   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3658                         "Transitional//EN\">\n", buff);
3659 
3660   memset(buff, 0, sizeof(buff));
3661   assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3662     archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3663   assertEqualIntA(a, (sizeof(buff)-1),
3664     archive_read_data(a, buff, (sizeof(buff)-1)));
3665   assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3666                         "</P>\n</BODY>\n</HTML>", buff);
3667 
3668   memset(buff, 0, sizeof(buff));
3669   assertEqualIntA(a, 0,
3670     archive_seek_data(a, -20111, SEEK_END));
3671   assertEqualIntA(a, (sizeof(buff)-1),
3672     archive_read_data(a, buff, (sizeof(buff)-1)));
3673   assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3674                         "Transitional//EN\">\n", buff);
3675 
3676   memset(buff, 0, sizeof(buff));
3677   assertEqualIntA(a, 17749,
3678     archive_seek_data(a, -2362, SEEK_END));
3679   assertEqualIntA(a, (sizeof(buff)-1),
3680     archive_read_data(a, buff, (sizeof(buff)-1)));
3681   assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3682                         "large tar tester attempts to", buff);
3683 
3684   memset(buff, 0, sizeof(buff));
3685   assertEqualIntA(a, 4576,
3686     archive_seek_data(a, -15535, SEEK_END));
3687   assertEqualIntA(a, (sizeof(buff)-1),
3688     archive_read_data(a, buff, (sizeof(buff)-1)));
3689   assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3690                         "NAME=\"Basic_test", buff);
3691 
3692   test_read_format_rar_multivolume_uncompressed_files_helper(a);
3693 
3694   /*
3695    * Seventh header.
3696    */
3697   assertA(0 == archive_read_next_header(a, &ae));
3698   assertEqualString("testdir/testsymlink5", archive_entry_pathname(ae));
3699   assertA((int)archive_entry_mtime(ae));
3700   assertA((int)archive_entry_ctime(ae));
3701   assertA((int)archive_entry_atime(ae));
3702   assertEqualInt(0, archive_entry_size(ae));
3703   assertEqualInt(41471, archive_entry_mode(ae));
3704   assertEqualString("testsubdir/LibarchiveAddingTest.html",
3705     archive_entry_symlink(ae));
3706   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3707   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3708   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3709 
3710   /*
3711    * Eighth header.
3712    */
3713   assertA(0 == archive_read_next_header(a, &ae));
3714   assertEqualString("testdir/testsymlink6", archive_entry_pathname(ae));
3715   assertA((int)archive_entry_mtime(ae));
3716   assertA((int)archive_entry_ctime(ae));
3717   assertA((int)archive_entry_atime(ae));
3718   assertEqualInt(0, archive_entry_size(ae));
3719   assertEqualInt(41471, archive_entry_mode(ae));
3720   assertEqualString("testsubdir/LibarchiveAddingTest2.html",
3721     archive_entry_symlink(ae));
3722   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3723   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3724   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3725 
3726   /*
3727    * Ninth header.
3728    */
3729   assertA(0 == archive_read_next_header(a, &ae));
3730   assertEqualString("testsymlink", archive_entry_pathname(ae));
3731   assertA((int)archive_entry_mtime(ae));
3732   assertA((int)archive_entry_ctime(ae));
3733   assertA((int)archive_entry_atime(ae));
3734   assertEqualInt(0, archive_entry_size(ae));
3735   assertEqualInt(41471, archive_entry_mode(ae));
3736   assertEqualString("testdir/LibarchiveAddingTest.html",
3737     archive_entry_symlink(ae));
3738   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3739   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3740   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3741 
3742   /*
3743    * Tenth header.
3744    */
3745   assertA(0 == archive_read_next_header(a, &ae));
3746   assertEqualString("testsymlink2", archive_entry_pathname(ae));
3747   assertA((int)archive_entry_mtime(ae));
3748   assertA((int)archive_entry_ctime(ae));
3749   assertA((int)archive_entry_atime(ae));
3750   assertEqualInt(0, archive_entry_size(ae));
3751   assertEqualInt(41471, archive_entry_mode(ae));
3752   assertEqualString("testdir/LibarchiveAddingTest2.html",
3753     archive_entry_symlink(ae));
3754   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3755   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3756   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3757 
3758   /*
3759    * Eleventh header.
3760    */
3761   assertA(0 == archive_read_next_header(a, &ae));
3762   assertEqualString("testsymlink3", archive_entry_pathname(ae));
3763   assertA((int)archive_entry_mtime(ae));
3764   assertA((int)archive_entry_ctime(ae));
3765   assertA((int)archive_entry_atime(ae));
3766   assertEqualInt(0, archive_entry_size(ae));
3767   assertEqualInt(41471, archive_entry_mode(ae));
3768   assertEqualString("testdir/testsubdir/LibarchiveAddingTest.html",
3769     archive_entry_symlink(ae));
3770   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3771   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3772   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3773 
3774   /*
3775    * Twelfth header.
3776    */
3777   assertA(0 == archive_read_next_header(a, &ae));
3778   assertEqualString("testsymlink4", archive_entry_pathname(ae));
3779   assertA((int)archive_entry_mtime(ae));
3780   assertA((int)archive_entry_ctime(ae));
3781   assertA((int)archive_entry_atime(ae));
3782   assertEqualInt(0, archive_entry_size(ae));
3783   assertEqualInt(41471, archive_entry_mode(ae));
3784   assertEqualString("testdir/testsubdir/LibarchiveAddingTest2.html",
3785     archive_entry_symlink(ae));
3786   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3787   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3788   assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3789 
3790   /*
3791    * Thirteenth header.
3792    */
3793   assertA(0 == archive_read_next_header(a, &ae));
3794   assertEqualString("testdir/testemptysubdir", archive_entry_pathname(ae));
3795   assertA((int)archive_entry_mtime(ae));
3796   assertA((int)archive_entry_ctime(ae));
3797   assertA((int)archive_entry_atime(ae));
3798   assertEqualInt(0, archive_entry_size(ae));
3799   assertEqualInt(16877, archive_entry_mode(ae));
3800   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3801   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3802 
3803   /*
3804    * Fourteenth header.
3805    */
3806   assertA(0 == archive_read_next_header(a, &ae));
3807   assertEqualString("testdir/testsubdir", archive_entry_pathname(ae));
3808   assertA((int)archive_entry_mtime(ae));
3809   assertA((int)archive_entry_ctime(ae));
3810   assertA((int)archive_entry_atime(ae));
3811   assertEqualInt(0, archive_entry_size(ae));
3812   assertEqualInt(16877, archive_entry_mode(ae));
3813   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3814   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3815 
3816   /*
3817    * Fifteenth header.
3818    */
3819   assertA(0 == archive_read_next_header(a, &ae));
3820   assertEqualString("testdir", archive_entry_pathname(ae));
3821   assertA((int)archive_entry_mtime(ae));
3822   assertA((int)archive_entry_ctime(ae));
3823   assertA((int)archive_entry_atime(ae));
3824   assertEqualInt(0, archive_entry_size(ae));
3825   assertEqualInt(16877, archive_entry_mode(ae));
3826   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3827   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3828 
3829   /*
3830    * Sixteenth header.
3831    */
3832   assertA(0 == archive_read_next_header(a, &ae));
3833   assertEqualString("testemptydir", archive_entry_pathname(ae));
3834   assertA((int)archive_entry_mtime(ae));
3835   assertA((int)archive_entry_ctime(ae));
3836   assertA((int)archive_entry_atime(ae));
3837   assertEqualInt(0, archive_entry_size(ae));
3838   assertEqualInt(16877, archive_entry_mode(ae));
3839   assertEqualInt(archive_entry_is_encrypted(ae), 0);
3840   assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3841 
3842   /* Test EOF */
3843   assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
3844   assertEqualIntA(a, 16, archive_file_count(a));
3845   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3846   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
3847 }
3848 
DEFINE_TEST(test_read_format_rar_endarc_huge)3849 DEFINE_TEST(test_read_format_rar_endarc_huge)
3850 {
3851   const char* reffile = "test_read_format_rar_endarc_huge.rar";
3852 
3853   struct archive_entry *ae;
3854   struct archive *a;
3855 
3856   extract_reference_file(reffile);
3857   assert((a = archive_read_new()) != NULL);
3858   assertA(0 == archive_read_support_filter_all(a));
3859   assertA(0 == archive_read_support_format_all(a));
3860   assertA(0 == archive_read_open_filename(a, reffile, 10240));
3861 
3862   /* Test for truncation */
3863   assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae));
3864 
3865   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3866   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
3867 }
3868 
DEFINE_TEST(test_read_format_rar_ppmd_use_after_free)3869 DEFINE_TEST(test_read_format_rar_ppmd_use_after_free)
3870 {
3871   uint8_t buf[16];
3872   const char* reffile = "test_read_format_rar_ppmd_use_after_free.rar";
3873 
3874   struct archive_entry *ae;
3875   struct archive *a;
3876 
3877   extract_reference_file(reffile);
3878   assert((a = archive_read_new()) != NULL);
3879   assertA(0 == archive_read_support_filter_all(a));
3880   assertA(0 == archive_read_support_format_all(a));
3881   assertA(0 == archive_read_open_filename(a, reffile, 10240));
3882 
3883   assertA(ARCHIVE_OK == archive_read_next_header(a, &ae));
3884   assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
3885   assertA(ARCHIVE_OK == archive_read_next_header(a, &ae));
3886   assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
3887 
3888   /* Test for truncation */
3889   assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae));
3890 
3891   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3892   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
3893 }
3894 
DEFINE_TEST(test_read_format_rar_ppmd_use_after_free2)3895 DEFINE_TEST(test_read_format_rar_ppmd_use_after_free2)
3896 {
3897   uint8_t buf[16];
3898   const char* reffile = "test_read_format_rar_ppmd_use_after_free2.rar";
3899 
3900   struct archive_entry *ae;
3901   struct archive *a;
3902 
3903   extract_reference_file(reffile);
3904   assert((a = archive_read_new()) != NULL);
3905   assertA(0 == archive_read_support_filter_all(a));
3906   assertA(0 == archive_read_support_format_all(a));
3907   assertA(0 == archive_read_open_filename(a, reffile, 10240));
3908 
3909   assertA(ARCHIVE_OK == archive_read_next_header(a, &ae));
3910   assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
3911   assertA(ARCHIVE_OK == archive_read_next_header(a, &ae));
3912   assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
3913 
3914   /* Test EOF */
3915   assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae));
3916 
3917   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3918   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
3919 }
3920 
DEFINE_TEST(test_read_format_rar_seek_data_cursor0)3921 DEFINE_TEST(test_read_format_rar_seek_data_cursor0)
3922 {
3923   const char* reffile = "test_read_format_rar_seek_data_cursor0.rar";
3924 
3925   struct archive_entry *ae;
3926   struct archive *a;
3927 
3928   extract_reference_file(reffile);
3929   assert((a = archive_read_new()) != NULL);
3930   assertA(0 == archive_read_support_filter_all(a));
3931   assertA(0 == archive_read_support_format_all(a));
3932   assertA(0 == archive_read_open_filename(a, reffile, 10240));
3933 
3934   assertA(ARCHIVE_OK == archive_read_next_header(a, &ae));
3935 
3936   failure("RAR seek should reject an invalid cursor state");
3937   assert(archive_seek_data(a, -1, SEEK_END) < 0);
3938 
3939   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3940   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
3941 }
3942 
DEFINE_TEST(test_read_format_rar_newsub_huge)3943 DEFINE_TEST(test_read_format_rar_newsub_huge)
3944 {
3945 #if SIZE_MAX == UINT64_MAX
3946   skipping("not relevant on 64 bit platforms");
3947 #else
3948   const char* reffile = "test_read_format_rar_newsub_huge.rar";
3949 
3950   struct archive_entry *ae;
3951   struct archive *a;
3952 
3953   extract_reference_file(reffile);
3954   assert((a = archive_read_new()) != NULL);
3955   assertA(0 == archive_read_support_filter_all(a));
3956   assertA(0 == archive_read_support_format_all(a));
3957   assertA(0 == archive_read_open_filename(a, reffile, 10240));
3958 
3959   /* Test for truncation */
3960   assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae));
3961 
3962   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3963   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
3964 #endif
3965 }
3966 
DEFINE_TEST(test_read_format_rar_newsub_rr_over_1m)3967 DEFINE_TEST(test_read_format_rar_newsub_rr_over_1m)
3968 {
3969 	const char* reffile = "test_read_format_rar_newsub_rr_over_1m.rar";
3970 	struct archive_entry *ae;
3971 	struct archive *a;
3972 
3973 	extract_reference_file(reffile);
3974 	assert((a = archive_read_new()) != NULL);
3975 	assertA(0 == archive_read_support_filter_all(a));
3976 	assertA(0 == archive_read_support_format_rar(a));
3977 	assertA(0 == archive_read_open_filename(a, reffile, 10240));
3978 
3979 	failure("RAR NEWSUB RR records larger than 1 MiB should be skipped");
3980 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
3981 
3982 	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3983 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
3984 }
3985 
DEFINE_TEST(test_read_format_rar_newsub_huge64)3986 DEFINE_TEST(test_read_format_rar_newsub_huge64)
3987 {
3988   static const unsigned char archive[] = {
3989     'R', 'a', 'r', '!', 0x1a, 0x07, 0x00,
3990     0x23, 0x25, 0x7a, 0x00, 0x01, 0x28, 0x00,
3991     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3992     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3993     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3994     0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
3995     0x7f, 0x00, 0x00, 0x00, 0x00
3996   };
3997   struct archive_entry *ae;
3998   struct archive *a;
3999 
4000   assert((a = archive_read_new()) != NULL);
4001   assertA(0 == archive_read_support_filter_all(a));
4002   assertA(0 == archive_read_support_format_rar(a));
4003   assertA(0 == archive_read_open_memory(a, archive, sizeof(archive)));
4004 
4005   failure("Malformed RAR NEWSUB header should be rejected if its "
4006           "extended data is missing");
4007   assertEqualIntA(a, ARCHIVE_FATAL, archive_read_next_header(a, &ae));
4008   assertEqualString("Invalid RAR file: Cannot read extended header data",
4009                     archive_error_string(a));
4010 
4011   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
4012   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
4013 }
4014 
DEFINE_TEST(test_read_format_rar_symlink_huge)4015 DEFINE_TEST(test_read_format_rar_symlink_huge)
4016 {
4017 #if SIZE_MAX == UINT64_MAX
4018   skipping("not relevant on 64 bit platforms");
4019 #else
4020   const char* reffile = "test_read_format_rar_symlink_huge.rar";
4021 
4022   struct archive_entry *ae;
4023   struct archive *a;
4024 
4025   extract_reference_file(reffile);
4026   assert((a = archive_read_new()) != NULL);
4027   assertA(0 == archive_read_support_filter_all(a));
4028   assertA(0 == archive_read_support_format_all(a));
4029   assertA(0 == archive_read_open_filename(a, reffile, 10240));
4030 
4031   /* Test for invalid entry */
4032   assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae));
4033 
4034   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
4035   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
4036 #endif
4037 }
4038 
DEFINE_TEST(test_read_format_rar_unbound_staticdata)4039 DEFINE_TEST(test_read_format_rar_unbound_staticdata)
4040 {
4041   const char* reffile = "test_read_format_rar_unbound_staticdata.rar";
4042 
4043   struct archive_entry *ae;
4044   struct archive *a;
4045   char buf[64];
4046 
4047   extract_reference_file(reffile);
4048   assert((a = archive_read_new()) != NULL);
4049   assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
4050   assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
4051   assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, reffile, 1024));
4052 
4053   assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
4054   assertEqualIntA(a, ARCHIVE_FAILED, archive_read_data(a, buf, 64));
4055 
4056   assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
4057   assertEqualInt(ARCHIVE_OK, archive_read_free(a));
4058 }
4059