xref: /freebsd-src/contrib/libarchive/cpio/test/test_extract_cpio_absolute_paths.c (revision bd66c1b43e33540205dbc1187c2f2a15c58b57ba)
1*bd66c1b4SMartin Matuska /*-
2*bd66c1b4SMartin Matuska  * SPDX-License-Identifier: BSD-2-Clause
3*bd66c1b4SMartin Matuska  *
4*bd66c1b4SMartin Matuska  * Copyright (c) 2024 Mostyn Bramley-Moore <mostyn@antipode.se>
5*bd66c1b4SMartin Matuska  */
6*bd66c1b4SMartin Matuska 
7*bd66c1b4SMartin Matuska #include "test.h"
8*bd66c1b4SMartin Matuska 
9*bd66c1b4SMartin Matuska #include <stdlib.h>
10*bd66c1b4SMartin Matuska #include <string.h>
11*bd66c1b4SMartin Matuska 
12*bd66c1b4SMartin Matuska #if defined(_WIN32) && !defined(__CYGWIN__)
13*bd66c1b4SMartin Matuska #define UNLINK _unlink
14*bd66c1b4SMartin Matuska #else
15*bd66c1b4SMartin Matuska #define UNLINK unlink
16*bd66c1b4SMartin Matuska #endif
17*bd66c1b4SMartin Matuska 
18*bd66c1b4SMartin Matuska DEFINE_TEST(test_extract_cpio_absolute_paths)
19*bd66c1b4SMartin Matuska {
20*bd66c1b4SMartin Matuska 	int r;
21*bd66c1b4SMartin Matuska 
22*bd66c1b4SMartin Matuska 	// Create an absolute path for a test file inside testworkdir.
23*bd66c1b4SMartin Matuska 	const char *entry_suffix = "/cpio-noabs";
24*bd66c1b4SMartin Matuska 	size_t entry_suffix_length = strlen(entry_suffix);
25*bd66c1b4SMartin Matuska 	size_t testworkdir_length = strlen(testworkdir);
26*bd66c1b4SMartin Matuska 	size_t temp_absolute_file_name_length = testworkdir_length + entry_suffix_length;
27*bd66c1b4SMartin Matuska 	char *temp_absolute_file_name = calloc(1, temp_absolute_file_name_length + 1); // +1 for null character.
28*bd66c1b4SMartin Matuska 	assertEqualInt(snprintf(temp_absolute_file_name, temp_absolute_file_name_length + 1, "%s%s", testworkdir, entry_suffix),
29*bd66c1b4SMartin Matuska 		temp_absolute_file_name_length);
30*bd66c1b4SMartin Matuska 
31*bd66c1b4SMartin Matuska 	// Create the file.
32*bd66c1b4SMartin Matuska 	const char *sample_data = "test file from test_extract_cpio_absolute_paths";
33*bd66c1b4SMartin Matuska 	assertMakeFile(temp_absolute_file_name, 0644, sample_data);
34*bd66c1b4SMartin Matuska 
35*bd66c1b4SMartin Matuska 	// Create an archive with the test file, using an absolute path.
36*bd66c1b4SMartin Matuska 	assertMakeFile("filelist", 0644, temp_absolute_file_name);
37*bd66c1b4SMartin Matuska 	r = systemf("%s -o < filelist > archive.cpio 2> stderr1.txt", testprog);
38*bd66c1b4SMartin Matuska 	assertEqualInt(r, 0);
39*bd66c1b4SMartin Matuska 
40*bd66c1b4SMartin Matuska 	// Ensure that the temp file does not exist.
41*bd66c1b4SMartin Matuska 	UNLINK(temp_absolute_file_name);
42*bd66c1b4SMartin Matuska 
43*bd66c1b4SMartin Matuska 	// We should refuse to create the absolute path without --insecure.
44*bd66c1b4SMartin Matuska 	r = systemf("%s -i < archive.cpio 2> stderr2.txt", testprog);
45*bd66c1b4SMartin Matuska 	assert(r != 0);
46*bd66c1b4SMartin Matuska 	assertFileNotExists(temp_absolute_file_name);
47*bd66c1b4SMartin Matuska 	UNLINK(temp_absolute_file_name); // Cleanup just in case.
48*bd66c1b4SMartin Matuska 
49*bd66c1b4SMartin Matuska 	// But if we specify --insecure then the absolute path should be created.
50*bd66c1b4SMartin Matuska 	r = systemf("%s -i --insecure < archive.cpio 2> stderr3.txt", testprog);
51*bd66c1b4SMartin Matuska 	assert(r == 0);
52*bd66c1b4SMartin Matuska 	assertFileExists(temp_absolute_file_name);
53*bd66c1b4SMartin Matuska }
54