summaryrefslogtreecommitdiffstats
path: root/libnativeloader
diff options
context:
space:
mode:
authorDimitry Ivanov <dimitry@google.com>2017-05-01 15:12:49 -0700
committerDimitry Ivanov <dimitry@google.com>2017-05-25 10:30:55 -0700
commit882cad2d87fc003ced61ddf9d68f8810ec8c4b3f (patch)
treee8c320809a6b684cfaa5bb1174e6b514b4763a78 /libnativeloader
parent102eb90837d1e30fe9603b046e351c28cbaebbd9 (diff)
downloadcore-882cad2d87fc003ced61ddf9d68f8810ec8c4b3f.tar.gz
core-882cad2d87fc003ced61ddf9d68f8810ec8c4b3f.tar.bz2
core-882cad2d87fc003ced61ddf9d68f8810ec8c4b3f.zip
Load vendor public libraries to sphal namespace
Load vendor public libraries to sphal namespace if it exists - preserve old behavior of loading these libraries to default namespace if sphal namespace is not present on the device. Bug: http://b/37410104 Test: cts-tradefed run singleCommand cts --skip-preconditions -m CtsJniTestCases on marlin (with enabled sphal configuration) and on angler where ld.config.txt is not present. Change-Id: Iaa3fa437ba2900acc2e5b9c78039fe1553e4c9dd (cherry picked from commit af0264bbe9f5e1228eb8fb486fa3d0d8e6e8605e)
Diffstat (limited to 'libnativeloader')
-rw-r--r--libnativeloader/include/nativeloader/dlext_namespaces.h2
-rw-r--r--libnativeloader/native_loader.cpp51
2 files changed, 43 insertions, 10 deletions
diff --git a/libnativeloader/include/nativeloader/dlext_namespaces.h b/libnativeloader/include/nativeloader/dlext_namespaces.h
index 912127753..43c932978 100644
--- a/libnativeloader/include/nativeloader/dlext_namespaces.h
+++ b/libnativeloader/include/nativeloader/dlext_namespaces.h
@@ -124,6 +124,8 @@ extern bool android_link_namespaces(android_namespace_t* from,
*/
extern void android_get_LD_LIBRARY_PATH(char* buffer, size_t buffer_size);
+extern android_namespace_t* android_get_exported_namespace(const char* name);
+
__END_DECLS
#endif /* __ANDROID_DLEXT_NAMESPACES_H__ */
diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp
index d9cb90d04..36a2e44bd 100644
--- a/libnativeloader/native_loader.cpp
+++ b/libnativeloader/native_loader.cpp
@@ -83,6 +83,12 @@ static constexpr const char* kPublicNativeLibrariesSystemConfigPathFromRoot =
static constexpr const char* kPublicNativeLibrariesVendorConfig =
"/vendor/etc/public.libraries.txt";
+// The device may be configured to have the vendor libraries loaded to a separate namespace.
+// For historical reasons this namespace was named sphal but effectively it is intended
+// to use to load vendor libraries to separate namespace with controlled interface between
+// vendor and system namespaces.
+static constexpr const char* kVendorNamespaceName = "sphal";
+
// (http://b/27588281) This is a workaround for apps using custom classloaders and calling
// System.load() with an absolute path which is outside of the classloader library search path.
// This list includes all directories app is allowed to access this way.
@@ -170,11 +176,23 @@ class LibraryNamespaces {
return false;
}
- if (!android_link_namespaces(ns, nullptr, public_libraries_.c_str())) {
+ // Note that when vendor_ns is not configured this function will return nullptr
+ // and it will result in linking vendor_public_libraries_ to the default namespace
+ // which is expected behavior in this case.
+ android_namespace_t* vendor_ns = android_get_exported_namespace(kVendorNamespaceName);
+
+ if (!android_link_namespaces(ns, nullptr, system_public_libraries_.c_str())) {
*error_msg = dlerror();
return false;
}
+ if (!vendor_public_libraries_.empty()) {
+ if (!android_link_namespaces(ns, vendor_ns, vendor_public_libraries_.c_str())) {
+ *error_msg = dlerror();
+ return false;
+ }
+ }
+
native_loader_ns = NativeLoaderNamespace(ns);
} else {
native_bridge_namespace_t* ns = NativeBridgeCreateNamespace("classloader-namespace",
@@ -183,16 +201,26 @@ class LibraryNamespaces {
namespace_type,
permitted_path.c_str(),
parent_ns.get_native_bridge_ns());
+
if (ns == nullptr) {
*error_msg = NativeBridgeGetError();
return false;
}
- if (!NativeBridgeLinkNamespaces(ns, nullptr, public_libraries_.c_str())) {
+ native_bridge_namespace_t* vendor_ns = NativeBridgeGetVendorNamespace();
+
+ if (!NativeBridgeLinkNamespaces(ns, nullptr, system_public_libraries_.c_str())) {
*error_msg = NativeBridgeGetError();
return false;
}
+ if (!vendor_public_libraries_.empty()) {
+ if (!NativeBridgeLinkNamespaces(ns, vendor_ns, vendor_public_libraries_.c_str())) {
+ *error_msg = NativeBridgeGetError();
+ return false;
+ }
+ }
+
native_loader_ns = NativeLoaderNamespace(ns);
}
@@ -249,9 +277,6 @@ class LibraryNamespaces {
}
}
- // This file is optional, quietly ignore if the file does not exist.
- ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames);
-
// android_init_namespaces() expects all the public libraries
// to be loaded so that they can be found by soname alone.
//
@@ -266,7 +291,13 @@ class LibraryNamespaces {
soname.c_str(), dlerror());
}
- public_libraries_ = base::Join(sonames, ':');
+ system_public_libraries_ = base::Join(sonames, ':');
+
+ sonames.clear();
+ // This file is optional, quietly ignore if the file does not exist.
+ ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames);
+
+ vendor_public_libraries_ = base::Join(sonames, ':');
}
void Reset() {
@@ -325,7 +356,7 @@ class LibraryNamespaces {
// code is one example) unknown to linker in which case linker uses anonymous
// namespace. The second argument specifies the search path for the anonymous
// namespace which is the library_path of the classloader.
- initialized_ = android_init_anonymous_namespace(public_libraries_.c_str(),
+ initialized_ = android_init_anonymous_namespace(system_public_libraries_.c_str(),
is_native_bridge ? nullptr : library_path);
if (!initialized_) {
*error_msg = dlerror();
@@ -334,7 +365,7 @@ class LibraryNamespaces {
// and now initialize native bridge namespaces if necessary.
if (NativeBridgeInitialized()) {
- initialized_ = NativeBridgeInitAnonymousNamespace(public_libraries_.c_str(),
+ initialized_ = NativeBridgeInitAnonymousNamespace(system_public_libraries_.c_str(),
is_native_bridge ? library_path : nullptr);
if (!initialized_) {
*error_msg = NativeBridgeGetError();
@@ -371,8 +402,8 @@ class LibraryNamespaces {
bool initialized_;
std::vector<std::pair<jweak, NativeLoaderNamespace>> namespaces_;
- std::string public_libraries_;
-
+ std::string system_public_libraries_;
+ std::string vendor_public_libraries_;
DISALLOW_COPY_AND_ASSIGN(LibraryNamespaces);
};