diff options
author | Torne (Richard Coles) <torne@google.com> | 2016-03-17 19:30:39 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-03-17 19:30:39 +0000 |
commit | 21f388da0108f9da1e57017e25912b9ac96c2a06 (patch) | |
tree | c5fb7b7dc687cd3447f3db2afe220ebee982fc69 | |
parent | 0bfedb72c0e50743d471d9f6da90abb8625a81a1 (diff) | |
parent | 011a7c713d7af39f6b6269bda46a6b661fc91d1f (diff) | |
download | webview-21f388da0108f9da1e57017e25912b9ac96c2a06.tar.gz |
Load the library using classloader\'s namespace. am: ad75a55
am: 011a7c7
* commit '011a7c713d7af39f6b6269bda46a6b661fc91d1f':
Load the library using classloader's namespace.
-rw-r--r-- | chromium/Android.mk | 1 | ||||
-rw-r--r-- | chromium/loader/loader.cpp | 25 |
2 files changed, 21 insertions, 5 deletions
diff --git a/chromium/Android.mk b/chromium/Android.mk index 102afb1..f200fba 100644 --- a/chromium/Android.mk +++ b/chromium/Android.mk @@ -69,6 +69,7 @@ LOCAL_CFLAGS := \ LOCAL_SHARED_LIBRARIES += \ libdl \ liblog \ + libnativeloader \ LOCAL_MODULE_TAGS := optional diff --git a/chromium/loader/loader.cpp b/chromium/loader/loader.cpp index 87f7226..91c0a21 100644 --- a/chromium/loader/loader.cpp +++ b/chromium/loader/loader.cpp @@ -31,6 +31,7 @@ #include <jni.h> #include <android/dlext.h> +#include <nativeloader/native_loader.h> #include <utils/Log.h> #define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) @@ -45,6 +46,7 @@ jint LIBLOAD_SUCCESS; jint LIBLOAD_FAILED_TO_OPEN_RELRO_FILE; jint LIBLOAD_FAILED_TO_LOAD_LIBRARY; jint LIBLOAD_FAILED_JNI_CALL; +jint LIBLOAD_FAILED_TO_FIND_NAMESPACE; jboolean DoReserveAddressSpace(jlong size) { size_t vsize = static_cast<size_t>(size); @@ -103,17 +105,26 @@ jboolean DoCreateRelroFile(const char* lib, const char* relro) { return JNI_TRUE; } -jint DoLoadWithRelroFile(const char* lib, const char* relro) { +jint DoLoadWithRelroFile(JNIEnv* env, const char* lib, const char* relro, + jobject clazzLoader) { int relro_fd = TEMP_FAILURE_RETRY(open(relro, O_RDONLY)); if (relro_fd == -1) { ALOGE("Failed to open relro file %s: %s", relro, strerror(errno)); return LIBLOAD_FAILED_TO_OPEN_RELRO_FILE; } + android_namespace_t* ns = + android::FindNamespaceByClassLoader(env, clazzLoader); + if (ns == NULL) { + ALOGE("Failed to find classloader namespace"); + return LIBLOAD_FAILED_TO_FIND_NAMESPACE; + } android_dlextinfo extinfo; - extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_USE_RELRO; + extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_USE_RELRO | + ANDROID_DLEXT_USE_NAMESPACE; extinfo.reserved_addr = gReservedAddress; extinfo.reserved_size = gReservedSize; extinfo.relro_fd = relro_fd; + extinfo.library_namespace = ns; void* handle = android_dlopen_ext(lib, RTLD_NOW, &extinfo); close(relro_fd); if (handle == NULL) { @@ -157,7 +168,7 @@ jboolean CreateRelroFile(JNIEnv* env, jclass, jstring lib32, jstring lib64, } jint LoadWithRelroFile(JNIEnv* env, jclass, jstring lib32, jstring lib64, - jstring relro32, jstring relro64) { + jstring relro32, jstring relro64, jobject clazzLoader) { #ifdef __LP64__ jstring lib = lib64; jstring relro = relro64; @@ -172,7 +183,7 @@ jint LoadWithRelroFile(JNIEnv* env, jclass, jstring lib32, jstring lib64, if (lib_utf8 != NULL) { const char* relro_utf8 = env->GetStringUTFChars(relro, NULL); if (relro_utf8 != NULL) { - ret = DoLoadWithRelroFile(lib_utf8, relro_utf8); + ret = DoLoadWithRelroFile(env, lib_utf8, relro_utf8, clazzLoader); env->ReleaseStringUTFChars(relro, relro_utf8); } env->ReleaseStringUTFChars(lib, lib_utf8); @@ -188,7 +199,7 @@ const JNINativeMethod kJniMethods[] = { "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z", reinterpret_cast<void*>(CreateRelroFile) }, { "nativeLoadWithRelroFile", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", + "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)I", reinterpret_cast<void*>(LoadWithRelroFile) }, }; @@ -216,6 +227,10 @@ void RegisterWebViewFactory(JNIEnv* env) { LIBLOAD_FAILED_JNI_CALL = env->GetStaticIntField( clazz, env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_JNI_CALL", "I")); + + LIBLOAD_FAILED_TO_FIND_NAMESPACE = env->GetStaticIntField( + clazz, + env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_TO_FIND_NAMESPACE", "I")); } } |