From: Zac Medico Date: Sat, 26 Jul 2008 11:33:18 +0000 (-0000) Subject: Fix LinkageMap.findConsumers() to check whether the master link for a lib X-Git-Tag: v2.2_rc4~27 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=5036b05df01cea1911a8c431b18cedce1423f7c2;p=portage.git Fix LinkageMap.findConsumers() to check whether the master link for a lib providing a given soname actually points to that lib. If there is another version of this lib with the same soname and the master link points to that other version, this lib will be shadowed and won't have any consumers. By eliminating false, positives this way, we avoid the following state after upgrade from media-libs/mesa-7.0.3 to media-libs/mesa-7.1_rc3: # scanelf -S /usr/lib64/libGLU.so* TYPE SONAME FILE ET_DYN libGLU.so.1 /usr/lib64/libGLU.so ET_DYN libGLU.so.1 /usr/lib64/libGLU.so.1 ET_DYN libGLU.so.1 /usr/lib64/libGLU.so.1.3 ET_DYN libGLU.so.1 /usr/lib64/libGLU.so.1.3.070003 ET_DYN libGLU.so.1 /usr/lib64/libGLU.so.1.3.070100 <- shadowed lib Thanks to Diego "Flameeyes" Pettenò for reporting this issue. svn path=/main/trunk/; revision=11200 --- diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 61d08f83c..8e51a1591 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -264,6 +264,24 @@ class LinkageMap(object): obj = realpath(obj) if obj not in self._obj_properties: raise KeyError("%s not in object list" % obj) + + # If there is another version of this lib with the + # same soname and the master link points to that + # other version, this lib will be shadowed and won't + # have any consumers. + arch, needed, path, soname = self._obj_properties[obj] + obj_dir = os.path.dirname(obj) + master_link = os.path.join(obj_dir, soname) + try: + master_st = os.stat(master_link) + obj_st = os.stat(obj) + except OSError: + pass + else: + if (obj_st.st_dev, obj_st.st_ino) != \ + (master_st.st_dev, master_st.st_ino): + return set() + rValue = set() for soname in self._libs: for arch in self._libs[soname]: @@ -273,7 +291,7 @@ class LinkageMap(object): path = [realpath(y) for y in path+self._defpath] if soname[0] == os.sep and realpath(soname) == realpath(obj): rValue.add(x) - elif realpath(os.path.dirname(obj)) in path: + elif realpath(obj_dir) in path: rValue.add(x) return rValue