Skip to content

Commit fe83fc3

Browse files
committed
Added test case for ustar directory handling
Based on test_compat_tar_hardlink.c and with input by Tim Kientzle.
1 parent 12d74cf commit fe83fc3

5 files changed

Lines changed: 135 additions & 0 deletions

File tree

Makefile.am

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ libarchive_test_SOURCES= \
414414
libarchive/test/test_compat_solaris_tar_acl.c \
415415
libarchive/test/test_compat_solaris_pax_sparse.c \
416416
libarchive/test/test_compat_star_acl.c \
417+
libarchive/test/test_compat_tar_directory.c \
417418
libarchive/test/test_compat_tar_hardlink.c \
418419
libarchive/test/test_compat_uudecode.c \
419420
libarchive/test/test_compat_uudecode_large.c \
@@ -695,6 +696,7 @@ libarchive_test_EXTRA_DIST=\
695696
libarchive/test/test_compat_solaris_tar_acl.tar.uu \
696697
libarchive/test/test_compat_star_acl_nfs4.tar.uu \
697698
libarchive/test/test_compat_star_acl_posix1e.tar.uu \
699+
libarchive/test/test_compat_tar_directory_1.tar.uu \
698700
libarchive/test/test_compat_tar_hardlink_1.tar.uu \
699701
libarchive/test/test_compat_uudecode_large.tar.Z.uu \
700702
libarchive/test/test_compat_xz_1.txz.uu \

libarchive/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ IF(ENABLE_TEST)
6363
test_compat_solaris_pax_sparse.c
6464
test_compat_solaris_tar_acl.c
6565
test_compat_star_acl.c
66+
test_compat_tar_directory.c
6667
test_compat_tar_hardlink.c
6768
test_compat_uudecode.c
6869
test_compat_uudecode_large.c
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*-
2+
* Copyright (c) 2021 Samanta Navarro
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions
7+
* are met:
8+
* 1. Redistributions of source code must retain the above copyright
9+
* notice, this list of conditions and the following disclaimer.
10+
* 2. Redistributions in binary form must reproduce the above copyright
11+
* notice, this list of conditions and the following disclaimer in the
12+
* documentation and/or other materials provided with the distribution.
13+
*
14+
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15+
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16+
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17+
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18+
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23+
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24+
*/
25+
#include "test.h"
26+
__FBSDID("$FreeBSD$");
27+
28+
/*
29+
* Background: Original tar file format did not use its linkflag to
30+
* specify directories. Instead regular files simply have a slash
31+
* appended to their names. No data blocks follow directories in
32+
* archives. This means that a possibly specified file size must not
33+
* be used to determine the amount of data blocks to skip.
34+
*/
35+
36+
static void
37+
test_compat_tar_directory_1(void)
38+
{
39+
char name[] = "test_compat_tar_directory_1.tar";
40+
struct archive_entry *ae;
41+
struct archive *a;
42+
43+
assert((a = archive_read_new()) != NULL);
44+
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
45+
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
46+
extract_reference_file(name);
47+
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
48+
49+
/* Read first entry, which is a directory in a regular file header. */
50+
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
51+
assertEqualString("directory1/", archive_entry_pathname(ae));
52+
assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
53+
assertEqualInt(1, archive_entry_size(ae));
54+
55+
/* Read second entry, which is a ustar directory entry. */
56+
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
57+
assertEqualString("directory2/", archive_entry_pathname(ae));
58+
assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
59+
assertEqualInt(0, archive_entry_size(ae));
60+
61+
/* Verify the end-of-archive. */
62+
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
63+
64+
/* Verify that the format detection worked. */
65+
assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE);
66+
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR);
67+
68+
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
69+
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
70+
}
71+
72+
DEFINE_TEST(test_compat_tar_directory)
73+
{
74+
test_compat_tar_directory_1();
75+
}
76+
77+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
$FreeBSD$
2+
begin 644 test_compat_tar_directory_1.tar
3+
M9&ER96-T;W)Y,2\`````````````````````````````````````````````
4+
M````````````````````````````````````````````````````````````
5+
M`````````````#`P,#`W,#``,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`P,#`Q
6+
M`#`P,#`P,#`P,#`P`#`P-C4Q-0`@````````````````````````````````
7+
M````````````````````````````````````````````````````````````
8+
M````````````````````````````````````````````````````````````
9+
M````````````````````````````````````````````````````````````
10+
M````````````````````````````````````````````````````````````
11+
M````````````````````````````````````````````````````````````
12+
M````````````````````````````````````````````````````````````
13+
M````````````````````````````````````````````````````````````
14+
M``````````````````````!D:7)E8W1O<GDR+P``````````````````````
15+
M````````````````````````````````````````````````````````````
16+
M````````````````````````````````````,#`P,#<P,``P,#`P,#`P`#`P
17+
M,#`P,#``,#`P,#`P,#`P,#``,#`P,#`P,#`P,#``,#`V-3$U`"``````````
18+
M````````````````````````````````````````````````````````````
19+
M````````````````````````````````````````````````````````````
20+
M````````````````````````````````````````````````````````````
21+
M````````````````````````````````````````````````````````````
22+
M````````````````````````````````````````````````````````````
23+
M````````````````````````````````````````````````````````````
24+
M````````````````````````````````````````````````````````````
25+
M````````````````````````````````````````````````````````````
26+
M````````````````````````````````````````````````````````````
27+
M````````````````````````````````````````````````````````````
28+
M````````````````````````````````````````````````````````````
29+
M````````````````````````````````````````````````````````````
30+
M````````````````````````````````````````````````````````````
31+
M````````````````````````````````````````````````````````````
32+
M````````````````````````````````````````````````````````````
33+
M````````````````````````````````````````````````````````````
34+
M````````````````````````````````````````````````````````````
35+
M````````````````````````````````````````````````````````````
36+
M````````````````````````````````````````````````````````````
37+
M````````````````````````````````````````````````````````````
38+
M````````````````````````````````````````````````````````````
39+
M````````````````````````````````````````````````````````````
40+
M````````````````````````````````````````````````````````````
41+
M````````````````````````````````````````````````````````````
42+
M````````````````````````````````````````````````````````````
43+
M````````````````````````````````````````````````````````````
44+
M````````````````````````````````````````````````````````````
45+
M````````````````````````````````````````````````````````````
46+
M````````````````````````````````````````````````````````````
47+
M````````````````````````````````````````````````````````````
48+
7````````````````````````````````
49+
`
50+
end

libarchive/test/test_fuzz.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,10 @@ DEFINE_TEST(test_fuzz_tar)
428428
NULL
429429
};
430430
#endif
431+
static const char *fileset11[] = {
432+
"test_compat_tar_directory_1.tar",
433+
NULL
434+
};
431435
static const struct files filesets[] = {
432436
{0, fileset1}, /* Exercise bzip2 decompressor. */
433437
{1, fileset1},
@@ -444,6 +448,7 @@ DEFINE_TEST(test_fuzz_tar)
444448
#if HAVE_ZSTD_H && HAVE_LIBZSTD
445449
{0, fileset10}, /* Exercise zstd decompressor. */
446450
#endif
451+
{0, fileset11},
447452
{1, NULL}
448453
};
449454
test_fuzz(filesets);

0 commit comments

Comments
 (0)