posixpath.realpath() now detects symlink loops and returns the path just before

the loop starts.

Closes bug #930024.  Thanks AM Kuchling.
This commit is contained in:
Brett Cannon 2004-07-10 22:55:15 +00:00
parent 711e7d97e4
commit f50299c378
2 changed files with 34 additions and 6 deletions

View File

@ -405,13 +405,37 @@ symbolic links encountered in the path."""
bits = ['/'] + filename.split('/')[1:]
for i in range(2, len(bits)+1):
component = join(*bits[0:i])
# Resolve symbolic links.
if islink(component):
resolved = os.readlink(component)
(dir, file) = split(component)
resolved = normpath(join(dir, resolved))
resolved = _resolve_link(component)
if resolved is None:
# Infinite loop -- return original component + rest of the path
return join(*([component] + bits[i:]))
else:
newpath = join(*([resolved] + bits[i:]))
return realpath(newpath)
return filename
def _resolve_link(path):
"""Internal helper function. Takes a path and follows symlinks
until we either arrive at something that isn't a symlink, or
encounter a path we've seen before (meaning that there's a loop).
"""
paths_seen = []
while islink(path):
if path in paths_seen:
# Already seen this path, so we must have a symlink loop
return None
paths_seen.append(path)
# Resolve where the link points to
resolved = os.readlink(path)
if not abspath(resolved):
dir = dirname(path)
path = normpath(join(dir, resolved))
else:
path = normpath(resolved)
return path
supports_unicode_filenames = False

View File

@ -29,6 +29,10 @@ Extension modules
Library
-------
- Bug #930024: posixpath.realpath() now handles infinite loops in symlinks by
returning the last point in the path that was not part of any loop. Thanks
AM Kuchling.
- Bug #980327: ntpath not handles compressing erroneous slashes between the
drive letter and the rest of the path. Also clearly handles UNC addresses now
as well. Thanks Paul Moore.