diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-07-26 11:33:18 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-07-26 11:33:18 +0000 |
commit | 5036b05df01cea1911a8c431b18cedce1423f7c2 (patch) | |
tree | 75d2748ce264e7733060a01321a7c43dab58c99c | |
parent | 29b86c987aba118e75428fd01b8e4261a3eba685 (diff) | |
download | portage-5036b05df01cea1911a8c431b18cedce1423f7c2.tar.gz portage-5036b05df01cea1911a8c431b18cedce1423f7c2.tar.bz2 portage-5036b05df01cea1911a8c431b18cedce1423f7c2.zip |
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
-rw-r--r-- | pym/portage/dbapi/vartree.py | 20 |
1 files changed, 19 insertions, 1 deletions
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 |