Commit 520f297e authored by Guido van Rossum's avatar Guido van Rossum

Issue #26012: Don't traverse into symlinks for ** pattern in...

Issue #26012: Don't traverse into symlinks for ** pattern in pathlib.Path.[r]glob(). (Merge 3.4->3.5)
parents d54377d2 69bfb15b
...@@ -541,7 +541,7 @@ class _RecursiveWildcardSelector(_Selector): ...@@ -541,7 +541,7 @@ class _RecursiveWildcardSelector(_Selector):
yield parent_path yield parent_path
for name in listdir(parent_path): for name in listdir(parent_path):
path = parent_path._make_child_relpath(name) path = parent_path._make_child_relpath(name)
if is_dir(path): if is_dir(path) and not path.is_symlink():
for p in self._iterate_directories(path, is_dir, listdir): for p in self._iterate_directories(path, is_dir, listdir):
yield p yield p
......
...@@ -1241,7 +1241,7 @@ class _BasePathTest(object): ...@@ -1241,7 +1241,7 @@ class _BasePathTest(object):
os.symlink('non-existing', join('brokenLink')) os.symlink('non-existing', join('brokenLink'))
self.dirlink('dirB', join('linkB')) self.dirlink('dirB', join('linkB'))
self.dirlink(os.path.join('..', 'dirB'), join('dirA', 'linkC')) self.dirlink(os.path.join('..', 'dirB'), join('dirA', 'linkC'))
# This one goes upwards but doesn't create a loop # This one goes upwards, creating a loop
self.dirlink(os.path.join('..', 'dirB'), join('dirB', 'linkD')) self.dirlink(os.path.join('..', 'dirB'), join('dirB', 'linkD'))
if os.name == 'nt': if os.name == 'nt':
...@@ -1437,6 +1437,23 @@ class _BasePathTest(object): ...@@ -1437,6 +1437,23 @@ class _BasePathTest(object):
_check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"]) _check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"])
_check(p.rglob("*/*"), ["dirC/dirD/fileD"]) _check(p.rglob("*/*"), ["dirC/dirD/fileD"])
@with_symlinks
def test_rglob_symlink_loop(self):
# Don't get fooled by symlink loops (Issue #26012)
P = self.cls
p = P(BASE)
given = set(p.rglob('*'))
expect = {'brokenLink',
'dirA', 'dirA/linkC',
'dirB', 'dirB/fileB', 'dirB/linkD',
'dirC', 'dirC/dirD', 'dirC/dirD/fileD', 'dirC/fileC',
'dirE',
'fileA',
'linkA',
'linkB',
}
self.assertEqual(given, {p / x for x in expect})
def test_glob_dotdot(self): def test_glob_dotdot(self):
# ".." is not special in globs # ".." is not special in globs
P = self.cls P = self.cls
......
...@@ -41,6 +41,9 @@ Core and Builtins ...@@ -41,6 +41,9 @@ Core and Builtins
Library Library
------- -------
- Issue #26012: Don't traverse into symlinks for ** pattern in
pathlib.Path.[r]glob().
- Issue #24120: Ignore PermissionError when traversing a tree with - Issue #24120: Ignore PermissionError when traversing a tree with
pathlib.Path.[r]glob(). Patch by Ulrich Petri. pathlib.Path.[r]glob(). Patch by Ulrich Petri.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment