This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: pathlib.Path.glob causes OSError encountering symlinks to long filenames
Type: Stage:
Components: Versions: Python 3.10, Python 3.9, Python 3.8, Python 3.7, Python 3.6
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: eric.frederich
Priority: normal Keywords:

Created on 2021-03-17 15:23 by eric.frederich, last changed 2022-04-11 14:59 by admin.

Files
File name Uploaded Description Edit
uhoh.py eric.frederich, 2021-03-17 15:23 Reproduces bug
Messages (3)
msg388927 - (view) Author: Eric Frederich (eric.frederich) * Date: 2021-03-17 15:23
Calling pathlib.Path.glob("**/*) on a directory containing a symlink which resolves to a very long filename causes OSError.

This is completely avoidable since symlinks are not followed anyway.

In pathlib.py, the _RecursiveWildcardSelector has a method _iterate_directories which first calls entry.is_dir() prior to excluding based on entry.is_symlink().

It's the entry.is_dir() which is failing.
If the check for entry.is_symlink() were to happen first this error would be avoided.

It's worth noting that on Linux "ls -l bad_link" works fine.
Also "find /some/path/containing/bad/link" works fine.
You do get an error however when running "ls bad_link"
I believe Python's glob() should act like "find" on Linux and not fail.
Because it is explicitly ignoring symlinks anyway, it has no business calling is_dir() on a symlink.

I have attached a file which reproduces this problem.  It's meant to be ran inside of an empty directory.
msg388928 - (view) Author: Eric Frederich (eric.frederich) * Date: 2021-03-17 15:37
I verified against all versions available for me to select.
For 3.10 I used the 3.10-rc Docker image.
msg389073 - (view) Author: Eric Frederich (eric.frederich) * Date: 2021-03-19 11:28
I'm happy to create a pull request but would need some help.

Looking at that routine it has changed over time and I cannot simply create a single patch against 3.6 and have it merge cleanly into newer versions.

I'd need help explaining the process
History
Date User Action Args
2022-04-11 14:59:42adminsetgithub: 87695
2021-03-19 11:28:12eric.frederichsetmessages: + msg389073
2021-03-17 15:37:01eric.frederichsetmessages: + msg388928
versions: + Python 3.6, Python 3.7, Python 3.10
2021-03-17 15:24:16eric.frederichsetversions: + Python 3.8, Python 3.9
2021-03-17 15:23:36eric.frederichcreate