mirror of https://github.com/python/cpython
Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow symlinks:
fix it. Patch by Petri Lehtinen.
This commit is contained in:
parent
fe1e298d8b
commit
def35435ee
|
@ -661,6 +661,7 @@ class TemporaryDirectory(object):
|
||||||
_listdir = staticmethod(_os.listdir)
|
_listdir = staticmethod(_os.listdir)
|
||||||
_path_join = staticmethod(_os.path.join)
|
_path_join = staticmethod(_os.path.join)
|
||||||
_isdir = staticmethod(_os.path.isdir)
|
_isdir = staticmethod(_os.path.isdir)
|
||||||
|
_islink = staticmethod(_os.path.islink)
|
||||||
_remove = staticmethod(_os.remove)
|
_remove = staticmethod(_os.remove)
|
||||||
_rmdir = staticmethod(_os.rmdir)
|
_rmdir = staticmethod(_os.rmdir)
|
||||||
_os_error = _os.error
|
_os_error = _os.error
|
||||||
|
@ -672,7 +673,7 @@ class TemporaryDirectory(object):
|
||||||
for name in self._listdir(path):
|
for name in self._listdir(path):
|
||||||
fullname = self._path_join(path, name)
|
fullname = self._path_join(path, name)
|
||||||
try:
|
try:
|
||||||
isdir = self._isdir(fullname)
|
isdir = self._isdir(fullname) and not self._islink(fullname)
|
||||||
except self._os_error:
|
except self._os_error:
|
||||||
isdir = False
|
isdir = False
|
||||||
if isdir:
|
if isdir:
|
||||||
|
|
|
@ -964,6 +964,27 @@ class test_TemporaryDirectory(TC):
|
||||||
finally:
|
finally:
|
||||||
os.rmdir(dir)
|
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
|
@support.cpython_only
|
||||||
def test_del_on_collection(self):
|
def test_del_on_collection(self):
|
||||||
# A TemporaryDirectory is deleted when garbage collected
|
# A TemporaryDirectory is deleted when garbage collected
|
||||||
|
|
|
@ -526,6 +526,7 @@ Vincent Legoll
|
||||||
Kip Lehman
|
Kip Lehman
|
||||||
Joerg Lehmann
|
Joerg Lehmann
|
||||||
Robert Lehmann
|
Robert Lehmann
|
||||||
|
Petri Lehtinen
|
||||||
Luke Kenneth Casson Leighton
|
Luke Kenneth Casson Leighton
|
||||||
Marc-Andre Lemburg
|
Marc-Andre Lemburg
|
||||||
John Lenton
|
John Lenton
|
||||||
|
|
|
@ -41,6 +41,9 @@ Core and Builtins
|
||||||
Library
|
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')
|
- Issue #8887: "pydoc somebuiltin.somemethod" (or help('somebuiltin.somemethod')
|
||||||
in Python code) now finds the doc of the method.
|
in Python code) now finds the doc of the method.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue