From: Hynek Schlawack Date: Fri, 29 Jun 2012 06:28:20 +0000 (+0200) Subject: Check for all used fd-based functions in shutil.rmdir, closes #15218 X-Git-Tag: v3.3.0b2~368 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d0f6e0a6e61d2ded83ddf46db193cf97eb3b878c;p=python Check for all used fd-based functions in shutil.rmdir, closes #15218 --- diff --git a/Lib/shutil.py b/Lib/shutil.py index 99e4017d86..6d80feed67 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -405,8 +405,10 @@ def _rmtree_safe_fd(topfd, path, onerror): except os.error: onerror(os.unlink, fullname, sys.exc_info()) -_use_fd_functions = (os.unlink in os.supports_dir_fd and - os.open in os.supports_dir_fd) +_use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= + os.supports_dir_fd and + os.listdir in os.supports_fd and + os.stat in os.supports_follow_symlinks) def rmtree(path, ignore_errors=False, onerror=None): """Recursively delete a directory tree. diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index cb712b3e61..a2b6e88afe 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -524,7 +524,11 @@ class TestShutil(unittest.TestCase): self.assertFalse(os.path.islink(dst)) def test_rmtree_uses_safe_fd_version_if_available(self): - if os.unlink in os.supports_dir_fd and os.open in os.supports_dir_fd: + _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= + os.supports_dir_fd and + os.listdir in os.supports_fd and + os.stat in os.supports_follow_symlinks) + if _use_fd_functions: self.assertTrue(shutil._use_fd_functions) self.assertTrue(shutil.rmtree.avoids_symlink_attacks) tmp_dir = self.mkdtemp()