From: Zac Medico Date: Tue, 6 Sep 2011 18:34:57 +0000 (-0700) Subject: merge: avoid abssymlink readlink call X-Git-Tag: v2.2.0_alpha54~1 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=eab5a6ee1abff1fbf142cf1558ba940b6d4b270a;p=portage.git merge: avoid abssymlink readlink call This will avoid the "OSError: [Errno 2] No such file or directory" that is triggered inside abssymlink if the merge encoding is not ascii or utf_8, as shown in bug #382021. --- diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 901ea2c96..d73ea6d5e 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -391,9 +391,12 @@ def getcwd(): return "/" getcwd() -def abssymlink(symlink): +def abssymlink(symlink, target=None): "This reads symlinks, resolving the relative symlinks, and returning the absolute." - mylink=os.readlink(symlink) + if target is None: + mylink = target + else: + mylink = os.readlink(symlink) if mylink[0] != '/': mydir=os.path.dirname(symlink) mylink=mydir+"/"+mylink diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index bafe13885..4d0a6dd4c 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -4013,7 +4013,12 @@ class dblink(object): os.unlink(mysrc) os.symlink(myto, mysrc) - myabsto = abssymlink(mysrc) + # Pass in the symlink target in order to bypass the + # os.readlink() call inside abssymlink(), since that + # call is unsafe if the merge encoding is not ascii + # or utf_8 (see bug #382021). + myabsto = abssymlink(mysrc, target=myto) + if myabsto.startswith(srcroot): myabsto = myabsto[len(srcroot):] myabsto = myabsto.lstrip(sep)