Module Name:    src
Committed By:   christos
Date:           Fri Aug 28 18:44:54 UTC 2020

Modified Files:
        src/external/bsd/libarchive/dist/libarchive/test:
            test_write_disk_secure.c

Log Message:
PR/55612: Martin Husemann: libarchive tests pollute /tmp w/o cleanup
Make tests obey $TMPDIR.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/external/bsd/libarchive/dist/libarchive/test/test_write_disk_secure.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/libarchive/dist/libarchive/test/test_write_disk_secure.c
diff -u src/external/bsd/libarchive/dist/libarchive/test/test_write_disk_secure.c:1.3 src/external/bsd/libarchive/dist/libarchive/test/test_write_disk_secure.c:1.4
--- src/external/bsd/libarchive/dist/libarchive/test/test_write_disk_secure.c:1.3	Thu Jan 16 19:37:03 2020
+++ src/external/bsd/libarchive/dist/libarchive/test/test_write_disk_secure.c	Fri Aug 28 14:44:54 2020
@@ -40,6 +40,16 @@ DEFINE_TEST(test_write_disk_secure)
 	struct archive *a;
 	struct archive_entry *ae;
 	struct stat st;
+	char tmp[2048];
+	const char *tmpdir;
+	const char *lname =
+	    "libarchive_test-test_write_disk_secure-absolute_symlink";
+#if 0
+	const char *fname =
+	    "libarchive_test-test_write_disk_secure-absolute_symlink_path.tmp";
+#endif
+	const char *pname =
+	    "libarchive_test-test_write_disk_secure-absolute_path.tmp";
 
 	/* Start with a known umask. */
 	assertUmask(UMASK);
@@ -86,12 +96,15 @@ DEFINE_TEST(test_write_disk_secure)
 	assert(0 == archive_write_finish_entry(a));
 #endif
 
-	/* Write an absolute symlink to /tmp. */
+	/* Write an absolute symlink to $TMPDIR. */
 	archive_write_disk_set_options(a, ARCHIVE_EXTRACT_SECURE_SYMLINKS);
 	assert((ae = archive_entry_new()) != NULL);
-	archive_entry_copy_pathname(ae, "/tmp/libarchive_test-test_write_disk_secure-absolute_symlink");
+	if ((tmpdir = getenv("TMPDIR")) == NULL)
+		tmpdir = "/tmp";
+	snprintf(tmp, sizeof(tmp), "%s/%s", tmpdir, lname);
+	archive_entry_copy_pathname(ae, tmp);
 	archive_entry_set_mode(ae, S_IFLNK | 0777);
-	archive_entry_set_symlink(ae, "/tmp");
+	archive_entry_set_symlink(ae, tmpdir);
 	archive_write_disk_set_options(a, 0);
 	assert(0 == archive_write_header(a, ae));
 	assert(0 == archive_write_finish_entry(a));
@@ -99,15 +112,18 @@ DEFINE_TEST(test_write_disk_secure)
 #if 0
 	/* With security checks enabled, this should fail. */
 	assert(archive_entry_clear(ae) != NULL);
-	archive_entry_copy_pathname(ae, "/tmp/libarchive_test-test_write_disk_secure-absolute_symlink/libarchive_test-test_write_disk_secure-absolute_symlink_path.tmp");
+	snprintf(tmp, sizeof(tmp), "%s/%s/%s", tmpdir, lname, fname);
+	archive_entry_copy_pathname(ae, tmp);
 	archive_entry_set_mode(ae, S_IFREG | 0777);
 	archive_write_disk_set_options(a, ARCHIVE_EXTRACT_SECURE_SYMLINKS);
 	failure("Extracting a file through an absolute symlink should fail here.");
 	assertEqualInt(ARCHIVE_FAILED, archive_write_header(a, ae));
 	archive_entry_free(ae);
-	assertFileNotExists("/tmp/libarchive_test-test_write_disk_secure-absolute_symlink/libarchive_test-test_write_disk_secure-absolute_symlink_path.tmp");
-	assert(0 == unlink("/tmp/libarchive_test-test_write_disk_secure-absolute_symlink"));
-	unlink("/tmp/libarchive_test-test_write_disk_secure-absolute_symlink_path.tmp");
+	assertFileNotExists(tmp);
+	snprintf(tmp, sizeof(tmp), "%s/%s", tmpdir, lname);
+	assert(0 == unlink(tmp));
+	snprintf(tmp, sizeof(tmp), "%s/%s", tmpdir, fname);
+	unlink(tmp);
 #endif
 
 	/* Create another link. */
@@ -230,23 +246,24 @@ DEFINE_TEST(test_write_disk_secure)
 	 * extract an absolute path.
 	 */
 	assert((ae = archive_entry_new()) != NULL);
-	archive_entry_copy_pathname(ae, "/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
+	snprintf(tmp, sizeof(tmp), "%s/%s", tmpdir, pname);
+	archive_entry_copy_pathname(ae, tmp);
 	archive_entry_set_mode(ae, S_IFREG | 0777);
 	assert(0 == archive_write_header(a, ae));
 	assert(0 == archive_write_finish_entry(a));
-	assertFileExists("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
-	assert(0 == unlink("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp"));
+	assertFileExists(tmp);
+	assert(0 == unlink(tmp));
 
 	/* But with security checks enabled, this should fail. */
 	assert(archive_entry_clear(ae) != NULL);
-	archive_entry_copy_pathname(ae, "/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
+	archive_entry_copy_pathname(ae, tmp);
 	archive_entry_set_mode(ae, S_IFREG | 0777);
 	archive_write_disk_set_options(a, ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS);
 	failure("Extracting an absolute path should fail here.");
 	assertEqualInt(ARCHIVE_FAILED, archive_write_header(a, ae));
 	archive_entry_free(ae);
 	assert(0 == archive_write_finish_entry(a));
-	assertFileNotExists("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
+	assertFileNotExists(tmp);
 
 	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
 

Reply via email to