Skip to content

Commit

Permalink
GH-87695: Fix OSError from pathlib.Path.glob() (GH-104292)
Browse files Browse the repository at this point in the history
Fix issue where `pathlib.Path.glob()` raised `OSError` when it encountered
a symlink to an overly long path.
(cherry picked from commit a33ce66)

Co-authored-by: Barney Gale <barney.gale@gmail.com>
  • Loading branch information
barneygale authored and miss-islington committed May 10, 2023
1 parent 1cbf844 commit 68fde99
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
4 changes: 2 additions & 2 deletions Lib/pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,11 +388,11 @@ def _iterate_directories(self, parent_path, is_dir, scandir):
for entry in entries:
entry_is_dir = False
try:
entry_is_dir = entry.is_dir()
entry_is_dir = entry.is_dir(follow_symlinks=False)
except OSError as e:
if not _ignore_error(e):
raise
if entry_is_dir and not entry.is_symlink():
if entry_is_dir:
path = parent_path._make_child_relpath(entry.name)
for p in self._iterate_directories(path, is_dir, scandir):
yield p
Expand Down
9 changes: 9 additions & 0 deletions Lib/test/test_pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -1790,6 +1790,15 @@ def my_scandir(path):
subdir.chmod(000)
self.assertEqual(len(set(base.glob("*"))), 4)

@os_helper.skip_unless_symlink
def test_glob_long_symlink(self):
# See gh-87695
base = self.cls(BASE) / 'long_symlink'
base.mkdir()
bad_link = base / 'bad_link'
bad_link.symlink_to("bad" * 200)
self.assertEqual(sorted(base.glob('**/*')), [bad_link])

def _check_resolve(self, p, expected, strict=True):
q = p.resolve(strict)
self.assertEqual(q, expected)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix issue where :meth:`pathlib.Path.glob` raised :exc:`OSError` when it
encountered a symlink to an overly long path.

0 comments on commit 68fde99

Please sign in to comment.