-
-
Notifications
You must be signed in to change notification settings - Fork 32.4k
Closed
Labels
Description
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:
Lines 1233 to 1252 in e21c89f
def check_eloop(e): | |
winerror = getattr(e, 'winerror', 0) | |
if e.errno == ELOOP or winerror == _WINERROR_CANT_RESOLVE_FILENAME: | |
raise RuntimeError("Symlink loop from %r" % e.filename) | |
try: | |
s = os.path.realpath(self, strict=strict) | |
except OSError as e: | |
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() | |
if not strict: | |
try: | |
p.stat() | |
except OSError as e: | |
check_eloop(e) | |
return p |
CPython versions tested on:
3.11, 3.12, CPython main branch
Operating systems tested on:
No response