Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pathlib.Path.glob causes OSError encountering symlinks to long filenames #87695

Closed
ericfrederich mannequin opened this issue Mar 17, 2021 · 5 comments
Closed

pathlib.Path.glob causes OSError encountering symlinks to long filenames #87695

ericfrederich mannequin opened this issue Mar 17, 2021 · 5 comments
Labels
3.7 (EOL) end of life 3.8 (EOL) end of life 3.9 only security fixes 3.10 only security fixes topic-pathlib

Comments

@ericfrederich
Copy link
Mannequin

ericfrederich mannequin commented Mar 17, 2021

BPO 43529
Nosy @ericfrederich
Files
  • uhoh.py: Reproduces bug
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = None
    created_at = <Date 2021-03-17.15:23:36.025>
    labels = ['3.7', '3.8', '3.9', '3.10']
    title = 'pathlib.Path.glob causes OSError encountering symlinks to long filenames'
    updated_at = <Date 2021-03-19.11:28:12.066>
    user = 'https://github.com/ericfrederich'

    bugs.python.org fields:

    activity = <Date 2021-03-19.11:28:12.066>
    actor = 'eric.frederich'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = []
    creation = <Date 2021-03-17.15:23:36.025>
    creator = 'eric.frederich'
    dependencies = []
    files = ['49884']
    hgrepos = []
    issue_num = 43529
    keywords = []
    message_count = 3.0
    messages = ['388927', '388928', '389073']
    nosy_count = 1.0
    nosy_names = ['eric.frederich']
    pr_nums = []
    priority = 'normal'
    resolution = None
    stage = None
    status = 'open'
    superseder = None
    type = None
    url = 'https://bugs.python.org/issue43529'
    versions = ['Python 3.6', 'Python 3.7', 'Python 3.8', 'Python 3.9', 'Python 3.10']

    Linked PRs

    @ericfrederich
    Copy link
    Mannequin Author

    ericfrederich mannequin commented Mar 17, 2021

    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.

    @ericfrederich ericfrederich mannequin added 3.8 (EOL) end of life 3.9 only security fixes labels Mar 17, 2021
    @ericfrederich
    Copy link
    Mannequin Author

    ericfrederich mannequin commented Mar 17, 2021

    I verified against all versions available for me to select.
    For 3.10 I used the 3.10-rc Docker image.

    @ericfrederich ericfrederich mannequin added 3.7 (EOL) end of life 3.10 only security fixes labels Mar 17, 2021
    @ericfrederich
    Copy link
    Mannequin Author

    ericfrederich mannequin commented Mar 19, 2021

    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

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    barneygale added a commit to barneygale/cpython that referenced this issue May 8, 2023
    Fix issue where `pathlib.Path.glob()` raised `OSError` when it encountered
    a symlink to an overly long path.
    barneygale added a commit to barneygale/cpython that referenced this issue May 8, 2023
    Fix issue where `pathlib.Path.glob()` raised `OSError` when it encountered
    a symlink to an overly long path.
    barneygale added a commit to barneygale/cpython that referenced this issue May 10, 2023
    barneygale added a commit that referenced this issue May 10, 2023
    Fix issue where `pathlib.Path.glob()` raised `OSError` when it encountered
    a symlink to an overly long path.
    miss-islington pushed a commit to miss-islington/cpython that referenced this issue May 10, 2023
    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>
    miss-islington pushed a commit to miss-islington/cpython that referenced this issue May 10, 2023
    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>
    carljm added a commit to carljm/cpython that referenced this issue May 10, 2023
    * main:
      pythonGH-102181: Improve specialization stats for SEND (pythonGH-102182)
      pythongh-103000: Optimise `dataclasses.asdict` for the common case (python#104364)
      pythongh-103538: Remove unused TK_AQUA code (pythonGH-103539)
      pythonGH-87695: Fix OSError from `pathlib.Path.glob()` (pythonGH-104292)
      pythongh-104263: Rely on Py_NAN and introduce Py_INFINITY (pythonGH-104202)
      pythongh-104010: Separate and improve docs for `typing.get_origin` and `typing.get_args` (python#104013)
      pythongh-101819: Adapt _io._BufferedIOBase_Type methods to Argument Clinic (python#104355)
      pythongh-103960: Dark mode: invert image brightness (python#103983)
      pythongh-104252: Immortalize Py_EMPTY_KEYS (pythongh-104253)
      pythongh-101819: Clean up _io windows console io after pythongh-104197 (python#104354)
      pythongh-101819: Harden _io init (python#104352)
      pythongh-103247: clear the module cache in a test in test_importlib/extensions/test_loader.py (pythonGH-104226)
      pythongh-103848: Adds checks to ensure that bracketed hosts found by urlsplit are of IPv6 or IPvFuture format (python#103849)
      pythongh-74895: adjust tests to work on Solaris (python#104326)
      pythongh-101819: Refactor _io in preparation for module isolation (python#104334)
      pythongh-90953: Don't use deprecated AST nodes in clinic.py (python#104322)
      pythongh-102327: Extend docs for "url" and "headers" parameters to HTTPConnection.request()
      pythongh-104328: Fix typo in ``typing.Generic`` multiple inheritance error message (python#104335)
    barneygale added a commit that referenced this issue May 10, 2023
    …H-104362)
    
    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>
    @barneygale
    Copy link
    Contributor

    Fixed in 3.12: #104292 / a33ce66

    Backported to 3.11: #104362 / 846a23d

    carljm added a commit to carljm/cpython that referenced this issue May 11, 2023
    * main: (27 commits)
      pythongh-87849: fix SEND specialization family definition (pythonGH-104268)
      pythongh-101819: Adapt _io.IOBase.seek and _io.IOBase.truncate to Argument Clinic (python#104384)
      pythongh-101819: Adapt _io._Buffered* methods to Argument Clinic (python#104367)
      pythongh-101819: Refactor `_io` futher in preparation for module isolation (python#104369)
      pythongh-101819: Adapt _io.TextIOBase methods to Argument Clinic (python#104383)
      pythongh-101117: Improve accuracy of sqlite3.Cursor.rowcount docs (python#104287)
      pythonGH-92184: Convert os.altsep to '/' in filenames when creating ZipInfo objects (python#92185)
      pythongh-104357: fix inlined comprehensions that close over iteration var (python#104368)
      pythonGH-90208: Suppress OSError exceptions from `pathlib.Path.glob()` (pythonGH-104141)
      pythonGH-102181: Improve specialization stats for SEND (pythonGH-102182)
      pythongh-103000: Optimise `dataclasses.asdict` for the common case (python#104364)
      pythongh-103538: Remove unused TK_AQUA code (pythonGH-103539)
      pythonGH-87695: Fix OSError from `pathlib.Path.glob()` (pythonGH-104292)
      pythongh-104263: Rely on Py_NAN and introduce Py_INFINITY (pythonGH-104202)
      pythongh-104010: Separate and improve docs for `typing.get_origin` and `typing.get_args` (python#104013)
      pythongh-101819: Adapt _io._BufferedIOBase_Type methods to Argument Clinic (python#104355)
      pythongh-103960: Dark mode: invert image brightness (python#103983)
      pythongh-104252: Immortalize Py_EMPTY_KEYS (pythongh-104253)
      pythongh-101819: Clean up _io windows console io after pythongh-104197 (python#104354)
      pythongh-101819: Harden _io init (python#104352)
      ...
    @encukou
    Copy link
    Member

    encukou commented May 23, 2023

    Note that this is "fixed" (the error is ignored) in 3.8+ in #79487

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.7 (EOL) end of life 3.8 (EOL) end of life 3.9 only security fixes 3.10 only security fixes topic-pathlib
    Projects
    Development

    No branches or pull requests

    3 participants