Skip to content

pathlib.Path.resolve() mishandles symlink loops#109187

@barneygale

Description

@barneygale

Bug report

Bug description:

Two closely-related issues in pathlib.Path.resolve():

First, resolve(strict=True) raises RuntimeError rather than OSError when a symlink loop is encountered. This is done only for backwards compatibility, since #25264 made pathlib call os.path.realpath(). It should raise OSError(ELOOP)

Second, resolve(strict=False) suppresses every kind of OS error except symlink loop errors. Again this is only for backwards compatibility. It should suppress exceptions about symlink loops.

Relevant code:

cpython/Lib/pathlib.py

Lines 1233 to 1252 in e21c89f

defcheck_eloop(e):
winerror=getattr(e, 'winerror', 0)
ife.errno==ELOOPorwinerror==_WINERROR_CANT_RESOLVE_FILENAME:
raiseRuntimeError("Symlink loop from %r"%e.filename)
try:
s=os.path.realpath(self, strict=strict)
exceptOSErrorase:
check_eloop(e)
raise
p=self.with_segments(s)
# In non-strict mode, realpath() doesn't raise on symlink loops.
# Ensure we get an exception by calling stat()
ifnotstrict:
try:
p.stat()
exceptOSErrorase:
check_eloop(e)
returnp

CPython versions tested on:

3.11, 3.12, CPython main branch

Operating systems tested on:

No response

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions