From: Charles-François Natali Date: Fri, 29 Jul 2011 16:59:24 +0000 (+0200) Subject: Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow symlinks: X-Git-Tag: v3.2.2rc1~51 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=def35435ee4001f8aedac01b559bb0dc2d0aab00;p=python Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow symlinks: fix it. Patch by Petri Lehtinen. --- diff --git a/Lib/tempfile.py b/Lib/tempfile.py index b28d91f87e..48b77a87e2 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -661,6 +661,7 @@ class TemporaryDirectory(object): _listdir = staticmethod(_os.listdir) _path_join = staticmethod(_os.path.join) _isdir = staticmethod(_os.path.isdir) + _islink = staticmethod(_os.path.islink) _remove = staticmethod(_os.remove) _rmdir = staticmethod(_os.rmdir) _os_error = _os.error @@ -672,7 +673,7 @@ class TemporaryDirectory(object): for name in self._listdir(path): fullname = self._path_join(path, name) try: - isdir = self._isdir(fullname) + isdir = self._isdir(fullname) and not self._islink(fullname) except self._os_error: isdir = False if isdir: diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 2d298857b2..f7f5bdadbd 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -964,6 +964,27 @@ class test_TemporaryDirectory(TC): finally: os.rmdir(dir) + @support.skip_unless_symlink + def test_cleanup_with_symlink_to_a_directory(self): + # cleanup() should not follow symlinks to directories (issue #12464) + d1 = self.do_create() + d2 = self.do_create() + + # Symlink d1/foo -> d2 + os.symlink(d2.name, os.path.join(d1.name, "foo")) + + # This call to cleanup() should not follow the "foo" symlink + d1.cleanup() + + self.assertFalse(os.path.exists(d1.name), + "TemporaryDirectory %s exists after cleanup" % d1.name) + self.assertTrue(os.path.exists(d2.name), + "Directory pointed to by a symlink was deleted") + self.assertEqual(os.listdir(d2.name), ['test.txt'], + "Contents of the directory pointed to by a symlink " + "were deleted") + d2.cleanup() + @support.cpython_only def test_del_on_collection(self): # A TemporaryDirectory is deleted when garbage collected diff --git a/Misc/ACKS b/Misc/ACKS index 820206acf4..db451d7190 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -526,6 +526,7 @@ Vincent Legoll Kip Lehman Joerg Lehmann Robert Lehmann +Petri Lehtinen Luke Kenneth Casson Leighton Marc-Andre Lemburg John Lenton diff --git a/Misc/NEWS b/Misc/NEWS index 1021df73d5..b080316f20 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -41,6 +41,9 @@ Core and Builtins Library ------- +- Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow + symlinks: fix it. Patch by Petri Lehtinen. + - Issue #8887: "pydoc somebuiltin.somemethod" (or help('somebuiltin.somemethod') in Python code) now finds the doc of the method.