bpo-39567: Add audit for os.walk(), os.fwalk(), Path.glob() and Path.rglob(). (GH-18372)

This commit is contained in:
Serhiy Storchaka 2020-02-12 12:11:34 +02:00 committed by GitHub
parent 95905ce0f4
commit f4f445b693
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 3 deletions

View File

@ -336,7 +336,10 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
dirs.remove('CVS') # don't visit CVS directories dirs.remove('CVS') # don't visit CVS directories
""" """
top = fspath(top) sys.audit("os.walk", top, topdown, onerror, followlinks)
return _walk(fspath(top), topdown, onerror, followlinks)
def _walk(top, topdown, onerror, followlinks):
dirs = [] dirs = []
nondirs = [] nondirs = []
walk_dirs = [] walk_dirs = []
@ -410,11 +413,11 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# the caller can replace the directory entry during the "yield" # the caller can replace the directory entry during the "yield"
# above. # above.
if followlinks or not islink(new_path): if followlinks or not islink(new_path):
yield from walk(new_path, topdown, onerror, followlinks) yield from _walk(new_path, topdown, onerror, followlinks)
else: else:
# Recurse into sub-directories # Recurse into sub-directories
for new_path in walk_dirs: for new_path in walk_dirs:
yield from walk(new_path, topdown, onerror, followlinks) yield from _walk(new_path, topdown, onerror, followlinks)
# Yield after recursion if going bottom up # Yield after recursion if going bottom up
yield top, dirs, nondirs yield top, dirs, nondirs
@ -455,6 +458,7 @@ if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd:
if 'CVS' in dirs: if 'CVS' in dirs:
dirs.remove('CVS') # don't visit CVS directories dirs.remove('CVS') # don't visit CVS directories
""" """
sys.audit("os.fwalk", top, topdown, onerror, follow_symlinks, dir_fd)
if not isinstance(top, int) or not hasattr(top, '__index__'): if not isinstance(top, int) or not hasattr(top, '__index__'):
top = fspath(top) top = fspath(top)
# Note: To guard against symlink races, we use the standard # Note: To guard against symlink races, we use the standard

View File

@ -1134,6 +1134,7 @@ class Path(PurePath):
"""Iterate over this subtree and yield all existing files (of any """Iterate over this subtree and yield all existing files (of any
kind, including directories) matching the given relative pattern. kind, including directories) matching the given relative pattern.
""" """
sys.audit("pathlib.Path.glob", self, pattern)
if not pattern: if not pattern:
raise ValueError("Unacceptable pattern: {!r}".format(pattern)) raise ValueError("Unacceptable pattern: {!r}".format(pattern))
drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) drv, root, pattern_parts = self._flavour.parse_parts((pattern,))
@ -1148,6 +1149,7 @@ class Path(PurePath):
directories) matching the given relative pattern, anywhere in directories) matching the given relative pattern, anywhere in
this subtree. this subtree.
""" """
sys.audit("pathlib.Path.rglob", self, pattern)
drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) drv, root, pattern_parts = self._flavour.parse_parts((pattern,))
if drv or root: if drv or root:
raise NotImplementedError("Non-relative patterns are unsupported") raise NotImplementedError("Non-relative patterns are unsupported")

View File

@ -0,0 +1,2 @@
Added audit for :func:`os.walk`, :func:`os.fwalk`, :meth:`pathlib.Path.glob`
and :meth:`pathlib.Path.rglob`.