xref: /freebsd/contrib/libarchive/unzip/test/test_symlink.c (revision 185becb1e1bd2657c156f78aeb52edac05ba5fb5)
1 /*
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2026 Tobias Stoeckmann
5  * All rights reserved.
6  */
7 #include "test.h"
8 
9 /* Test symlinks */
DEFINE_TEST(test_symlink)10 DEFINE_TEST(test_symlink)
11 {
12 	const char *reffile1 = "test_symlink_1.zip";
13 	const char *reffile2 = "test_symlink_2.zip";
14 	int r;
15 
16 	if (!canSymlink()) {
17 		skipping("System cannot create symlinks.");
18 		return;
19 	}
20 
21 	assertUmask(0);
22 	extract_reference_file(reffile1);
23 	extract_reference_file(reffile2);
24 
25 	/* Extract first archive */
26 	r = systemf("%s %s >test.out 2>test.err", testprog, reffile1);
27 	assertEqualInt(0, r);
28 	assertNonEmptyFile("test.out");
29 	assertNonEmptyFile("test.err");
30 	assertIsDir("dir", 0755);
31 	assertIsSymlink("dlink", "dir", 1);
32 	assertIsReg("file.txt", 0644);
33 	assertIsSymlink("flink", "file.txt", 0);
34 	assertFileNotExists("link.insecure");
35 
36 	/* Create dangling symlinks by deleting targets */
37 	rmdir("dir");
38 	unlink("file.txt");
39 	assertFileNotExists("dir");
40 	assertFileNotExists("file.txt");
41 	assertIsSymlink("dlink", "dir", 1);
42 	assertIsSymlink("flink", "file.txt", 0);
43 
44 	/* Extract second archive, overwriting dangling symlinks */
45 	r = systemf("%s -o %s >test.out 2>test.err", testprog, reffile2);
46 	assertEqualInt(0, r);
47 	assertEmptyFile("test.out");
48 	assertEmptyFile("test.err");
49 	assertFileNotExists("dir");
50 	assertIsDir("dlink", 0755);
51 	assertTextFileContents("hello world\n", "dlink/file.txt");
52 	assertIsReg("flink", 0644);
53 }
54