mirror of
https://github.com/python/cpython.git
synced 2025-10-08 08:01:55 +00:00
Issue #26012: Don't traverse into symlinks for ** pattern in pathlib.Path.[r]glob(). (Merge 3.4->3.5)
This commit is contained in:
commit
520f297eb4
3 changed files with 22 additions and 2 deletions
|
@ -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):
|
||||||
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):
|
||||||
_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
|
||||||
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.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue