From 0dd83317d4ba9e91f975d854cd013ccd9d825781 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Wed, 10 May 2023 18:17:08 +0100 Subject: [PATCH] GH-87695: Fix OSError from `pathlib.Path.glob()` (GH-104292) Fix issue where `pathlib.Path.glob()` raised `OSError` when it encountered a symlink to an overly long path. (cherry picked from commit a33ce66dca57d4c36b1022fdf3b7e322f3203468) Co-authored-by: Barney Gale --- Lib/pathlib.py | 4 ++-- Lib/test/test_pathlib.py | 9 +++++++++ .../2023-05-08-15-39-00.gh-issue-87695.f6iO7v.rst | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-05-08-15-39-00.gh-issue-87695.f6iO7v.rst diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 9d40d88ef5f2e8c..ecb1e8a40d8cf02 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -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 diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 3b88c0848a04484..bd5170651d53454 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -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) diff --git a/Misc/NEWS.d/next/Library/2023-05-08-15-39-00.gh-issue-87695.f6iO7v.rst b/Misc/NEWS.d/next/Library/2023-05-08-15-39-00.gh-issue-87695.f6iO7v.rst new file mode 100644 index 000000000000000..7b677656bea3084 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-05-08-15-39-00.gh-issue-87695.f6iO7v.rst @@ -0,0 +1,2 @@ +Fix issue where :meth:`pathlib.Path.glob` raised :exc:`OSError` when it +encountered a symlink to an overly long path.