Greylist some of internal native libraries

This change is workaround for the http://b/26394120
greylisting the libraries used by some popular apps
to keep them working on dogfood builds. It will
be removed before the release.

Bug: http://b/26394120
Change-Id: I4e588b81da59f6f667aa9d2ef7e715d6607b9a36
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 130e341..e09f74f 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -153,6 +153,62 @@
   nullptr
 };
 
+// TODO(dimitry): This is workaround for http://b/26394120 - it will be removed before the release
+static bool is_greylisted(const char* name) {
+  static const char* const kLibraryGreyList[] = {
+    "libLLVM.so",
+    "libRScpp.so",
+    "libaudioutils.so",
+    "libbacktrace.so",
+    "libbase.so",
+    "libbinder.so",
+    "libc++.so",
+    "libcamera_client.so",
+    "libcamera_metadata.so",
+    "libcommon_time_client.so",
+    "libcrypto.so",
+    "libcutils.so",
+    "libdrmframework.so",
+    "libexpat.so",
+    "libgui.so",
+    "libhardware.so",
+    "libicui18n.so",
+    "libicuuc.so",
+    "libmediautils.so",
+    "libmedia.so",
+    "libnativehelper.so",
+    "libnbaio.so",
+    "libnetd_client.so",
+    "libopus.so",
+    "libpowermanager.so",
+    "libsonivox.so",
+    "libspeexresampler.so",
+    "libpowermanager.so",
+    "libssl.so",
+    "libstagefright_avc_common.so",
+    "libstagefright_enc_common.so",
+    "libstagefright_foundation.so",
+    "libstagefright_omx.so",
+    "libstagefright_yuv.so",
+    "libstagefright.so",
+    "libsync.so",
+    "libui.so",
+    "libunwind.so",
+    "libutils.so",
+    "libvorbisidec.so",
+    nullptr
+  };
+
+  for (size_t i = 0; kLibraryGreyList[i] != nullptr; ++i) {
+    if (strcmp(name, kLibraryGreyList[i]) == 0) {
+      return true;
+    }
+  }
+
+  return false;
+}
+// END OF WORKAROUND
+
 static const ElfW(Versym) kVersymNotNeeded = 0;
 static const ElfW(Versym) kVersymGlobal = 1;
 
@@ -1608,6 +1664,14 @@
     fd = open_library_on_paths(zip_archive_cache, name, file_offset, ns->get_default_library_paths(), realpath);
   }
 
+  // TODO(dimitry): workaround for http://b/26394120 - will be removed before the release
+  if (fd == -1 && ns != &g_default_namespace && is_greylisted(name)) {
+    // try searching for it on default_namespace default_library_path
+    fd = open_library_on_paths(zip_archive_cache, name, file_offset,
+                               g_default_namespace.get_default_library_paths(), realpath);
+  }
+  // END OF WORKAROUND
+
   return fd;
 }
 
@@ -1708,10 +1772,16 @@
   }
 
   if (!ns->is_accessible(realpath)) {
-    // do not load libraries if they are not accessible for the specified namespace.
-    DL_ERR("library \"%s\" is not accessible for the namespace \"%s\"",
-           name, ns->get_name());
-    return false;
+    // TODO(dimitry): workaround for http://b/26394120 - will be removed before the release
+    if (is_greylisted(name)) {
+      DL_WARN("library \"%s\" (\"%s\") is not accessible for the namespace \"%s\" - the access is temporarily granted as a workaround for http://b/26394120",
+              name, realpath.c_str(), ns->get_name());
+    } else {
+      // do not load libraries if they are not accessible for the specified namespace.
+      DL_ERR("library \"%s\" is not accessible for the namespace \"%s\"",
+             name, ns->get_name());
+      return false;
+    }
   }
 
   soinfo* si = soinfo_alloc(ns, realpath.c_str(), &file_stat, file_offset, rtld_flags);