1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2009 Michihiro NAKAJIMA 5 * Copyright (c) 2003-2007 Tim Kientzle 6 * All rights reserved. 7 */ 8 #include "test.h" 9 10 DEFINE_TEST(test_patterns) 11 { 12 FILE *f; 13 int r; 14 const char *reffile2 = "test_patterns_2.tar"; 15 const char *reffile3 = "test_patterns_3.tar"; 16 const char *reffile4 = "test_patterns_4.tar"; 17 18 const char *tar2aExpected[] = { 19 "/tmp/foo/bar/", 20 "/tmp/foo/bar/baz", 21 NULL 22 }; 23 24 /* 25 * Test basic command-line pattern handling. 26 */ 27 28 /* 29 * Test 1: Files on the command line that don't get matched 30 * didn't produce an error. 31 * 32 * John Baldwin reported this problem in PR bin/121598 33 */ 34 f = fopen("foo", "w"); 35 assert(f != NULL); 36 fclose(f); 37 r = systemf("%s cfv tar1.tgz foo > tar1a.out 2> tar1a.err", testprog); 38 assertEqualInt(r, 0); 39 r = systemf("%s xv --no-same-owner -f tar1.tgz foo bar > tar1b.out 2> tar1b.err", testprog); 40 failure("tar should return non-zero because a file was given on the command line that's not in the archive"); 41 assert(r != 0); 42 43 /* 44 * Test 2: Check basic matching of full paths that start with / 45 */ 46 extract_reference_file(reffile2); 47 48 r = systemf("%s tf %s /tmp/foo/bar > tar2a.out 2> tar2a.err", 49 testprog, reffile2); 50 assertEqualInt(r, 0); 51 assertFileContainsLinesAnyOrder("tar2a.out", tar2aExpected); 52 assertEmptyFile("tar2a.err"); 53 54 /* 55 * Test 3 archive has some entries starting with '/' and some not. 56 */ 57 extract_reference_file(reffile3); 58 59 /* Test 3a: Pattern tmp/foo/bar should not match /tmp/foo/bar */ 60 r = systemf("%s x --no-same-owner -f %s tmp/foo/bar > tar3a.out 2> tar3a.err", 61 testprog, reffile3); 62 assert(r != 0); 63 assertEmptyFile("tar3a.out"); 64 65 /* Test 3b: Pattern /tmp/foo/baz should not match tmp/foo/baz */ 66 assertNonEmptyFile("tar3a.err"); 67 /* Again, with the '/' */ 68 r = systemf("%s x --no-same-owner -f %s /tmp/foo/baz > tar3b.out 2> tar3b.err", 69 testprog, reffile3); 70 assert(r != 0); 71 assertEmptyFile("tar3b.out"); 72 assertNonEmptyFile("tar3b.err"); 73 74 /* Test 3c: ./tmp/foo/bar should not match /tmp/foo/bar */ 75 r = systemf("%s x --no-same-owner -f %s ./tmp/foo/bar > tar3c.out 2> tar3c.err", 76 testprog, reffile3); 77 assert(r != 0); 78 assertEmptyFile("tar3c.out"); 79 assertNonEmptyFile("tar3c.err"); 80 81 /* Test 3d: ./tmp/foo/baz should match tmp/foo/baz */ 82 r = systemf("%s x --no-same-owner -f %s ./tmp/foo/baz > tar3d.out 2> tar3d.err", 83 testprog, reffile3); 84 assertEqualInt(r, 0); 85 assertEmptyFile("tar3d.out"); 86 assertEmptyFile("tar3d.err"); 87 assertFileExists("tmp/foo/baz/bar"); 88 89 /* 90 * Test 4 archive has some entries starting with windows drive letters 91 * such as 'c:\', '//./c:/' or '//?/c:/'. 92 */ 93 extract_reference_file(reffile4); 94 95 r = systemf("%s x --no-same-owner -f %s -C tmp > tar4.out 2> tar4.err", 96 testprog, reffile4); 97 assert(r != 0); 98 assertEmptyFile("tar4.out"); 99 assertNonEmptyFile("tar4.err"); 100 101 for (r = 1; r <= 54; r++) { 102 char file_a[] = "tmp/fileXX"; 103 char file_b1[] = "tmp/server/share/fileXX"; 104 char file_b2[] = "tmp/server\\share\\fileXX"; 105 char file_c[] = "tmp/../fileXX"; 106 char file_d[] = "tmp/../../fileXX"; 107 char *filex; 108 int xsize; 109 110 switch (r) { 111 case 15: case 18: 112 /* 113 * Including server and share names. 114 * //?/UNC/server/share/file15 115 * //?/unc/server/share/file18 116 */ 117 filex = file_b1; 118 xsize = sizeof(file_b1); 119 break; 120 case 35: case 38: case 52: 121 /* 122 * Including server and share names. 123 * \\?\UNC\server\share\file35 124 * \\?\unc\server\share\file38 125 * \/?/uNc/server\share\file52 126 */ 127 filex = file_b2; 128 xsize = sizeof(file_b2); 129 break; 130 default: 131 filex = file_a; 132 xsize = sizeof(file_a); 133 break; 134 } 135 filex[xsize-3] = '0' + r / 10; 136 filex[xsize-2] = '0' + r % 10; 137 switch (r) { 138 case 5: case 6: case 17: case 20: case 25: 139 case 26: case 37: case 40: case 43: case 54: 140 /* 141 * Not extracted patterns. 142 * D:../file05 143 * c:../../file06 144 * //?/UNC/../file17 145 * //?/unc/../file20 146 * z:..\file25 147 * c:..\..\file26 148 * \\?\UNC\..\file37 149 * \\?\unc\..\file40 150 * c:../..\file43 151 * \/?\UnC\../file54 152 */ 153 assertFileNotExists(filex); 154 if (r == 6 || r == 26 || r == 43) { 155 filex = file_d; 156 xsize = sizeof(file_d); 157 } else { 158 filex = file_c; 159 xsize = sizeof(file_c); 160 } 161 filex[xsize-3] = '0' + r / 10; 162 filex[xsize-2] = '0' + r % 10; 163 assertFileNotExists(filex); 164 break; 165 default: 166 /* Extracted patterns. */ 167 assertFileExists(filex); 168 break; 169 } 170 } 171 } 172