Kaydet (Commit) f50299c3 authored tarafından Brett Cannon's avatar Brett Cannon

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

the loop starts.

Closes bug #930024.  Thanks AM Kuchling.
üst 711e7d97
......@@ -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])
if islink(component):
resolved = os.readlink(component)
(dir, file) = split(component)
resolved = normpath(join(dir, resolved))
newpath = join(*([resolved] + bits[i:]))
return realpath(newpath)
# Resolve symbolic links.
if islink(component):
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
......@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment