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));