diff options
author | Dimitry Ivanov <dimitry@google.com> | 2017-05-01 15:12:49 -0700 |
---|---|---|
committer | Dimitry Ivanov <dimitry@google.com> | 2017-05-25 10:30:55 -0700 |
commit | 882cad2d87fc003ced61ddf9d68f8810ec8c4b3f (patch) | |
tree | e8c320809a6b684cfaa5bb1174e6b514b4763a78 /libnativeloader | |
parent | 102eb90837d1e30fe9603b046e351c28cbaebbd9 (diff) | |
download | core-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.h | 2 | ||||
-rw-r--r-- | libnativeloader/native_loader.cpp | 51 |
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); }; |