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