summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2021-06-23 09:53:37 (GMT)
committerGitHub <noreply@github.com>2021-06-23 09:53:37 (GMT)
commit5c7940257e1f611e7284fd504887bd29a63d0a94 (patch)
tree8750d9832456431d5695b4f02a2fdfbbb1a3d418 /Lib
parent5a3108044d2e5b694da2d1f4176c9bbaef15c142 (diff)
downloadcpython-5c7940257e1f611e7284fd504887bd29a63d0a94.zip
cpython-5c7940257e1f611e7284fd504887bd29a63d0a94.tar.gz
cpython-5c7940257e1f611e7284fd504887bd29a63d0a94.tar.bz2
bpo-44482: Fix very unlikely resource leak in glob in non-CPython implementations (GH-26843)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/glob.py9
1 files changed, 7 insertions, 2 deletions
diff --git a/Lib/glob.py b/Lib/glob.py
index a6cff87..9fc08f4 100644
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -1,5 +1,6 @@
"""Filename globbing utility."""
+import contextlib
import os
import re
import fnmatch
@@ -90,7 +91,7 @@ def _iglob(pathname, root_dir, dir_fd, recursive, dironly):
# takes a literal basename (so it only has to check for its existence).
def _glob1(dirname, pattern, dir_fd, dironly):
- names = list(_iterdir(dirname, dir_fd, dironly))
+ names = _listdir(dirname, dir_fd, dironly)
if not _ishidden(pattern):
names = (x for x in names if not _ishidden(x))
return fnmatch.filter(names, pattern)
@@ -158,9 +159,13 @@ def _iterdir(dirname, dir_fd, dironly):
except OSError:
return
+def _listdir(dirname, dir_fd, dironly):
+ with contextlib.closing(_iterdir(dirname, dir_fd, dironly)) as it:
+ return list(it)
+
# Recursively yields relative pathnames inside a literal directory.
def _rlistdir(dirname, dir_fd, dironly):
- names = list(_iterdir(dirname, dir_fd, dironly))
+ names = _listdir(dirname, dir_fd, dironly)
for x in names:
if not _ishidden(x):
yield x