[Python-checkins] python/dist/src/Lib posixpath.py, 1.62.6.1, 1.62.6.2

bcannon at users.sourceforge.net bcannon at users.sourceforge.net
Sun Jul 11 00:58:34 CEST 2004


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17214/Lib
Modified Files:
 Tag: release23-maint
	posixpath.py 
Log Message:
posixpath.realpath() now detects loops from symlinks and returns the longest
path before recursion.
Index: posixpath.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/posixpath.py,v
retrieving revision 1.62.6.1
retrieving revision 1.62.6.2
diff -C2 -d -r1.62.6.1 -r1.62.6.2
*** posixpath.py	12 May 2004 03:47:01 -0000	1.62.6.1
--- posixpath.py	10 Jul 2004 22:58:31 -0000	1.62.6.2
***************
*** 409,420 ****
 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)
 
 return filename
 
 supports_unicode_filenames = False
--- 409,444 ----
 for i in range(2, len(bits)+1):
 component = join(*bits[0:i])
! # 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


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /