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