Only create soname symlinks in global libdirs.
authorZac Medico <zmedico@gentoo.org>
Thu, 30 Jun 2011 03:36:07 +0000 (20:36 -0700)
committerZac Medico <zmedico@gentoo.org>
Thu, 30 Jun 2011 03:36:07 +0000 (20:36 -0700)
This prevents false positives for private libraries installed by
pre-built packages under /opt.

pym/portage/package/ebuild/doebuild.py
pym/portage/util/__init__.py
pym/portage/util/_dyn_libs/LinkageMapELF.py

index 35a0b0ffa9dac7f2117477e5f1c3532b76e02139..4b4eaecad18ed4627600aa98316a5d50649da0de 100644 (file)
@@ -1646,6 +1646,43 @@ def _post_src_install_soname_symlinks(mysettings, out):
                        raise
                return
 
+       libpaths = set(portage.util.getlibpaths(
+               mysettings["ROOT"], env=mysettings))
+       libpath_inodes = set()
+       for libpath in libpaths:
+               libdir = os.path.join(mysettings["ROOT"], libpath.lstrip(os.sep))
+               try:
+                       s = os.stat(libdir)
+               except OSError:
+                       continue
+               else:
+                       libpath_inodes.add((s.st_dev, s.st_ino))
+
+       is_libdir_cache = {}
+
+       def is_libdir(obj_parent):
+               try:
+                       return is_libdir_cache[obj_parent]
+               except KeyError:
+                       pass
+
+               rval = False
+               if obj_parent in libpaths:
+                       rval = True
+               else:
+                       parent_path = os.path.join(mysettings["ROOT"],
+                               obj_parent.lstrip(os.sep))
+                       try:
+                               s = os.stat(parent_path)
+                       except OSError:
+                               pass
+                       else:
+                               if (s.st_dev, s.st_ino) in libpath_inodes:
+                                       rval = True
+
+               is_libdir_cache[obj_parent] = rval
+               return rval
+
        missing_symlinks = []
 
        # Parse NEEDED.ELF.2 like LinkageMapELF.rebuild() does.
@@ -1663,6 +1700,8 @@ def _post_src_install_soname_symlinks(mysettings, out):
                obj, soname = fields[1:3]
                if not soname:
                        continue
+               if not is_libdir(os.path.dirname(obj)):
+                       continue
 
                obj_file_path = os.path.join(image_dir, obj.lstrip(os.sep))
                sym_file_path = os.path.join(os.path.dirname(obj_file_path), soname)
index 31a808b0ce19315e519cedf4233e1fb3255609c1..f877362cdc4f17290d3aff9e1bd8aa6221f3612e 100644 (file)
@@ -1567,11 +1567,12 @@ def find_updated_config_files(target_root, config_protect):
                                        else:
                                                yield (x, None)
 
-def getlibpaths(root):
+def getlibpaths(root, env=None):
        """ Return a list of paths that are used for library lookups """
-
+       if env is None:
+               env = os.environ
        # the following is based on the information from ld.so(8)
-       rval = os.environ.get("LD_LIBRARY_PATH", "").split(":")
+       rval = env.get("LD_LIBRARY_PATH", "").split(":")
        rval.extend(grabfile(os.path.join(root, "etc", "ld.so.conf")))
        rval.append("/usr/lib")
        rval.append("/lib")
index fef75b62c55557a3de5535757978b622ac4ad7a4..4b23421bb98e01a8be455dbe8dedf626ee725e4a 100644 (file)
@@ -175,7 +175,7 @@ class LinkageMapELF(object):
                root = self._root
                root_len = len(root) - 1
                self._clear_cache()
-               self._defpath.update(getlibpaths(self._root))
+               self._defpath.update(getlibpaths(self._root, env=self._dbapi.settings))
                libs = self._libs
                obj_properties = self._obj_properties