mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow symlinks:
fix it. Patch by Petri Lehtinen.
This commit is contained in:
		
							parent
							
								
									fe1e298d8b
								
							
						
					
					
						commit
						def35435ee
					
				
					 4 changed files with 27 additions and 1 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue