summaryrefslogtreecommitdiffstats
path: root/libnativeloader
diff options
context:
space:
mode:
authorDimitry Ivanov <dimitry@google.com>2016-05-17 23:06:21 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-05-17 23:06:21 +0000
commite17c2efc4c6a49c5c02061d90b9d5384c94eddce (patch)
tree9f23d8f2f73ab9ff03da5ab56f8bc047e62660ae /libnativeloader
parent666d9aa507a8118a54146f08c6a4dad02773868d (diff)
parent3457aba39480e85d582dd6890c4c72e418958782 (diff)
downloadsystem_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.h3
-rw-r--r--libnativeloader/native_loader.cpp28
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_;