diff options
author | Torne (Richard Coles) <torne@google.com> | 2016-03-14 13:39:18 +0000 |
---|---|---|
committer | Torne (Richard Coles) <torne@google.com> | 2016-03-14 13:39:18 +0000 |
commit | ad75a55a161c28a96c3cf1a2ad6bda28ea5e9799 (patch) | |
tree | c5fb7b7dc687cd3447f3db2afe220ebee982fc69 /chromium/loader/loader.cpp | |
parent | c76c75875b64c4c542ea6d45ec8d99ff7d8218bf (diff) | |
download | webview-ad75a55a161c28a96c3cf1a2ad6bda28ea5e9799.tar.gz |
Load the library using classloader's namespace.android-cts_7.1_r1android-cts-7.1_r9android-cts-7.1_r8android-cts-7.1_r7android-cts-7.1_r6android-cts-7.1_r5android-cts-7.1_r4android-cts-7.1_r3android-cts-7.1_r29android-cts-7.1_r28android-cts-7.1_r27android-cts-7.1_r26android-cts-7.1_r25android-cts-7.1_r24android-cts-7.1_r23android-cts-7.1_r22android-cts-7.1_r21android-cts-7.1_r20android-cts-7.1_r2android-cts-7.1_r19android-cts-7.1_r18android-cts-7.1_r17android-cts-7.1_r16android-cts-7.1_r15android-cts-7.1_r14android-cts-7.1_r13android-cts-7.1_r12android-cts-7.1_r11android-cts-7.1_r10android-cts-7.1_r1android-cts-7.0_r9android-cts-7.0_r8android-cts-7.0_r7android-cts-7.0_r6android-cts-7.0_r5android-cts-7.0_r4android-cts-7.0_r33android-cts-7.0_r32android-cts-7.0_r31android-cts-7.0_r30android-cts-7.0_r3android-cts-7.0_r29android-cts-7.0_r28android-cts-7.0_r27android-cts-7.0_r26android-cts-7.0_r25android-cts-7.0_r24android-cts-7.0_r23android-cts-7.0_r22android-cts-7.0_r21android-cts-7.0_r20android-cts-7.0_r2android-cts-7.0_r19android-cts-7.0_r18android-cts-7.0_r17android-cts-7.0_r16android-cts-7.0_r15android-cts-7.0_r14android-cts-7.0_r13android-cts-7.0_r12android-cts-7.0_r11android-cts-7.0_r10android-cts-7.0_r1android-7.1.2_r9android-7.1.2_r8android-7.1.2_r6android-7.1.2_r5android-7.1.2_r4android-7.1.2_r39android-7.1.2_r38android-7.1.2_r37android-7.1.2_r36android-7.1.2_r33android-7.1.2_r32android-7.1.2_r30android-7.1.2_r3android-7.1.2_r29android-7.1.2_r28android-7.1.2_r27android-7.1.2_r25android-7.1.2_r24android-7.1.2_r23android-7.1.2_r2android-7.1.2_r19android-7.1.2_r18android-7.1.2_r17android-7.1.2_r16android-7.1.2_r15android-7.1.2_r14android-7.1.2_r13android-7.1.2_r12android-7.1.2_r11android-7.1.2_r10android-7.1.2_r1android-7.1.1_r9android-7.1.1_r8android-7.1.1_r7android-7.1.1_r61android-7.1.1_r60android-7.1.1_r6android-7.1.1_r59android-7.1.1_r58android-7.1.1_r57android-7.1.1_r56android-7.1.1_r55android-7.1.1_r54android-7.1.1_r53android-7.1.1_r52android-7.1.1_r51android-7.1.1_r50android-7.1.1_r49android-7.1.1_r48android-7.1.1_r47android-7.1.1_r46android-7.1.1_r45android-7.1.1_r44android-7.1.1_r43android-7.1.1_r42android-7.1.1_r41android-7.1.1_r40android-7.1.1_r4android-7.1.1_r39android-7.1.1_r38android-7.1.1_r35android-7.1.1_r33android-7.1.1_r32android-7.1.1_r31android-7.1.1_r3android-7.1.1_r28android-7.1.1_r27android-7.1.1_r26android-7.1.1_r25android-7.1.1_r24android-7.1.1_r23android-7.1.1_r22android-7.1.1_r21android-7.1.1_r20android-7.1.1_r2android-7.1.1_r17android-7.1.1_r16android-7.1.1_r15android-7.1.1_r14android-7.1.1_r13android-7.1.1_r12android-7.1.1_r11android-7.1.1_r10android-7.1.1_r1android-7.1.0_r7android-7.1.0_r6android-7.1.0_r5android-7.1.0_r4android-7.1.0_r3android-7.1.0_r2android-7.1.0_r1android-7.0.0_r9android-7.0.0_r8android-7.0.0_r7android-7.0.0_r6android-7.0.0_r5android-7.0.0_r4android-7.0.0_r36android-7.0.0_r35android-7.0.0_r34android-7.0.0_r33android-7.0.0_r32android-7.0.0_r31android-7.0.0_r30android-7.0.0_r3android-7.0.0_r29android-7.0.0_r28android-7.0.0_r27android-7.0.0_r24android-7.0.0_r21android-7.0.0_r19android-7.0.0_r17android-7.0.0_r15android-7.0.0_r14android-7.0.0_r13android-7.0.0_r12android-7.0.0_r11android-7.0.0_r10android-7.0.0_r1nougat-releasenougat-mr2.3-releasenougat-mr2.2-releasenougat-mr2.1-releasenougat-mr2-security-releasenougat-mr2-releasenougat-mr2-pixel-releasenougat-mr2-devnougat-mr1.8-releasenougat-mr1.7-releasenougat-mr1.6-releasenougat-mr1.5-releasenougat-mr1.4-releasenougat-mr1.3-releasenougat-mr1.2-releasenougat-mr1.1-releasenougat-mr1-volantis-releasenougat-mr1-security-releasenougat-mr1-releasenougat-mr1-flounder-releasenougat-mr1-devnougat-mr1-cts-releasenougat-mr0.5-releasenougat-dr1-releasenougat-devnougat-cts-releasenougat-bugfix-release
Use the namespace corresponding to a given classloader to load the
native library. This allows the calling code in WebViewFactory to
associate the library with the WebView APK's classloader, preventing it
from being loaded twice in some situations.
Bug: 27189432
Change-Id: I89b21b28ebba4dbb817e519d349a4bb021cc6b10
Diffstat (limited to 'chromium/loader/loader.cpp')
-rw-r--r-- | chromium/loader/loader.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
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")); } } |