diff options
author | Dimitry Ivanov <dimitry@google.com> | 2016-05-17 23:06:21 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-05-17 23:06:21 +0000 |
commit | e17c2efc4c6a49c5c02061d90b9d5384c94eddce (patch) | |
tree | 9f23d8f2f73ab9ff03da5ab56f8bc047e62660ae /libnativeloader | |
parent | 666d9aa507a8118a54146f08c6a4dad02773868d (diff) | |
parent | 3457aba39480e85d582dd6890c4c72e418958782 (diff) | |
download | system_core-e17c2efc4c6a49c5c02061d90b9d5384c94eddce.tar.gz system_core-e17c2efc4c6a49c5c02061d90b9d5384c94eddce.tar.bz2 system_core-e17c2efc4c6a49c5c02061d90b9d5384c94eddce.zip |
Merge "Set parent namespace for linker-namespaces" am: ac50d0cc57
am: 3457aba394
* commit '3457aba39480e85d582dd6890c4c72e418958782':
Set parent namespace for linker-namespaces
Change-Id: I20ea9239e95377894f477c33cf65bc7da7ad1e5a
Diffstat (limited to 'libnativeloader')
-rw-r--r-- | libnativeloader/dlext_namespaces.h | 3 | ||||
-rw-r--r-- | libnativeloader/native_loader.cpp | 28 |
2 files changed, 29 insertions, 2 deletions
diff --git a/libnativeloader/dlext_namespaces.h b/libnativeloader/dlext_namespaces.h index ca9e61979..13a44e2bf 100644 --- a/libnativeloader/dlext_namespaces.h +++ b/libnativeloader/dlext_namespaces.h @@ -83,7 +83,8 @@ extern struct android_namespace_t* android_create_namespace(const char* name, const char* ld_library_path, const char* default_library_path, uint64_t type, - const char* permitted_when_isolated_path); + const char* permitted_when_isolated_path, + android_namespace_t* parent); __END_DECLS diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index f1858904a..3c929d8c1 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -97,11 +97,14 @@ class LibraryNamespaces { namespace_type |= ANDROID_NAMESPACE_TYPE_SHARED; } + android_namespace_t* parent_ns = FindParentNamespaceByClassLoader(env, class_loader); + ns = android_create_namespace("classloader-namespace", nullptr, library_path.c_str(), namespace_type, - permitted_path.c_str()); + permitted_path.c_str(), + parent_ns); if (ns != nullptr) { namespaces_.push_back(std::make_pair(env->NewWeakGlobalRef(class_loader), ns)); @@ -205,6 +208,29 @@ class LibraryNamespaces { return initialized_; } + jobject GetParentClassLoader(JNIEnv* env, jobject class_loader) { + jclass class_loader_class = env->FindClass("java/lang/ClassLoader"); + jmethodID get_parent = env->GetMethodID(class_loader_class, + "getParent", + "()Ljava/lang/ClassLoader;"); + + return env->CallObjectMethod(class_loader, get_parent); + } + + android_namespace_t* FindParentNamespaceByClassLoader(JNIEnv* env, jobject class_loader) { + jobject parent_class_loader = GetParentClassLoader(env, class_loader); + + while (parent_class_loader != nullptr) { + android_namespace_t* ns = FindNamespaceByClassLoader(env, parent_class_loader); + if (ns != nullptr) { + return ns; + } + + parent_class_loader = GetParentClassLoader(env, parent_class_loader); + } + return nullptr; + } + bool initialized_; std::vector<std::pair<jweak, android_namespace_t*>> namespaces_; std::string public_libraries_; |